Php 如何设置和使用受保护的静态属性?

Php 如何设置和使用受保护的静态属性?,php,oop,Php,Oop,这是一个我必须使用的抽象类 abstract class Model { protected static $_tableName = false; public static function tableName() { return static::$_tableName; } public static function find($idOrWhere = false, $params = array(), $limit = f

这是一个我必须使用的抽象类

abstract class Model
{
    protected static $_tableName  = false;

    public static function tableName()
    {
        return static::$_tableName;
    }

    public static function find($idOrWhere = false, $params = array(), $limit = false)
    {
        $sql    = "SELECT * FROM " . static::tableName();
我似乎无法在自己的类中设置_tableName、static::tableName()或tableName()

class Payments extends Model {

public function __construct()
{
    $this->_tableName  = 'payments';
}

那没用!它没有将tableName设置为payments。我也不知道如何使用tableName()方法。

您正在尝试以非静态方式访问
\u tableName
(即
$this->\u tableName
),即使您已将其声明为静态

您需要像这样访问它:

self::$_tableName
或者,对于:


总的来说,您应该尽量避免使用静态类,主要是出于测试目的。

静态成员必须在类上访问,而不是在实例上访问:

class Payments extends Model {

  public function __construct()
  {
     Payments::$_tableName  = 'payments';
  }
}
声明为静态的属性不能通过实例化的类对象访问(尽管静态方法可以)

无法使用箭头运算符->通过对象访问静态属性

与任何其他PHP静态变量一样,静态属性只能使用文本或常量初始化;不允许使用表达式

根据这篇材料,你的课程应该以这种方式修改

abstract class Model
{
    protected static $_tableName  = false;

    public static function find($idOrWhere = false, $params = array(), $limit = false)
    {
        $sql = "SELECT * FROM " . self::tableName();
        ...
    }

    private static function tableName()
    {
        if (!static::$_tableName) {
              throw new \RuntimeException('No table name provided');
        }

        return static::$_tableName;
    }

顺便说一句,对象实例化时会调用
\u construct
,您不应该在那里设置任何静态属性值

abstract class Model
{
    protected static $_tableName  = false;

    public static function find($idOrWhere = false, $params = array(), $limit = false)
    {
        $sql = "SELECT * FROM " . self::tableName();
        ...
    }

    private static function tableName()
    {
        if (!static::$_tableName) {
              throw new \RuntimeException('No table name provided');
        }

        return static::$_tableName;
    }
class Payments extends Model {

    protected static $_tableName  = 'payments';
}