从PHP静态类访问全局变量

时间:2014-07-11 19:56:43

标签: php pdo

我试图通过在模型上使用静态方法来折射我的代码,但是我失去了获取Database对象的能力。

<?php
$Database = new PDO(.....);
class MyModel{
    public static function getSomething(){
       $test = $Database->somePDOStuff(..);
       ...
    }
}
echo MyModel::getSomething();
?>

这是一个非常基本的例子,但是MyModel在这里并不知道$ Database。

有关如何让他们相互了解的任何想法吗?

2 个答案:

答案 0 :(得分:1)

在课程方法中使用global

   public static function getSomething(){

       global $Database;
       $test = $Database->somePDOStuff(..);
       //.... 
  }

但是,我会考虑避免这种做法。为什么不将$ dabase设为Database类或MyModel类的静态变量?

更好的是,您可以通过将其传递到函数中来设置一些旧的注入,如:

  echo MyModel::getSomething($Database);

答案 1 :(得分:1)

$Database超出了您的类和函数的范围。考虑将代码更改为更像这样的内容(如下所示)。您将PDO对象发送给该函数,以便它可以访问它。

<?php
$Database = new PDO(.....);
class MyModel{
    public static function getSomething(PDO $pdo){
       $test = $pdo->somePDOStuff(..);
       ...
    }
}
echo MyModel::getSomething($Database);
?>

这是另一种解决方案。在MyModel内设置静态PDO对象。我不建议使用这个解决方案,因为它非常混乱。看看最后的解决方案,它更像是我要去的方向

<?php
    $Database = new PDO(.....);
    class MyModel{
        public static $pdo;
        public static function getSomething(){
           $test = self::$pdo->somePDOStuff(..);
           ...
        }
    }
    MyModel::$pdo = $Database;
    echo MyModel::getSomething();
?>

考虑让您的班级MyModel包含在构造函数中创建的PDO对象。

<?php
    class MyModel{
        private $pdo;
        public function __construct() {
            $this->setPdo(new PDO(.....));
        }
        public static function getSomething(){
           $instance = new self();
           $test = $instance->getPdo()->somePDOStuff(..);
           ...
        }
        public function setPdo(PDO $pdo) {
            $this->pdo = $pdo;
        }
        public function getPdo() {
            return $this->pdo;
        }
    }
    echo MyModel::getSomething();
?>