1

对于一个返回值的非常简单的 PHP 类的方法链接,我有些头疼,有时需要经过解密过程:

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

get方法是返回所在的位置。因此,对第二行上的方法的调用decrypt在当前状态下不会起作用。

我可以做些什么来设置该get方法仅在没有链接到它时才返回,或者重构此代码的最佳方法是什么?

4

4 回答 4

2

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

您可以做的是将一个附加参数传递给 get() 方法,指示它是否应该返回一个值,或者使用解密方法的对象。

$key = $dataset->get('key');
$key2 = $dataset->get('key',true)->decrypt();
于 2011-02-22T15:22:50.843 回答
0

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

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

或者重构此代码的最佳方法是什么?

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

于 2011-02-22T15:21:16.530 回答
0

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

$key2_encrypted = $dataset->get('key');
$key2 = $dataset->decrypt($key2_encrypted);
于 2011-02-22T15:23:27.147 回答
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)。

于 2011-02-24T12:21:30.623 回答