suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Binden Sie benutzerdefinierte Methodenparameter an Klassenattribute

<p>Gibt es innerhalb einer Klasse eine Möglichkeit, ein Klassenattribut an einen Methodenparameter zu binden, sodass bei Strg+Klick eine bidirektionale Verknüpfung hergestellt wird? </p> <pre class="brush:php;toolbar:false;">class Attachments erweitert das Repository { öffentliche Dokumente $documents; öffentliche Funktion fromDocuments(callable $scope) { $this->scopeOnRepoProperty($scope, 'documents'); } } </pre> <p>Ich meine, in diesem Fall sollte der zweite Parameter „documents“ in der Methode „scopeOnRepoProperty()“ auf die Eigenschaft „$documents“ verweisen. <br /><br />Der breitere Kontext ist: <br />Das Problem besteht darin, dass ein großer Teil des Codes sehr ähnlich ist, d. h. die meisten ScopeXXX/fromXXX-Methoden tun etwas Ähnliches, d. h. Eigenschaften-Repository wird als Parameter an die Methode übergeben. Im obigen Beispiel würde beispielsweise $scope($this->documents) ausgeführt. Wenn $this->documents nicht initialisiert würde, würde außerdem eine neue Instanz erstellt. <br /><br />Der Code sieht also so aus:</p><p><br /></p> <pre class="brush:php;toolbar:false;">öffentliche Funktion fromDocuments(callable $scope) { if (!isset($this->documents)) { $this->documents = new Documents(); } $scope($this->documents); } </pre> <p>Ich wollte vermeiden, jedes Mal eine if-Anweisung zu schreiben, ein neues Objekt zu erstellen und eine Methode aufzurufen, also dachte ich, ich könnte es mit einer Methode schaffen, die ein aufrufbares Objekt, einen Eigenschaftsnamen und eine Typreflexion akzeptiert Klassenname. </p><p>Der Code läuft einwandfrei, aber leider verliere ich durch diesen Ansatz die Bindung an diese Eigenschaften. In früheren Versionen war es $this->documents, daher war der Link vorhanden, aber das ist nicht mehr der Fall. </p><p>Ich würde gerne wissen, ob es eine Möglichkeit gibt, dies zu erreichen. Irgendwelche Ideen? </p><p><br /></p>
P粉364642019P粉364642019533 Tage vor565

Antworte allen(1)Ich werde antworten

  • P粉135799949

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

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

    这样引用既包括属性,也包括您想在那里使用的类。这通常比使用表示两者的字符串更好(并且还丢失了对具体属性和具体类名的引用)。

    您在这里所做的也被称为延迟初始化。它的问题是在类中使用了 new 关键字,导致代码难以测试。尽管如此,这仍然是对使用字符串的改进。

    您可能还对 PhpStorm 中的新 @mixin


    这可能让您省略可调用对象的注入,但对于您通过此方法实现的具体目标我并不完全清楚,所以这只是一个额外的提示,可能不符合您的需求。

    参考资料:


    Antwort
    0
  • StornierenAntwort