PHP कैसे &$this
की व्याख्या करता है? इसकी अनुमति क्यों है?
मैं निम्नलिखित प्रश्नों के साथ इस प्रश्न पर आया, जो PHP 7.1 और 7.2 में एक बग की तरह दिखता है। यह &$this
संदर्भ और क्रॉस-नेमस्पेस कॉल और call_user_func_array
के साथ होता है। मुझे लगता है कि &$this
बहुत अजीब है और इसकी अनुमति नहीं दी जानी चाहिए, लेकिन वर्डप्रेस उदाहरण के लिए इसका उपयोग करता है।
<?php
namespace N {
function callNeedRef($a) {
var_dump($a);
call_user_func_array('needRef', $a);
}
}
namespace {
function needRef(&$r) { }
function callNeedRef($a) {
var_dump($a);
call_user_func_array('needRef', $a);
}
class C {
function f() {
$a = $this;
callNeedRef(array(&$a)); // no warning (expected), OK!
N\callNeedRef(array(&$a)); // no warning (expected), OK!
callNeedRef(array(&$this)); // no warning (expected), but 7.1,7.2: var_dump prints no '&'
N\callNeedRef(array(&$this)); // 7.1,7.2: warn and var_dump prints no '&'
}
}
echo "<pre>";
echo phpversion() . PHP_EOL;
$o = new C();
$o->f();
}
और इसके उत्पादन:
7.2.0RC2
array(1) {
[0]=>
&object(C)#1 (0) {
}
}
array(1) {
[0]=>
&object(C)#1 (0) {
}
}
array(1) {
[0]=>
object(C)#1 (0) {
}
}
array(1) {
[0]=>
object(C)#1 (0) {
}
}
Warning: Parameter 1 to needRef() expected to be a reference, value given in reftest.php on line 6
जैसा कि पहले ही कोड में कहा गया है, दो पिछले var_dump
रों न संदर्भ के रूप में वस्तु को चिह्नित
इस कोड पर विचार करें। और अंतिम कॉल भी चेतावनी के रूप में पैदा करता है।
पीएचपी स्रोत कोड पर गौर करने के लिए। यहां सभी PHP संस्करणों में क्या होता है: https://3v4l.org/8Ftbh#output –