搜索

首页  >  问答  >  正文

将自定义方法的参数绑定到类属性上

<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粉364642019514 天前552

全部回复(1)我来回复

  • P粉135799949

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

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

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

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

    您可能还对 PhpStorm 中的新 @mixin


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

    参考资料:


    回复
    0
  • 取消回复