我在哪里必须使用& PHP中的运算符?

时间:2009-11-18 08:19:44

标签: java php

几年前,我曾经使用PHP,PHP中有很多变化,特别是在OOP部分。

当时有必要在多个地方使用&运算符,尤其是在处理对象实例时(OOP非常简陋),以避免复制对象实例。

使用PHP 5.2与4.0相比似乎有很多改进,我有点困惑。

我什么时候必须在PHP中使用&运算符来避免Java程序员的任何令人不快的意外?

示例:

$a = (&)new MyClass();    //Necessary?

function factoryMethod() {
  $a = (&)new MyClass();  //Necessary?
  return (&) $a;          //Necessary?
}

// Other cases?!

编辑:我的示例偶然不需要&运算符。但我需要它在哪里?

4 个答案:

答案 0 :(得分:5)

简而言之:在你的例子中没有。

如果我们正在处理objects,您根本不必使用reference operator

如果您正在处理其他数据类型,则最常见的参考操作是:

Passing by Reference

function foo(&$var)
{
    $var++;
}

$a=5;
foo($a);
// $a is 6 here

Returning References

class foo {
    public $value = 42;

    public function &getValue() {
        return $this->value;
    }
}

$obj = new foo;
$myValue = &$obj->getValue(); // $myValue is a reference to $obj->value, which is 42.
$obj->value = 2;
echo $myValue; // prints the new value of $obj->value, i.e. 2.

Looping with foreach

$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}
// $arr is now array(2, 4, 6, 8)
unset($value); // break the reference with the last element

请注意,如果您的代码再次在下游使用unset(),则最后$value - 调用非常重要。

而第一种情况(通过引用传递)比第二种情况更常见,例如特别是在处理数组时:

$array = array(1, 2, 3, 4);
function modifyArray(&$data)
{
    unset($data[1]);
}
modifyArrax($array);
// $array = array(0 => 1, 2 => 3, 3 => 4)

答案 1 :(得分:4)

除非你需要,否则基本上不要使用&运算符(并且尽量不要需要)。你的例子都不需要它。

PHP中的所有对象都是通过引用传递的。如果你这样做:

$arr = range(1,4);
func($arr);

function func($arr) {
  unset($arr[3]);
}

它不会修改原始数组,而是将其更改为:

function func(&$arr) {
  unset($arr[3]);
}

它会。而对象:

class A { public $b; }

$a = new A;
$a->b = 3;
func($a);
echo $a->b; // 5

function func($a) {
  $a->b = 5;
}

其他所有内容都是写时复制。

因此,有时使用&运算符的两种情况是:

  1. 关于通过引用传递非对象的函数参数;和
  2. 在循环中修改数组。
  3. (2)的一个例子是:

    $arr = range(1,4);
    foreach ($arr as &$v) {
      $v += 10;
    }
    

    不会修改& $arr

答案 2 :(得分:2)

在PHP 5中,您不需要使用&在您的示例中显示它们的任何位置的运算符。

答案 3 :(得分:0)

我不知道正确的答案...... 但你可以看一下关于oop的php5手册。 可在此处找到:http://nl2.php.net/manual/en/language.oop5.php