PHP:防止链式方法返回?

时间:2011-02-22 15:15:32

标签: php oop method-chaining

对于一个返回值的非常简单的PHP类,我有一些关于方法链的麻烦,有时需要通过解密过程:

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

get方法是返回的存在地。因此,对第二行的decrypt方法的调用不会在其当前状态下工作。

我可以做一些事情来设置get方法只有在没有任何链接的情况下返回,或者什么是重新分解这些代码的最佳方法?

4 个答案:

答案 0 :(得分:2)

get()方法实际上并不知道是否有任何链接到它;但如果get()方法没有返回任何内容(null),PHP会抱怨尝试在非对象上调用decrypt()方法。

你可以做的是将另一个参数传递给get()方法,该方法指示它是应该返回一个值,还是带有decrypt方法的对象。

$key = $dataset->get('key');
$key2 = $dataset->get('key',true)->decrypt();

答案 1 :(得分:0)

  

我可以做些什么来设置get   只在没有的时候返回的方法   链接到它......?

没有。那是不可能的。 (也许使用高度复杂的反射技术,但如果可能的话,那是不切实际的。)

  

或者最好的方法是什么   重新考虑这段代码?

我认为你班级的结构有问题。通常是一种做某事但返回工作实例的方法,改变类/实例的状态,例如通过一个属性,再次可以通过特殊/ getter方法获取。

答案 2 :(得分:0)

$dataset->get('key')必须返回decrypt()是方法的对象。目前尚不清楚您的decrypt()方法属于哪个类。如果它是你的$dataset课程的一部分,那么你需要用两行来称呼它:

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

答案 3 :(得分:0)

根据我目前对该过程的理解,我将采取以下方法:

解密数据的对象是提供服务。这些对象最常传递给

通过构造函数作为协作者:

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)。