PHP 5.4通话时间通过引用 - 易于修复吗?


Answers

PHP和引用有点不直观。 如果在适当的位置使用适当的引用,可以提供较大的性能改进或避免非常难看的解决方法和不寻常的代码。

以下将产生一个错误:

 function f(&$v){$v = true;}
 f(&$v);

 function f($v){$v = true;}
 f(&$v);

这些都不能失败,因为他们可以遵循下面的规则,但毫无疑问已被删除或禁用,以防止大量的遗留混淆。

如果他们确实有效,两者都涉及冗余转换为引用,第二个也涉及冗余转换回范围内包含的变量。

第二个过去有可能允许将引用传递给那些不打算使用引用的代码。 这对可维护性来说非常难看。

这将无能为力:

 function f($v){$v = true;}
 $r = &$v;
 f($r);

更具体地说,它将参考变回正常变量,因为您没有要求参考。

这将工作:

 function f(&$v){$v = true;}
 f($v);

这看到你正在传递一个非引用,但想要一个引用,所以把它变成一个引用。

这意味着你不能将一个引用传递给一个函数,其中一个引用没有被明确要求使它成为PHP对传递类型严格要求的少数几个领域之一,在这种情况下,它更像是一个元类型。

如果你需要更多的动态行为,这将工作:

 function f(&$v){$v = true;}
 $v = array(false,false,false);
 $r = &$v[1];
 f($r);

在这里它看到你想要一个参考,并且已经有了一个参考,所以不用理会。 它也可能将参考链接起来,但我怀疑这一点。

Question

有什么方法可以轻松解决这个问题,还是我真的需要重写所有的遗留代码?

PHP致命错误:通过引用的呼叫时间已在第30行中删除

随着变量作为整个代码中的引用传递到函数中,这种情况无处不在。





Tags