方法更改和重复使用同一类

问题描述

| 我有以下课程:
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实例的情况下将变量与每个实例分开呢?     

解决方法

        如果您要让DB成为某种数据库连接对象(我想是的),那么多个实例可能不是最佳选择。也许这样的事情可能是您正在尝试做的事情:
$db = new DB(); 
$foo = $db->load(\'foo\')->get();
$fum = $db->load(\'fum\')->get();
echo $foo . \"<br>\";
echo $fum . \"<br>\";
如果我认为您尝试做的是正确的,最好将get逻辑从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>\";
    ,        为了使它与每个实例分离,根据定义,您需要创建一个新实例...尽管可以使用
load()
方法进行操作。除了返回
$this
,您还可以返回配置为所需方式的
new DB()
。然后将方法设为静态。 这就是所谓的工厂模式。     ,        您在代码中遇到的内容类似于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()
时,创建一个新对象并返回该对象,而不是您当前所在的对象。