【问题标题】:Transfer of an instanced object into a class将实例化对象转移到类中
【发布时间】:2019-02-07 02:47:15
【问题描述】:

我想知道将实例化对象转移到另一个类以供本地使用的最佳方法是什么。我也很好奇这是否会对内存使用产生影响。

我想了一下,主要有两种方式:

1.) 通过引用 $GLOBALS 传输实例对象:

class UserLogHandler {
  public function __construct() {
    $this->DB = $GLOBALS['DB'];
    $this->Security = $GLOBALS['Security'];
  }
  public function doSomeWork() {
    $this->DB->someMethod;
  }
}

2.) 通过交接转移:

class UserLogHandler($DB,$Security) {
    public function doSomeWork() {
        $DB->someMethod;
    }
}

在我看来,选项 2 可能更适合复杂的环境,尽管我发现选项 1 更有吸引力。无论如何,我更喜欢技术和/或逻辑解释为什么使用一个选项而不是另一个选项。如果还有其他更好的选择,请告诉我。

提前致谢并致以最良好的祝愿, 托马斯

【问题讨论】:

  • 选项 2,每次。如果您需要详细信息,请阅读依赖注入,但它会在各个级别上显着改进您的代码。如果你曾经写过 globals 这个词,那你就错了。
  • 亲爱的 iainn,谢谢。将使用适当的注射代替!

标签: php object transfer globals


【解决方案1】:

这确实是一个好问题。我会说这取决于你的需要。让我们一一分析您的选择。

在开始之前,请记住您的对象应该始终是一个完整的对象。它不应该有不完整的状态。更多了解可以参考这篇文章https://matthiasnoback.nl/2018/07/objects-should-be-constructed-in-one-go/

1.) 通过引用 $GLOBALS 传输实例对象:

您绝不能使用这样的方法,因为它们会造成混淆。 $GLOBALS 无法告诉您特定变量的创建位置和方式,因此您永远无法确定该变量是否存在或它包含什么。我会建议你使用依赖注入来实现它

use DB;
use Security;

class UserLogHandler
{
    public function __construct(DB $DB, Security $Security)
    {
        $this->DB = $DB;
        $this->Security = $Security;
    }

    public function doSomeWork()
    {
        $this->DB->someMethod;
    }

}

了解您现在如何确定 $DB 和 $Security 从何处注入以及它们持有什么。您甚至可以使用 Security $Security 之类的类型指示来强制执行变量类型。

当您的类严重依赖特定变量时,此方法会派上用场。例如模型类总是需要 DB 适配器,或者 PDF 生成器库本质上需要 PDF 类。

2.) 通过交接转移

这可以按您的预期工作,但我认为您在定义它时犯了错误。你需要像下面这样写。

class UserLogHandler
{
    public function doSomeWork($DB, $Security)
    {
        $DB->someMethod;
    }
}

当您只需要特定函数中的特定变量时,此方法会派上用场。例如,就像我们需要从模型中获取某些特定条件的记录一样。这样我们就可以在函数中传值,根据值得到结果。

use DB;
use Security;

class UserLogHandler
{
    public function __construct(DB $DB, $Security)
    {
        $this->DB = $DB;
        $this->Security = $Security;
    }

    public function doSomeWork($value)
    {
        if ($value = 'something') {
            $this->DB->someMethod;
        }
    }

}

如您所见,这两种方法都可以用于共轭。这仅取决于您的要求是什么

【讨论】:

  • 亲爱的hanish,感谢您的体面回复。事实上,定义中有一个明显的错误。感谢指正!我现在明白在这种情况下使用 GLOBALS 似乎是个坏主意。谢谢! ;)
  • @barkeldiho,很高兴知道它对您有所帮助。它是完全回答你的问题还是我错过了什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多