2015-08-09 125 views
0

我在OOP真的很糟糕,我无法解决这个我已经给出的继承代码。访问静态定义表属性

这是泛型模型类的一部分;

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; 
    } 

如何设置的表名在我已经创建 ???类;

class Payments extends Model { 

    //public $_tableName; 

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

} 

我得到一个错误Undefined variable: _tableName in /var/www/html/lib/Local/Models/Payments.php on line 13时,我不把它作为一个参数。当我这样做时出错Cannot redeclare static XXX\Model::$_tableName

UPDATE

当我尝试使用find方法与此抽象模型,它不设置表名;

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

现在我不知道如何设置。它只是忽略了我在班上放置的东西。

回答

1

你有访问类属性时删除$

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

实际上,这是刺激性的,但就是这样PHP语法的作品。

+0

感谢。尽管如此,仍然无法弄清楚如何在他的一种方法中使用它。你能看看我的更新吗? – mikelovelyuk

+0

好的,如果你将方法声明为“static”,那么情况就不同了,因为如果没有实际的对象,你显然不能在方法中使用'$ this'。这实际上会产生一个错误。但是这个问题早已存在:在构造函数中设置表名是没有意义的,因为构造函数是在创建对象时执行的。当你创建一个对象并使用构造函数将表名存储在那个对象中时,那么这些方法应该不是静态的,因为它们不会指向那个对象!我的建议:使用一个对象,不要将这些方法声明为静态。 – arkascha

0

随着static类,你需要使用self关键字类初始化属性:

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

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