几年前,我曾经使用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?!
编辑:我的示例偶然不需要&
运算符。但我需要它在哪里?
答案 0 :(得分:5)
简而言之:在你的例子中没有。
如果我们正在处理objects
,您根本不必使用reference operator。
如果您正在处理其他数据类型,则最常见的参考操作是:
function foo(&$var)
{
$var++;
}
$a=5;
foo($a);
// $a is 6 here
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.
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;
}
其他所有内容都是写时复制。
因此,有时使用&
运算符的两种情况是:
(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