Lier les paramètres de méthode personnalisée aux attributs de classe
P粉364642019
2023-07-28 17:29:03
<p>Au sein d'une classe, existe-t-il un moyen de lier un attribut de classe à un paramètre de méthode afin qu'un lien bidirectionnel soit établi sur Ctrl+clic ? </p>
<pre class="brush:php;toolbar:false;">class Les pièces jointes étendent le référentiel
{
Documents publics $documents;
fonction publique fromDocuments (appelable $ scope)
{
$this->scopeOnRepoProperty($scope, 'documents');
}
}
≪/pré>
<p>Ce que je veux dire, c'est que dans ce cas, le deuxième paramètre documents de la méthode scopeOnRepoProperty() doit faire référence à la propriété $documents. <br /><br />Le contexte plus large est : <br />Le problème est qu'une grande partie du code est très similaire, c'est-à-dire que la plupart des méthodes scopeXXX/fromXXX font quelque chose de similaire, c'est-à-dire un référentiel de propriétés est passé en paramètre à la méthode. Par exemple, dans l'exemple ci-dessus, $scope($this->documents) sera exécuté de plus, si $this->documents n'est pas initialisé, une nouvelle instance sera créée ; <br /><br />Le code ressemble donc à ceci :</p><p><br /></p>
<pre class="brush:php;toolbar:false;">fonction publique fromDocuments(callable $scope)
{
if (!isset($this->documents)) {
$this->documents = new Documents();
}
$scope($this->documents);
}
≪/pré>
<p>Je voulais éviter d'écrire une instruction if, de créer un nouvel objet et d'appeler une méthode à chaque fois, j'ai donc pensé que je pourrais le faire avec une méthode qui accepterait un objet appelable, un nom de propriété et une réflexion de type nom du cours. </p><p>Le code fonctionne correctement, mais malheureusement, à cause de cette approche, je perds la liaison avec ces propriétés. Dans les versions précédentes, il s'agissait de $this->documents, donc le lien était présent, mais ce n'est plus le cas. </p><p>J'aimerais savoir s'il existe un moyen d'y parvenir. Des idées? </p><p><br /></p>
De cette façon, la référence inclut à la fois la propriété et la classe que vous souhaitez y utiliser. C'est généralement mieux que d'utiliser une chaîne représentant les deux (et de perdre également les références aux propriétés concrètes et aux noms de classes concrètes).
Ce que vous faites ici est également connu sous le nom d'initialisation paresseuse. Le problème est que le mot-clé new est utilisé dans la classe, ce qui rend le code difficile à tester. Il s’agit néanmoins d’une amélioration par rapport au travail avec des chaînes.
Vous pourriez également être intéressé par le nouveau @mixin dans PhpStorm
Cela peut vous permettre d'omettre l'injection du callable, mais je ne sais pas exactement ce que vous obtenez exactement avec cette approche, il ne s'agit donc que d'un conseil supplémentaire et peut ne pas répondre à vos besoins.
Référence :