2016-08-08 61 views
0
<?php 

class Foo{ 
    public $basket; 

    public function __construct() 
    { 
     $this->basket = 1; 
    } 

    public function getBasket(){ 
     return $this->basket; 
    } 
} 

class Bar{ 
    public function __construct(&$basket) 
    { 
     $basket++; 
    } 
} 

$newFoo = new Foo(); 
$newBar = new Bar($newFoo->getBasket()); 

echo $newFoo->getBasket(); 

?> 

我希望初始化一个类中的$basket值,并通过另一个类操作相同的变量。不幸的是,我不断收到“注意:只有变量应该通过引用传递”的错误信息。跨两个不同的类别引用相同的变量

问题:如何更改代码以实现此目的?谢谢。

+0

我不会做这样的事情可以修改购物篮内容,这是不容易保持具有独特的篮子参考。我会有一个名为Basket的单独的类。现在,给Foo和Bar提供篮子的相同实例,并且可以根据需要添加它 - 但访问是受控的。 [演示在eval.in](https://eval.in/619687)。而且更容易测试,调试和添加新功能。 –

+0

嗨瑞安。好点,我喜欢你在那里做的。我正在致力于一个MVC在线购物平台。这个问题的目的是弄清楚如何在PHP的不同页面之间共享对象(订单的模型表示)。这是一个单独的问题,我可能会在近期提出。 – taylorswiftfan

+0

[清晰演示为eval.in](https://eval.in/619689) - 整理回声。 –

回答

0

变化

$newBar = new Bar($newFoo->getBasket()); 

$basket = $newFoo->getBasket(); 
$newBar = new Bar($basket); 

第一种方法不起作用,因为PHP没有任何变量,用以容纳你传递到new Bar()结果值,没有什么可以通过引用传递。

第二种方式工作,因为$basket变种是在内存中一个固定的参考,因此它可以通过引用传递到new Bar()

你问的评论:

已经改变了我的代码到你的。 echo $ newFoo-> getBasket();产生1 (我希望2)。

1产生,因为每次调用getBasket()为您提供了类变量的新鲜副本。我传递给new Bar()$basket等于2,但这不是你所呼应的。

如果你想的getBasket()和可变$basket结果是指在内存中相同的参考,你需要做出两个改变:

更改函数声明:

public function &getBasket() 

更改如何将功能结果存储到:

$basket = &$newFoo->getBasket(); 
现在

您的回音会返回2,因为你会在你的代码

See the docs

+0

嗨BeetleJuice,已将我的代码更改为上述您的代码。'echo $ newFoo-> getBasket();'产生'1'(我希望'2')。我能做些什么才能做到这一点? – taylorswiftfan

+0

你正在寻找'Foo'的'$ basket'变量的增量,这是错误的,实际上你需要调用'Bar'的函数来获得你的代码的实际工作或没有。@taylorswiftfan –

+0

@taylorswiftfan你要带提出与原始问题不同的问题(这是关于您所得到的错误)。如果我的代码解决了这个问题,请选择并上传。至于你最后的评论,我已经扩展了我的答案。再看看。 – BeetleJuice

相关问题