访问静态定义表属性

I'm really bad at OOP and I can't work out this inherited code I've been given.

This is part of the generic Model class;

abstract class Model
{  
  protected static $_tableName  = false;
  protected static $_itemName   = false;

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

  public static function itemName()
  {
    return static::$_itemName;
  }

How do I set the tablename in the Class that I have created???;

class Payments extends Model {

  //public $_tableName;  

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

}

I get an error Undefined variable: _tableName in /var/www/html/lib/Local/Models/Payments.php on line 13 when I don't set it as a parameter. and an error Cannot redeclare static XXX\Model::$_tableName when I do.

UPDATE

When I try to use the find method with this abstract Model, it's not setting the tableName;

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

I don't know how to set that now. It just ignores what I have put in my class.

You have to remove the $ when accessing a class property:

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

Indeed this is irritating, but that's the way php syntax works.

With static class you need to use the self keyword to initialize property in class:

class Foo {
  static $bar;
}
Foo::$bar = array(…);

or

class Foo {
  private static $bar;
  static function init()
  {
    self::$bar = array(…);
  }
}
Foo::init();