对于一个返回值的非常简单的 PHP 类的方法链接,我有些头疼,有时需要经过解密过程:
$dataset = new Datacontainer;
$key = $dataset->get('key');
$key2 = $dataset->get('key')->decrypt();
该get
方法是返回所在的位置。因此,对第二行上的方法的调用decrypt
在当前状态下不会起作用。
我可以做些什么来设置该get
方法仅在没有链接到它时才返回,或者重构此代码的最佳方法是什么?
对于一个返回值的非常简单的 PHP 类的方法链接,我有些头疼,有时需要经过解密过程:
$dataset = new Datacontainer;
$key = $dataset->get('key');
$key2 = $dataset->get('key')->decrypt();
该get
方法是返回所在的位置。因此,对第二行上的方法的调用decrypt
在当前状态下不会起作用。
我可以做些什么来设置该get
方法仅在没有链接到它时才返回,或者重构此代码的最佳方法是什么?
get() 方法实际上并不知道是否有任何东西链接到它。但是如果 get() 方法不返回任何内容 (null),PHP 将抱怨尝试在非对象上调用 decrypt() 方法。
您可以做的是将一个附加参数传递给 get() 方法,指示它是否应该返回一个值,或者使用解密方法的对象。
$key = $dataset->get('key');
$key2 = $dataset->get('key',true)->decrypt();
我可以做些什么来设置 get 方法只在没有链接到它时才返回...?
不,那是不可能的。(也许使用高度复杂的反射技术,但如果可能的话,那是不切实际的。)
或者重构此代码的最佳方法是什么?
我认为你的班级结构有问题。通常一个做某事但返回工作实例的方法,改变类/实例的状态,例如通过属性,再次可以通过特殊/getter 方法获取。
$dataset->get('key')
必须返回一个对象,其中decrypt()
是一个方法。目前尚不清楚您的decrypt()
方法属于哪个类。如果它是您班级的一部分,$dataset
那么您需要分两行调用它:
$key2_encrypted = $dataset->get('key');
$key2 = $dataset->decrypt($key2_encrypted);
根据我目前对该过程的理解,我将采取以下方法:
解密数据的对象是提供服务。此类对象最常传入
通过构造函数作为协作者:
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)。