PHP 7:通过引用传递非变量有什么不好?为什么传递函数时会出现通知,而传递数组时会出现致命错误?
PHP 7: Whats bad about passing a non-variable by reference and why a NOTICE if function passed, but an FATAL error if array is passed?
我有以下代码:
$family = cis_resempty(wp_get_post_terms($post->ID,'family'),0);
我收到以下错误:
Notice: Only variables should be passed by reference in
C:\xampp.....xxx.php on line 18
如果我执行以下操作:
$family = cis_resempty(array('a'),0);
我什至得到
Fatal error: Only variables can be passed by reference in
C:\xampp...xxx.php on line 16
函数cis_resempty是这样的(但它来自库):
function cis_resempty(&$var,$key) { ... }
发现如果我在 cis_resempty 的参数列表中删除 &
引用符号,则没有错误。
如果我这样做:
$family = @cis_resempty(wp_get_post_terms($post->ID,'family'),0);
没有通知,一切正常 - 但 Netbeans 说:
Misuse of the error control operator
但是如果我这样做:
$family = @cis_resempty(array('a'),0);
致命错误继续存在。
为什么我可以通过引用传递一个函数并使用错误控制运算符抑制通知,但是如果我传递一个数组我会得到一个致命错误?
为什么通过引用传递非变量不好?
注意:从不 使用 '@'
进行抑制。
Why can I pass a function by reference and suppress the notice with
the error control operator but if I pass an array I get a fatal error?
阅读这里Passing by Reference第一个注意事项:
There is no reference sign on a function call - only on function definitions. Function definitions alone are enough to correctly pass the argument by reference. As of PHP 5.3.0, you will get a warning saying that "call-time pass-by-reference" is deprecated when you use & in foo(&$a);. And as of PHP 5.4.0, call-time pass-by-reference was removed, so using it will raise a fatal error.
PHP 不会 "support" 自 5.4.0 => 在任何情况下你都会得到 E_FATAL
。使用 @
或不使用 @
。对于函数 - 你得到 E_STRICT
。好的。然后,在此处阅读 @
工作更多 Error Control Operators。同样,首先注意:
Note: The @-operator works only on expressions. A simple rule of thumb is: if you can take the value of something, you can prepend the @ operator to it. For instance, you can prepend it to variables, function and include calls, constants, and so forth. You cannot prepend it to function or class definitions, or conditional structures such as if and foreach, and so forth.
试试这个代码(它会发光):
error_reporting(E_ALL);
$arr = [1,2,3,4,5,];
$a_closure = function(){
return [1,2,3,4,5];
};
function a(){
return [1,2,3,4,5];
}
function ref_func(&$input){
foreach($input as &$in){
$in++;
}
}
ref_func($a); // @ref_func($a);
ref_func(a()); // @ref_func($a());
ref_func($a_closure); // @ref_func($a_closure);
// Fatals in both
ref_func([1,2,3,4,5]); // @ref_func([1,2,3,4,5]);
术语"non-variable"指的是程序员无法通过名称引用的任何变量。这些是执行程序在运行时分配的临时变量:函数调用或其他表达式的结果,未分配给命名变量。
仅当通过引用传递的变量被命名时,通过引用传递一些东西才有意义,这样当调用结束时,调用者可以访问通过引用传递给被调用者的变量。
当PHP在编译时遇到函数调用时,space函数调用的结果,函数调用的参数被保留,然后在执行时相对分配到执行框架。当您通过引用传递函数调用的结果时,执行程序能够强制变量的引用行为,因为堆上有 space 并且它可以忽略变量没有名称.. . 这样做通常没有意义,但出于向后兼容的原因仍然存在。
当PHP在编译时遇到文字(数组)时,它会为相对于op数组(函数)本身的数据分配space。由于这种差异,强制文字的引用行为将是危险的,并会导致非常意外的行为:考虑当函数重新进入时会发生什么,并发或其他。
我有以下代码:
$family = cis_resempty(wp_get_post_terms($post->ID,'family'),0);
我收到以下错误:
Notice: Only variables should be passed by reference in C:\xampp.....xxx.php on line 18
如果我执行以下操作:
$family = cis_resempty(array('a'),0);
我什至得到
Fatal error: Only variables can be passed by reference in C:\xampp...xxx.php on line 16
函数cis_resempty是这样的(但它来自库):
function cis_resempty(&$var,$key) { ... }
发现如果我在 cis_resempty 的参数列表中删除 &
引用符号,则没有错误。
如果我这样做:
$family = @cis_resempty(wp_get_post_terms($post->ID,'family'),0);
没有通知,一切正常 - 但 Netbeans 说:
Misuse of the error control operator
但是如果我这样做:
$family = @cis_resempty(array('a'),0);
致命错误继续存在。
为什么我可以通过引用传递一个函数并使用错误控制运算符抑制通知,但是如果我传递一个数组我会得到一个致命错误?
为什么通过引用传递非变量不好?
注意:从不 使用 '@'
进行抑制。
Why can I pass a function by reference and suppress the notice with the error control operator but if I pass an array I get a fatal error?
阅读这里Passing by Reference第一个注意事项:
There is no reference sign on a function call - only on function definitions. Function definitions alone are enough to correctly pass the argument by reference. As of PHP 5.3.0, you will get a warning saying that "call-time pass-by-reference" is deprecated when you use & in foo(&$a);. And as of PHP 5.4.0, call-time pass-by-reference was removed, so using it will raise a fatal error.
PHP 不会 "support" 自 5.4.0 => 在任何情况下你都会得到 E_FATAL
。使用 @
或不使用 @
。对于函数 - 你得到 E_STRICT
。好的。然后,在此处阅读 @
工作更多 Error Control Operators。同样,首先注意:
Note: The @-operator works only on expressions. A simple rule of thumb is: if you can take the value of something, you can prepend the @ operator to it. For instance, you can prepend it to variables, function and include calls, constants, and so forth. You cannot prepend it to function or class definitions, or conditional structures such as if and foreach, and so forth.
试试这个代码(它会发光):
error_reporting(E_ALL);
$arr = [1,2,3,4,5,];
$a_closure = function(){
return [1,2,3,4,5];
};
function a(){
return [1,2,3,4,5];
}
function ref_func(&$input){
foreach($input as &$in){
$in++;
}
}
ref_func($a); // @ref_func($a);
ref_func(a()); // @ref_func($a());
ref_func($a_closure); // @ref_func($a_closure);
// Fatals in both
ref_func([1,2,3,4,5]); // @ref_func([1,2,3,4,5]);
术语"non-variable"指的是程序员无法通过名称引用的任何变量。这些是执行程序在运行时分配的临时变量:函数调用或其他表达式的结果,未分配给命名变量。
仅当通过引用传递的变量被命名时,通过引用传递一些东西才有意义,这样当调用结束时,调用者可以访问通过引用传递给被调用者的变量。
当PHP在编译时遇到函数调用时,space函数调用的结果,函数调用的参数被保留,然后在执行时相对分配到执行框架。当您通过引用传递函数调用的结果时,执行程序能够强制变量的引用行为,因为堆上有 space 并且它可以忽略变量没有名称.. . 这样做通常没有意义,但出于向后兼容的原因仍然存在。
当PHP在编译时遇到文字(数组)时,它会为相对于op数组(函数)本身的数据分配space。由于这种差异,强制文字的引用行为将是危险的,并会导致非常意外的行为:考虑当函数重新进入时会发生什么,并发或其他。