我想知道什么是将实例对象转移到另一个类以供本地使用的最佳方法。我也很好奇这是否在内存使用方面有所不同。
我认为主要有两种方法:
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更有吸引力。无论如何,我宁愿用技术和/或逻辑解释来解释为什么要使用一个选项而不是另一个。如果还有其他更好的选择,请也告诉我。
先谢谢您,并祝您一切顺利, 托马斯
答案 0 :(得分:0)
这确实是一个好问题。我会说这取决于您的需要。让我们一一分析两种选择。
开始之前,请记住您的对象应该始终是一个完整的对象。它不应具有不完整的状态。您可以参考本文以获得更多的了解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;
}
}
}
如您所见,这两种方法都可以结合使用。这仅取决于您的要求