假设您有一个唯一的对象,并且它被所有其他类和函数使用......类似于$application
.
您将如何在函数中访问该对象?
-
在每个函数中使用全局变量:
global $application;
$application->doStuff();
-
创建一个函数,例如application()
将对象实例化为静态变量并返回它;然后在需要访问该对象的任何地方使用此函数:
application()->doStuff();
-
创建一个单例事物,就像对象类中返回唯一实例的静态方法一样,并使用此方法来访问该对象:
Application::getInstance()->doStuff();
-
KingCrunch 和 skwee:将应用程序对象作为参数传递给需要的每个函数/类
...
public function __construct(Application $app, ...){
....
如果还有其他选项,请发布。我想知道这些选项中哪一个是最有效/被认为是“最佳实践”的。
我会将其传递给所有需要的方法。
IE。
function doFoo(Application $app) {
$app->doStuff();
}
全局和单例都被认为是不好的,并且将您的代码束缚得太多,这使得单元测试变得更加困难。
如果您对以下语句回答“是”,则允许您使用单例时有一条规则:
我是否需要向我的应用程序引入全局状态并且我必须拥有给定对象的单个实例并且拥有多个实例会导致错误
如果您对所有 3 个部分的回答都是肯定的,那么您可以使用单例。在任何其他情况下,只需将所有实例传递给所有需要它们的方法即可。如果它们太多,请考虑使用诸如 Context 之类的东西
class Context {
public $application;
public $logger;
....
}
========
$context = new Context();
$context->application = new Application();
$context->logger = new Logger(...);
doFoo($context);
========
function doFoo(Context $context) {
$context->application->doStuff();
$context->logger->logThings();
}
(如果您需要保护数据或操作数据,或者想要使用延迟启动等,则可以使用 getter/setter)。
祝你好运!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)