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

时间:2015-08-09 11:04:15

标签: 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 = false)
    {
        $sql    = "SELECT * FROM " . static::tableName();

我似乎无法在自己的类中设置_tableName,static :: tableName()或tableName();

class Payments extends Model {

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

那没有做任何事情!它没有将tableName设置为付款。我无法弄清楚如何使用方法tableName()。

3 个答案:

答案 0 :(得分:3)

您尝试以非静态方式访问_tableName(即$this->_tablename),即使您已将其声明为静态。

您需要像这样访问它:

self::$_tableName

OR,late static binding

static::$_tableName

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

答案 1 :(得分:1)

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

class Payments extends Model {

  public function __construct()
  {
     Payments::$_tableName  = 'payments';
  }
}

答案 2 :(得分:1)

  

使用实例化的类对象无法访问声明为static的属性(虽然静态方法可以)。

     

使用箭头操作符 - >。

无法通过对象访问静态属性

http://php.net/manual/en/language.oop5.static.php

  

与任何其他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;
    }
class Payments extends Model {

    protected static $_tableName  = 'payments';
}

顺便说一句,__contruct在对象实例化时被调用,你不应该在那里设置任何静态属性值。