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();
    
  • KingCrunch&skwee:将应用程序对象作为参数传递给需要的每个函数/类

    ...
    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或类似的东西编程某种微控制器时。。。