Php 全局vs函数vs静态类方法
假设您有一个唯一的对象,它被所有其他类和函数使用……类似于Php 全局vs函数vs静态类方法,php,class,function,global,Php,Class,Function,Global,假设您有一个唯一的对象,它被所有其他类和函数使用……类似于$application 如何在函数中访问此对象 在每个函数中使用全局变量: global $application; $application->doStuff(); 创建一个函数,如application(),将对象实例化为静态变量并返回它;然后在需要访问对象的任何地方使用此功能: application()->doStuff(); Application::getInstance()->doStuff();
$application
如何在函数中访问此对象
global $application;
$application->doStuff();
application()
,将对象实例化为静态变量并返回它;然后在需要访问对象的任何地方使用此功能:
application()->doStuff();
Application::getInstance()->doStuff();
application()->doStuff();
Application::getInstance()->doStuff();
...
public function __construct(Application $app, ...){
....
如果有其他选择,请张贴。我想知道这些选项中哪一个是最有效的/被认为是“最佳实践”,或者只是把它交给对它感兴趣的人。您提出的所有建议都类似于全局变量,即使您在3个变量中的2个变量中不这么称呼它
在这之前:如果你想说“这不可能,因为一切都需要它”,那么它可能做得太多、做得太多和/或知道得太多。单例、上帝类、单片类等都是反模式的,所以我建议第四种选择:依赖注入。您可以通过工厂在应用程序中创建
应用程序
的实例(如果它没有依赖项,甚至可以创建新的
,但这可能会使以后的事情变得复杂)
然后,任何需要访问应用程序的类都可以通过构造函数将其作为成员获取。我确信不是每个类都需要访问应用程序
。记住德米特定律
如果您需要一些通用功能,如将一个静态字符串转换为另一个,我建议使用php的全局函数(例如,与faux静态类相反)。我相信它们是为这个目的而设计的。我会将它传递给所有需要的方法。
i、 e
全局测试和单例测试都被认为是不好的,并且将代码绑定得太多,这使得单元测试更加困难。
如果您对以下语句回答“是”,则有一条规则允许您使用singleton:
我是否需要向我的应用程序引入全局状态,并且我必须拥有给定对象的单个实例,并且拥有多个实例将导致错误
如果您对所有3个部分的答案都是肯定的,那么您可以使用singleton。在任何其他情况下,只需将所有实例传递给所有需要它们的方法。如果你有太多的内容,考虑使用类似上下文< /P>
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)
祝你好运 你有一个特定的问题,或者你只是想列出一个列表?这是真的,我可以将应用程序作为参数传递给我需要它的每个类的u构造。但我不知道。。。在该类中使用$this->application
看起来有点奇怪,而且我还必须将该参数传递给该类的每个静态方法……使用$this->property
看起来就像访问依赖项一样。关于你的第二个评论:听起来,你也有太多的静态方法。2(我必须有一个给定对象的实例)有点正确:)但是有多个实例会导致程序出错吗?这是a&&B&&C的逻辑陈述,在你的例子中,B是真的,a和C是假的,所以这个陈述是假的:)我真的想不出这个陈述的答案会是真的。也许当我用一个CPU或类似的东西编程某种微控制器时。。。