【问题标题】:PHP OOP: How can I access static field and object?PHP OOP:如何访问静态字段和对象?
【发布时间】:2016-01-27 18:42:39
【问题描述】:

我想在另一个类中调用 getAllPersons(),但收到错误:

致命错误:无法将非静态 Core\Model::$db 重新声明为静态 Models\Person::$db

class Person extends Model {
    protected static $db;
    protected static $table = 'person';


    function __construct() {
        parent::__construct ();
        self::$db = Database::get ();
    }


    public static function getAllPersons() {
        return self::$db->select ( "SELECT personID, firstname, lastname FROM " . PREFIX . self::$table );
        // $db->select is not static
    }
}

另一个.php:

$data ['persons'] = Person::getPersons ();

【问题讨论】:

  • 您扩展了 Model 并将 $db 声明为非静态的。

标签: php oop model-view-controller


【解决方案1】:

错误信息告诉你所有你需要知道的。在您的Model 类中,您有一个变量$db,它被声明为普通属性,而不是静态属性。当您尝试声明另一个 $db 变量,但将其更改为静态时,PHP 会抛出您收到的错误。

【讨论】:

    【解决方案2】:

    问题在于self::$db(例如在您的 getAllPersons 函数中)总是引用在 Person 类(未定义)中声明的 $db。 在您的代码中尝试以下操作(将 self:: 更改为 static::):

    function __construct() {
            parent::__construct ();
            static::$db = Database::get (); 
        }
    

    一旦你初始化你的类的一个对象,前一个将允许构造函数初始化你的 $db var。

    【讨论】:

      【解决方案3】:

      您不能将 Parent 类的非静态(公共)属性或方法扩展为静态,反之亦然
      您必须在您的 Child 类中应用与父类中相同的 访问修饰符 或重命名属性(方法)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-19
        • 2021-03-31
        • 2012-05-31
        • 1970-01-01
        • 2013-06-11
        • 2015-07-12
        相关资源
        最近更新 更多