將自訂方法的參數綁定到類別屬性上
P粉364642019
P粉364642019 2023-07-28 17:29:03
0
1
550
<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粉364642019
P粉364642019

全部回覆(1)
P粉135799949
    $scope($this->documents ??= new Documents());

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

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

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


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

參考資料:


熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板