0

我有以下课程:

class DB {

    private $name;

    public function load($name) {
        $this->name = $name;
        return $this;
    }

    public function get() {
        return $this->name;
    }
}

目前,如果我这样做:

$db = new DB();
echo $db->load('foo')->get() . "<br>";
echo $db->load('fum')->get() . "<br>";

这会输出“foo”然后是“fum”。

但是,如果我这样做:

$db = new DB(); 
$foo = $db->load('foo');
$fum = $db->load('fum');
echo $foo->get() . "<br>";
echo $fum->get() . "<br>";

它总是输出“fum”。

我可以看出它为什么会这样做,但是我怎样才能将变量与每个实例分开,而不必创建一个新的 DB 实例?

4

3 回答 3

2

为了将它与每个实例分开,根据定义,您需要创建一个新实例……您可以在load()方法中执行此操作。而不是返回$this,你可以返回一个new DB()你想要的配置方式。然后将方法设为静态。

这就是所谓的工厂模式

于 2011-06-13T14:56:22.193 回答
2

如果您的意思是 DB 是某种数据库连接对象(我假设您是),那么多个实例可能不是最佳选择。也许这样的事情可能是你想要做的:

$db = new DB(); 
$foo = $db->load('foo')->get();
$fum = $db->load('fum')->get();
echo $foo . "<br>";
echo $fum . "<br>";

如果我认为您尝试做的事情是正确的,最好将您的获取逻辑从 DB 类分离到它自己的 Record 类中。

class Record {
    function __construct($name) {
        $this->name = $name;
    }

    function get(){
        return $this->name;
    }

    private $name;
}

class DB {

    public function load($name) {
        return new Record($name);
    }
}

$db = new DB(); 
$foo = $db->load('foo');
$fum = $db->load('fum');
echo $foo->get() . "<br>";
echo $fum->get() . "<br>";
于 2011-06-13T14:58:17.877 回答
0

您在代码中遇到的情况类似于 PHP 的通过引用功能。

当您设置第一个变量时,$foo等于 的值$db->name,当您再次调用它以将其设置为“fum”时,您设置的$fum等于$db->name。由于您最后都在呼应它们,因此它们都将是您设置的最后一个值。

试试这个,看看你的结果是否不同。

$db = new DB(); 

$foo = $db->load('foo');
echo $foo->get() . "<br>";

$fum = $db->load('fum');
echo $fum->get() . "<br>";

当你运行时$db->load(),创建一个新对象并返回它而不是你当前所在的对象。

于 2011-06-13T15:02:27.587 回答