Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 同一类的方法更改和重用_Php_Oop_Method Chaining - Fatal编程技术网

Php 同一类的方法更改和重用

Php 同一类的方法更改和重用,php,oop,method-chaining,Php,Oop,Method Chaining,我有以下课程: 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('fo

我有以下课程:

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>";
$db=newdb();
echo$db->load('foo')->get()。“
”; echo$db->load('fum')->get()。“
”;
这将输出“foo”,然后输出“fum”

但是,如果我这样做:

$db = new DB(); 
$foo = $db->load('foo');
$fum = $db->load('fum');
echo $foo->get() . "<br>";
echo $fum->get() . "<br>";
$db=newdb();
$foo=$db->load('foo');
$fum=$db->load('fum');
echo$foo->get()。“
”; echo$fum->get()。“
”;
它总是输出“fum”


我可以理解它为什么会这样做,但是我如何才能在不创建DB的新实例的情况下将变量与每个实例分开呢?

要使变量与每个实例分开,根据定义,您需要创建一个新实例。。。您可以在
load()
方法中执行此操作。您不必返回
$this
,而可以返回一个
新的数据库()
,该数据库按照您想要的方式配置。然后将该方法设置为静态


这就是所谓的。

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


这就是所谓的数据库连接对象。

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

$db = new DB(); 
$foo = $db->load('foo')->get();
$fum = $db->load('fum')->get();
echo $foo . "<br>";
echo $fum . "<br>";
$db=newdb();
$foo=$db->load('foo')->get();
$fum=$db->load('fum')->get();
回声$foo。“
”; 回声$fum。“
”;
如果我认为您试图做的是正确的,那么最好将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>";
课堂记录{
函数构造($name){
$this->name=$name;
}
函数get(){
返回$this->name;
}
私人$name;
}
DB类{
公共函数加载($name){
返回新记录($name);
}
}
$db=新的db();
$foo=$db->load('foo');
$fum=$db->load('fum');
echo$foo->get()。“
”; echo$fum->get()。“
”;
如果您想让DB成为某种数据库连接对象(我假设您是这样),那么多个实例可能不是最佳选择。也许你正试图做的就是这样的事情:

$db = new DB(); 
$foo = $db->load('foo')->get();
$fum = $db->load('fum')->get();
echo $foo . "<br>";
echo $fum . "<br>";
$db=newdb();
$foo=$db->load('foo')->get();
$fum=$db->load('fum')->get();
回声$foo。“
”; 回声$fum。“
”;
如果我认为您试图做的是正确的,那么最好将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>";
课堂记录{
函数构造($name){
$this->name=$name;
}
函数get(){
返回$this->name;
}
私人$name;
}
DB类{
公共函数加载($name){
返回新记录($name);
}
}
$db=新的db();
$foo=$db->load('foo');
$fum=$db->load('fum');
echo$foo->get()。“
”; echo$fum->get()。“
”;
您在代码中的体验与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=newdb();
$foo=$db->load('foo');
echo$foo->get()。“
”; $fum=$db->load('fum'); echo$fum->get()。“
”;

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

您在代码中体验到的类似于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=newdb();
$foo=$db->load('foo');
echo$foo->get()。“
”; $fum=$db->load('fum'); echo$fum->get()。“
”;

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

如果您阅读了我的代码,我已经这样做了,我将尝试重新使用该类,而不必每次都重新启动它,同时保持变量分离。这与您上面的操作略有不同,它使变量保持独立,而不会再次初始化类。是的,但是如果我想使用$foo并调用代码后面的另一个函数,我必须再次运行$db->load!如果您阅读了我的代码,我已经这样做了,我正在尝试重新使用该类,而不必每次都重新启动它,同时保持变量分离。这与您上面所说的略有不同,它使变量保持独立,而不会再次初始化类。是的,但是如果我想使用$foo并调用代码后面的另一个函数,我必须再次运行$db->load!这与通过引用传递有什么关系?据我所见:什么都没有。他只是在代码中操作同一个实例(他从不在任何地方传递它)。你剩下的答案是正确的。省略“类似于”这个词,这与通过引用传递有什么关系?据我所见:什么都没有。他只是在代码中操作同一个实例(他从不在任何地方传递它)。你剩下的答案是对的。省略“类似于”这个词@fire这不是我的意思。。。工厂方法不应该返回单例,而是返回一个新实例。@fire这不是我的意思。。。工厂方法不应该返回一个单例,而是返回一个新实例。