Изменение метода и повторное использование одного и того же класса - PullRequest
0 голосов
/ 13 июня 2011

У меня есть следующий класс:

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".

Я могу понять, почему это происходит, но как я могу сохранить переменную отдельно для каждого экземпляра, не создавая новый экземпляр БД?

Ответы [ 3 ]

2 голосов
/ 13 июня 2011

Если вы имеете в виду, что БД является своего рода объектом подключения к базе данных (как я полагаю, вы), несколько экземпляров могут быть не лучшим выбором. Возможно, что-то вроде этого может быть тем, что вы пытаетесь сделать:

$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>";
2 голосов
/ 13 июня 2011

Чтобы сохранить его отдельно для каждого экземпляра, вам, по определению, нужно создать новый экземпляр ... Вы можете сделать это, хотя в методе load(). Вместо возврата $this вы можете вернуть new DB(), настроенный так, как вы хотите. Затем сделайте метод статическим.

Это то, что называется фабричным шаблоном .

0 голосов
/ 13 июня 2011

То, что вы испытываете в своем коде, похоже на функцию передачи 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(), создайте новый объект и верните его вместо того объекта, в котором вы сейчас находитесь.

...