0

什么是通话时间通行证参考?它有什么作用?

4

5 回答 5

3

不让我使用调用时间引用的问题是我无法更改php内置函数的声明,我在内置函数上使用了很多调用时间引用,我确切地知道这些函数的作用并且我知道不会有任何问题,我需要使用该功能并且我无法重写这些功能,此外我并不总是需要它通过引用传递,我需要在特定情况下使用它,例如:

$rows[] = array_map('array_shift', &$data);

我没有执行 foreach 语句,而是通过将array_mapwith 和数组移位作为回调来节省时间和编码行,问题是(我不知道它是否是一个错误)array_shift没有通过引用获取我的数组(我猜它因为如果你得到一个引用的值并将它扔到另一个没有通过引用获得的函数上,引用的东西只适用于 1 级它会丢失引用,我希望 php 有真正的指针而不是这个引用的东西)因此我需要通过在调用时通过引用数组。

另一个例子

new ArrayObject(&$_POST, ArrayObject::ARRAY_AS_PROPS)

我想my $_POST作为一个数组对象,但是如果我取消设置某些东西,我希望它发生在真实的$_POST,所以我可以用$_SESSIONand做$_GET,我知道在这种情况下我在做什么,如果这是一个不好的做法,我看不到问题有了它,我不得不创建自己的对象来通过引用获取数组,而不是这样做,我为此浪费了一些时间......

关键是,任何语言都允许您将指针传递给最初并非设计为接收指针的函数,也许这是一种不好的做法,但由我决定,不是吗?

不应弃用此功能。

于 2011-02-20T01:47:31.707 回答
1

我假设您的意思是 Call Time Pass By Reference。

在 PHP 中,&操作员将获得变量的引用(stackoverflow 上有很多关于此的信息)

调用时按引用传递是将引用作为参数传递给不带引用的函数

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

在最近的版本中,默认情况下这是关闭的。

它不好的原因是函数(和读取器)不知道哪些参数是引用,哪些不是。它使代码更难遵循。

于 2010-03-30T09:34:14.257 回答
0

PHP手册对此进行了解释:

如今,引用是用函数声明来声明的,如下所示:

function foo (&$bar) {
  // changing $bar changes the original variable
}

但是,当您调用函数时,该语法还允许通过引用传递变量:

foo(&$bar);

已被弃用,因为它被认为是糟糕的风格并且容易出错。(如果一个函数不知道,如果它作用于一个副本或原始变量,你可以想到任何恶作剧发生。)

后一种称为call time pass by reference,因为引用是在函数调用时传递的。(嗯……重言社的第一条规则就是重言社的第一条规则。)

于 2010-03-30T09:34:18.207 回答
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
于 2010-03-30T09:35:50.820 回答
0

在 PHP 5.3.x 中,我们收到警告说调用时按引用传递已被弃用。
但请注意,从 PHP 5.4.0 开始,使用调用时按引用传递是一个致命错误。

注意:函数调用上没有参考符号 - 仅在函数定义上。仅函数定义就足以通过引用正确传递参数。从 PHP 5.3.0 开始,当您在 foo(&$a); 中使用 & 时,您将收到一条警告说“调用时传递引用”已被弃用。从 PHP 5.4.0 开始,调用时传递引用已被删除,因此使用它会引发致命错误。

于 2013-05-19T18:15:37.857 回答