gpt4 book ai didi

php - 全局 vs 函数 vs 静态类方法

转载 作者:可可西里 更新时间:2023-11-01 13:48:00 24 4
gpt4 key购买 nike

假设您有一个唯一的对象,它被所有其他类和函数使用...类似于 $application

你将如何在你的函数中访问这个对象?

  1. 在每个函数中使用一个全局变量:

    global $application;
    $application->doStuff();
  2. 创建一个函数,如 application() 将对象实例化为静态变量并返回它;然后在任何需要访问对象的地方使用这个函数:

    application()->doStuff();
  3. 创建一个单例对象,比如对象类中的一个静态方法,它返回唯一的实例,并使用这个方法访问对象:

    Application::getInstance()->doStuff();
  4. KingCrunch & skwee:将应用程序对象作为参数传递给需要的每个函数/类

    ...
    public function __construct(Application $app, ...){
    ....

如果还有其他选择,请发布。我想知道这些选项中哪一个是最有效的/被认为是“最佳实践”。

最佳答案

我会将它传递给所有需要的方法。即

function doFoo(Application $app) {
$app->doStuff();
}

global 和 singleton 都被认为是不好的并且过多地绑定(bind)了你的代码,这使得单元测试更加困难。如果您对以下陈述回答"is",则允许您使用单例时有一条规则:

Do I need to introduce global state to my application AND I must have a single instance of given object AND having more than one instance will cause error

如果您对所有 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();
}

(如果您需要保护或操作数据,或者如果您想使用惰性初始化等,您可以使用 getters/setters)。

祝你好运!

关于php - 全局 vs 函数 vs 静态类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9201511/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com