搜尋

首頁  >  問答  >  主體

將自訂方法的參數綁定到類別屬性上

<p>在類別內部,有沒有辦法將類別屬性綁定到方法參數,以便在點擊Ctrl 點擊時建立雙向連結? </p> <pre class="brush:php;toolbar:false;">class Attachments extends Repository { public Documents $documents; public function fromDocuments(callable $scope) { $this->scopeOnRepoProperty($scope, 'documents'); } } </pre> <p>我的意思是,在這種情況下,scopeOnRepoProperty() 方法中的第二個參數 documents 應該引用屬性 $documents。 <br /><br />更廣泛的背景是:<br />問題是,程式碼的很大一部分非常類似,即大多數scopeXXX/fromXXX 方法都會執行類似的操作,即將屬性repository 會作為參數傳遞給方法。例如,在上面的範例中,會執行 $scope($this->documents);此外,如果 $this->documents 沒有初始化,將會建立一個新實例。 <br /><br />所以程式碼看起來是這樣的:</p><p><br /></p> <pre class="brush:php;toolbar:false;">public function fromDocuments(callable $scope) { if (!isset($this->documents)) { $this->documents = new Documents(); } $scope($this->documents); } </pre> <p>我想避免每次寫 if 語句、建立新物件和呼叫方法,所以我想到可以使用一個方法來實現,該方法將接受一個可呼叫物件、屬性名稱和類型反射類別名稱。 </p><p>程式碼運作良好,但不幸的是,由於這種方式,我失去了對這些屬性的綁定。在先前的版本中,是 $this->documents,因此連結是存在的,但現在不再存在。 </p><p>我想知道是否有任何方法可以實現這一點。有什麼想法嗎? </p><p><br /></p>
P粉364642019P粉364642019486 天前518

全部回覆(1)我來回復

  • P粉135799949

    P粉1357999492023-07-29 15:10:32

        $scope($this->documents ??= new Documents());
    

    這樣引用既包括屬性,也包括您想在那裡使用的類別。這通常比使用表示兩者的字串更好(並且還丟失了對特定屬性和具體類別名稱的引用)。

    您在這裡所做的也被稱為延遲初始化。它的問題是在類別中使用了 new 關鍵字,導致程式碼難以測試。儘管如此,這仍然是對使用字串的改進。

    您可能也會對 PhpStorm 中的新 @mixin


    這可能會讓您省略可呼叫物件的注入,但對於您透過此方法實現的具體目標我並不完全清楚,所以這只是一個額外的提示,可能不符合您的需求。

    參考資料:


    回覆
    0
  • 取消回覆