marein / php-friend-visibility
PHP中friend关键字的实现。
Requires
- php: >=7.1
Requires (Dev)
- phpunit/phpunit: ^6.0
This package is auto-updated.
Last update: 2024-08-29 03:02:59 UTC
README
目录
前言 / 为什么有这个包?
我喜欢PHP。但有时我会怀念在其他语言中知道的一些功能,比如CSharp、Java或C++。例如,这些功能包括friend类、包可见性等。这里有关于friend类的rfc。我希望有一天能看到这个或一些包可见性在PHP中。希望有一天。
请注意,friend类会破坏封装性。如果你更改了拥有friend类的类,你必须检查你的friend是否使用了某些改变。如果你依赖于反射来访问私有属性,这将成为一个噩梦,因为代码可以从任何地方访问。另一方面,friend在代码中得到了良好的文档。另一个显式代码与反射对比的好例子是访问者模式。你可以用反射实现类似于访问者模式的实现,但这并不具有表现力。如果你向你的树中添加另一个子类,你必须知道哪些类需要更改。使用真正的访问者模式,你实现了一个接口,当新子类被添加到匹配中时,该接口将被扩展。现在,你可以清楚地看到你需要更改哪个访问者并实现新子类的新方法。
所以,希望有一天我们能得到friend类。
请在使用此包之前重新考虑你的设计。很容易破坏封装性,但很难正确地进行面向对象编程。即使你可以轻松地将此包添加到你的工具包中,你的团队中的每个人都应该同意。这不是语言特性,有人可能不知道friend类是什么,或者你的设计意图是什么。就像所有事情一样:在使用之前先思考!
最后但同样重要的是:这种实现的想法不是我的。它是从Patrick van Bergen(大感谢)那里复制的。我过去使用特性而不是基类来处理friend行为。整篇文章都值得一读。实现与我的是相似的。
我创建了这个仓库,因为我想要一个简单的安装过程。
安装
composer require marein/php-friend-visibility
用法
查看示例。它是状态模式的实现。
性能
由于使用了黑魔法,访问私有和受保护的成员当然比直接调用要慢,因为使用了[debug_backtrace,__get,__set,__call,__callStatic]。你可能应该对你的项目进行性能测试。然而,你可以使用以下方法启用生产模式:
<?php \Marein\FriendVisibility\FriendConfiguration::instance()->enableProductionMode();
现在代码应该运行得更快。这是因为所有检查都已禁用。现在使用特质的类中一切都是公开的。因此,这不应该在开发中使用。