gpt4 book ai didi

PHP 引用 `$this`

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:46:25 28 4
gpt4 key购买 nike

PHP 如何解释 &$this ?为什么允许?

我遇到了以下问题,这看起来像是 PHP 7.1 和 7.2 中的错误。它与 &$this 引用和跨命名空间调用以及 call_user_func_array 一起出现。我认为 &$this 很奇怪,不应该被允许,但是 WordPress 使用它作为例子。

考虑这段代码:

<?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 不会将对象标记为引用。最后一个调用甚至产生警告。

最佳答案

val ($this) 不是全局的,范围发生了变化,因此它得到了 ZCAL_STR_COPYied。

case EXTR_OVERWRITE:
/* GLOBALS protection */
if (var_exists && ZSTR_LEN(var_name) == sizeof("GLOBALS")-1 && !strcmp(ZSTR_VAL(var_name), "GLOBALS")) {
break;
}
if (var_exists && ZSTR_LEN(var_name) == sizeof("this")-1 && !strcmp(ZSTR_VAL(var_name), "this")) {
zend_class_entry *scope = zend_get_executed_scope();
if (scope && ZSTR_LEN(scope->name) != 0) {
break;
}
}
ZVAL_STR_COPY(&final_name, var_name);
break;

感谢您让我查看 array.c 的 PHP 源代码:)

关于PHP 引用 `$this`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46484395/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com