通过引用分配失败,语法错误

时间:2011-04-13 18:27:17

标签: php reference

我有一个类实例$obj = new classobj实际上是来自另一个对象的变量,因此它更像$obj1->obj2->obj3 = new class。这使得我的代码有点混乱,所以我想做类似的事情:

$var =& $obj1->obj2->obj3 = new class

然后开始将此实例用作

$var->method()$var->name = 'abc'

当像$var = $obj1->obj2->obj3 = new class一样使用时,它工作得很好,但我正在考虑我可以保存的内存(因为对象非常大并且重复它是不可取的)。我不确定这是一个问题,还是确实需要通过引用分配,或者PHP是否考虑到这一点。

我忘了提及,使用$var =& $obj1->obj2->obj3 = new class结果:

  

解析错误:语法错误,意外'='

5 个答案:

答案 0 :(得分:2)

执行以下操作会将同一对象分配给$obj1->obj2->obj3$var

$obj1->obj2->obj3 = new class;
$var = $obj1->obj2->obj3;

答案 1 :(得分:2)

当你这样做时

$var = new stdClass();
$var2 = $var; 

$var2实际上是对$var的引用。这是因为PHP通过引用传递类。所以你实际上并没有制作新的副本。因此,您可以将其分配给较短的变量并减少输入。

答案 2 :(得分:1)

  • 从PHP 5开始,对象总是通过引用传递。在PHP 4中,$a = new obj;实际上会复制该对象,一次是在创建期间,另一次是在赋值给$a期间,不再是这种情况。
  • PHP中的常规变量是写入时的副本,因此即使$a = 'fred'; $b = $a;也未将内存使用量加倍(尚未)
  • 一般情况下,在遇到问题之前,最好让语言完成工作,而不是试图超越它:)

答案 3 :(得分:0)

字段初始化应该在构造函数或其他类方法中完成。

你可以像往常一样进行初始化(这是一次)

$this->obj2->obj3 = new Class();

之后在外码中你可以做

$var = $obj1->obj2->obj3;
$var->method;

另请注意,使用嵌套对象会使系统复杂化,建议不要进行过深的嵌套。

答案 4 :(得分:0)

要回答有关语法错误的问题,您收到语法错误的原因是因为您尝试将引用分配给不是变量的内容。

此代码:

$var =& $obj1->obj2->obj3 = new class

得到这样的评估(because the = operator has right associativity):

$var =& ($obj1->obj2->obj3 = new class)

不起作用,因为您无法创建对表达式的引用。

至于创建对象的引用而不是副本,这取决于您正在运行的PHP版本。在PHP5中,objects are (effectively) always passed by reference