PHP: Предотвратить возврат цепного метода? - PullRequest
1 голос
/ 22 февраля 2011

У меня есть некоторые головные боли относительно цепочки методов для довольно простого PHP-класса, который возвращает значение, которое иногда необходимо пройти через процесс расшифровки:

$dataset = new Datacontainer;
$key = $dataset->get('key');
$key2 = $dataset->get('key')->decrypt();

Метод get - это место, где возвращаемое значениежизни.Таким образом, вызов метода decrypt во второй строке не будет работать в его текущем состоянии.

Могу ли я сделать что-то, чтобы настроить метод get так, чтобы он возвращался только тогда, когда к нему ничего не приковано, или что было бы лучшим способом перефакторинга этого кода?

Ответы [ 4 ]

2 голосов
/ 22 февраля 2011

Метод get () фактически не знает, привязано ли к нему что-либо или нет; но если метод get () ничего не возвращает (ноль), PHP будет жаловаться на попытку вызова метода decrypt () для необъекта.

Что вы можете сделать, это передать дополнительный аргумент в метод get (), который указывает, должен ли он возвращать значение, или объект с методом расшифровки.

$key = $dataset->get('key');
$key2 = $dataset->get('key',true)->decrypt();
0 голосов
/ 24 февраля 2011

Исходя из моего текущего понимания процесса, я выбрал бы следующий подход:

Объект, который расшифровывает данные, предоставляет услугу. Такие объекты чаще всего передаются в

через конструктора в качестве соавтора:

class ClientClass {
    private $decryptor
    public function __construct(Decryptor $decryptor) {
        $this->decryptor = $decryptor;
    }
    public function doSomethingWith(DataSet $data) {
        $key = $DataSet->getKey();
        // do stuff, decide whether there are encryption needs
        $encryptedKey = $this->decryptor->decrypt($key);
    }
}

Обратите внимание, что здесь есть место для улучшения с получением ключа из набора данных (тогда мне нужно было бы узнать больше о том, что достигается, отсюда и название ClientClass).

0 голосов
/ 22 февраля 2011

$dataset->get('key') должен возвращать объект, в котором decrypt() является методом. Не ясно, к какому классу относится ваш decrypt() метод. Если это часть вашего $dataset класса, вам нужно назвать его в две строки:

$key2_encrypted = $dataset->get('key');
$key2 = $dataset->decrypt($key2_encrypted);
0 голосов
/ 22 февраля 2011

Можно ли что-то сделать, чтобы настроить метод get так, чтобы он возвращался только тогда, когда к нему ничего не приковано ...?

Нет.Это невозможно.(Может быть, с использованием очень сложной технологии отражения, но это не практично, если вообще возможно.)

или каков будет лучший способ перефакторинга этого кода?

Я думаю, что-то не так со структурой вашего класса.Обычно метод, который делает что-то, но возвращает рабочий экземпляр, изменяет состояние класса / экземпляра, например, через атрибут, который снова может быть получен через специальный метод / метод получения.

...