将自定义方法的参数绑定到类属性上
P粉364642019
P粉364642019 2023-07-28 17:29:03
[PHP讨论组]
<p>在类内部,有没有办法将类属性绑定到方法参数,以便在单击Ctrl + 单击时建立双向链接?</p> <pre class="brush:php;toolbar:false;">class Attachments extends Repository { public Documents $documents; public function fromDocuments(callable $scope) { $this-&gt;scopeOnRepoProperty($scope, 'documents'); } } </pre> <p>我的意思是,在这种情况下,scopeOnRepoProperty() 方法中的第二个参数 documents 应该引用属性 $documents。<br /><br />更广泛的背景是:<br />问题是,代码的很大一部分非常类似,即大多数 scopeXXX/fromXXX 方法都会执行类似的操作,即将属性 repository 作为参数传递给方法。例如,在上面的示例中,会执行 $scope($this-&gt;documents);此外,如果 $this-&gt;documents 没有初始化,将创建一个新实例。<br /><br />所以代码看起来是这样的:</p><p><br /></p> <pre class="brush:php;toolbar:false;">public function fromDocuments(callable $scope) { if (!isset($this-&gt;documents)) { $this-&gt;documents = new Documents(); } $scope($this-&gt;documents); } </pre> <p>我想避免每次编写 if 语句、创建新对象和调用方法,于是我想到可以使用一个方法来实现,该方法将接受一个可调用对象、属性名称和类型反射类名。</p><p>代码运行良好,但不幸的是,由于这种方式,我失去了对这些属性的绑定。在先前的版本中,是 $this-&gt;documents,因此链接是存在的,但现在不再存在。</p><p>我想知道是否有任何方法可以实现这一点。有什么想法吗?</p><p><br /></p>
P粉364642019
P粉364642019

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

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

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

您可能还对 PhpStorm 中的新 @mixin


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

参考资料:


热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号