1

値を返す非常に単純な PHP クラスのメソッド チェーンに関して、いくつかの頭痛の種があります。

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

getメソッドは、戻り値が存在する場所です。decryptしたがって、 2 行目のメソッドの呼び出しは、現在の状態では機能しません。

何もチェーンされていない場合にのみメソッドを返すようにセットアップすることはできますか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

プロセスについての私の現在の理解に基づいて、私は次のアプローチを取ります。

データを復号化するオブジェクトがサービスを提供しています。そのようなオブジェクトはほとんどの場合渡されます

コラボレーターとしてコンストラクターを介して:

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 に答える
0

何もチェーンされていない場合にのみ get メソッドを返すように設定することはできますか?

いいえ、それはできません。(非常に複雑なリフレクション技術を使用している可能性がありますが、可能であれば実用的ではありません。)

または、このコードをリファクタリングする最良の方法は何でしょうか?

クラスの構造に問題があると思います。通常、何かを行うが作業インスタンスを返すメソッドは、クラス/インスタンスの状態を変更します。たとえば、属性を介して、特別な/ゲッター メソッドを介して再度取得できます。

于 2011-02-22T15:21:16.530 に答える
0

$dataset->get('key')メソッドを含むオブジェクトを返す必要がありますdecrypt()decrypt()メソッドがどのクラスの一部であるかは明確ではありません。クラスの一部である場合$datasetは、2 行で呼び出す必要があります。

$key2_encrypted = $dataset->get('key');
$key2 = $dataset->decrypt($key2_encrypted);
于 2011-02-22T15:23:27.147 に答える