对于一个返回值的非常简单的PHP类,我有一些关于方法链的麻烦,有时需要通过解密过程:
$dataset = new Datacontainer;
$key = $dataset->get('key');
$key2 = $dataset->get('key')->decrypt();
get
方法是返回的存在地。因此,对第二行的decrypt
方法的调用不会在其当前状态下工作。
我可以做一些事情来设置get
方法只有在没有任何链接的情况下返回,或者什么是重新分解这些代码的最佳方法?
答案 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)。