代码之家  ›  专栏  ›  技术社区  ›  barkeldiho

将实例对象转换为类

  •  0
  • barkeldiho  · 技术社区  · 7 年前

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

    我想,主要有两种方式:

    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更有吸引力。无论如何,我更喜欢一个技术和/或逻辑上的解释,为什么要使用一个选项而不是另一个如果还有其他更好的选择,也请告诉我。

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

    1 回复  |  直到 7 年前
        1
  •  0
  •   hanish singla    7 年前

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

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

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

    你决不能使用这种令人困惑的方法$Guales没有告诉你在哪里和如何创建一个特定的变量,所以你永远不能确定这个变量是否存在或它持有什么。我建议您使用依赖注入

    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;
            }
        }
    
    }
    

    如您所见,这两种方法都可以用于共轭这只取决于你的要求