什么是通话时间通行证参考?它做了什么?
答案 0 :(得分:3)
不让我使用调用时间引用的问题是我无法更改php的内置函数的声明,我在内置函数中使用了很多调用时间引用,我确切知道这些函数是什么我知道不会发生任何恶作剧,我需要使用该功能,我不能重写这些功能,除了它并不总是我需要它通过引用传递,我需要它在特定的情况下,例如:
$rows[] = array_map('array_shift', &$data);
而不是做一个foreach语句,我通过使用array_map
和数组移位作为回调来节省时间和编码行,问题是(我不知道它是否是一个bug){{1}不通过引用得到我的数组(我猜它是因为引用的东西只适用于1级,如果你得到一个引用的值并将它抛出另一个不通过引用得到的函数它会丢失引用,我希望php有真正的指针,而不是这个引用的东西)因此我需要在调用时通过引用传递数组。
另一个例子
array_shift
我希望new ArrayObject(&$_POST, ArrayObject::ARRAY_AS_PROPS)
作为数组对象,但是如果我取消设置某些内容,我希望它发生在真实的my $_POST
上,因此我可以使用$_POST
和{{1}我知道我在这种情况下做了什么,如果这是一个不好的做法,我无法看到它的问题,而不是这样做我必须创建自己的对象,通过引用获得数组,我失去了一些时间....
关键是,任何语言都允许你将指针传递给那些不是为了接收指针而设计的函数,这可能是一个不好的做法,但是由我来决定它,不是吗? / p>
不应弃用此功能。
答案 1 :(得分:1)
我认为您的意思是致电时间通过通过参考。
在PHP中,&
运算符将获得变量的reference(在stackoverflow上有很多关于此的信息)
调用时间pass by reference是您将引用作为参数传递给不参考的函数的地方
function foo($myParam){
}
//Call Time Pass By Reference
foo(&$myArg);
这将在PHP 5.3中发出警告,因为它已被弃用,它将按值传递。正确的方法是改变函数foo以获取参考
function foo(&$myParam){
}
foo($myArg); //myArg is passed by reference
通过引用预先形成呼叫时间的能力由ini设置
控制allow_call_time_pass_reference
在最近的版本中,默认情况下这是关闭的。
不好的原因是函数(和读者)不知道哪些参数是引用而哪些不是引用。它使代码更难以遵循。
答案 2 :(得分:0)
The PHP manual解释道:
如今,使用函数声明声明引用,如下所示:
function foo (&$bar) {
// changing $bar changes the original variable
}
但是,当您调用函数时,语法还允许通过引用传递变量:
foo(&$bar);
和 已被弃用,因为它被认为是错误的样式且容易出错。 (如果某个功能不知道,如果它对副本或原始变量起作用,你可以想到发生任何恶作剧。)
后者称为调用时间按引用传递,因为引用是在函数调用时传递的。 (嗯......重言式俱乐部的第一条规则是重言式俱乐部的第一条规则。)
答案 3 :(得分:0)
在PHP中,当您将值传递给函数时,会将其复制以供函数使用,因此在函数外部值保持不变。这称为值传递。如果要修改函数内部的值,则可以通过引用进行传递(将指针传递给值,而不是值本身)。我通过使用&
字符来完成PHP。
$a = 1;
function b($a) {
$a + 1;
echo $a;
}
echo $a; // print 1
echo b($a); // print 2
echo $a; // $a is still 1
echo b(& $a); // print 2
echo $a; // $a is now 2
如果要传递引用,则有两种方法可以在PHP中执行此操作,其中一种方法(调用时)已弃用。
通过引用传递呼叫时间:
b(& $a);
您应该做的是改变您的功能声明并在那里添加&
。
// declare reference parameter
function b(& $a) {
...
}
b($a); // pass by reference
答案 4 :(得分:0)
在PHP 5.3.x中,我们收到警告,不推荐通过引用传递调用时间 但请注意,从PHP 5.4.0开始,使用调用时通过引用传递是一个致命的错误。
注意:函数调用上没有引用符号 - 仅在函数上 定义。单独的函数定义足以正确传递 参考的论点。从PHP 5.3.0开始,您将收到警告 当你使用& amp;时,不推荐使用“call-time pass-by-reference” 在foo(& $ a);.从PHP 5.4.0开始,调用时传递引用 删除,因此使用它会引发致命错误。