我有一个类实例$obj = new class
。 obj
实际上是来自另一个对象的变量,因此它更像$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
结果:
解析错误:语法错误,意外'='
答案 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)
$a = new obj;
实际上会复制该对象,一次是在创建期间,另一次是在赋值给$a
期间,不再是这种情况。 $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。