抽象类中的PHP静态变量

mic*_*xor 6 php abstract-class static-members

我正在开发一个项目,我希望能够在抽象基类中声明一个静态成员变量.我有一个Model类,一个中间Post类,最后是一个特定于站点的Post类,如下所示:

abstract class Model {
    protected static $_table    = null;
    protected static $_database = null;

    ...
}

abstract class PostModel extends Model {
    public function __construct() {
        if ( !isset(self::$_table) ) {
            self::$_table = 'some_table';
        }

        parent::__construct();
    }

    ...
}

class SitePostModel extends PostModel {
    public function __construct() {
        if ( !isset(self::$_database) ) {
            self::$_database = 'some_database';
        }

        parent::__construct();
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

我想从Model类中明白需要$ _table和$ _database成员.但是,从PostModel类的角度来看,$ _table实际上是静态的,从SitePostModel类的角度来看,$ _database实际上是静态的.

这是实现我的目标的合法方式吗?声明模型本身中的静态变量是否意味着它们应该只对抽象基类存在一次,或者对于实际的实例化类只存在一次?

hak*_*kre 2

这是实现我的目标的合法方式吗?

不。它不起作用,因此它未通过基本的合法性测试。

在模型本身中声明静态变量是否意味着它们对于抽象基类应该只存在一次,或者对于实际实例化的类只存在一次?

静态变量是全局的,它们存在一次。在你的情况下,每个类名。如果您有三个类名,那么您将拥有三个(全局)变量。protected 关键字仅控制三个静态变量的可见性/范围:

<?php

class A {
   protected static $v = 'red';
   public static function get() { return self::$v . ' - ' . static::$v;}
}

class B extends A {
   protected static $v = 'blue';
}

class C extends B {
   protected static $v = 'green';
}

echo C::get(); # red - green
Run Code Online (Sandbox Code Playgroud)