2015-08-09 76 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();