marein/php-friend-visibility

PHP中friend关键字的实现。

1.0.0 2017-09-26 21:03 UTC

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();

现在代码应该运行得更快。这是因为所有检查都已禁用。现在使用特质的类中一切都是公开的。因此,这不应该在开发中使用。