将自定义方法的参数绑定到类属性上
P粉364642019
2023-07-28 17:29:03
<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>
这样引用既包括属性,也包括您想在那里使用的类。这通常比使用表示两者的字符串更好(并且还丢失了对具体属性和具体类名的引用)。
您在这里所做的也被称为延迟初始化。它的问题是在类中使用了 new 关键字,导致代码难以测试。尽管如此,这仍然是对使用字符串的改进。
您可能还对 PhpStorm 中的新 @mixin
这可能让您省略可调用对象的注入,但对于您通过此方法实现的具体目标我并不完全清楚,所以这只是一个额外的提示,可能不符合您的需求。
参考资料: