2016-02-07 88 views
2

嗨,我已經得到以下簡單問題:在構造函數中增加靜態類變量

我想在每次創建對象的實例時增加一個靜態類變量。我已經試過這樣:

class task 
{ 
    static $tid = 0; 

    function __construct() 
    { 
     $this->tid++; 
    } 
} 

這將返回以下錯誤信息:

Notice: Undefined property: task::$tid in ... on line ... 

如何正確做到這一點? THX提前:)

編輯:

對不起,很顯然,這種做法着工作,導致static關鍵字表示該屬性未綁定到一個實例,從而 - >不工作。但如何正確地做到這一點?

$tid++不起作用。錯誤:未定義的變量。

+0

閱讀[documentation](http://php.net/manual/en/language.oop5.static.php#language.oop5.static.properties)。 – axiac

+0

因爲它是靜態的,所以'$ this->'將不起作用,因爲它指的是實例 –

+0

@Mark Ba​​ker,@axiac,是的,你是對的。現在很明顯 - >不會工作。 '$ tid ++'不起作用:雖然它說'未定義的變量',但是如何正確地做到這一點,在C++中你可以寫'setTid(tid + 1)',假設函數被定義。我現在在想什麼是正確的解決方案 – Alex

回答

3

PHP manual

Static properties cannot be accessed through the object using the arrow operator ->. Like any other PHP static variable, static properties may only be initialized using a literal or constant before PHP 5.6; expressions are not allowed.

然而有一種方式。您必須使用self關鍵字:

class Task 
{ 
    static $tid = 0; 

    function __construct() 
    { 
     self::$tid++; 
    } 
} 

new Task(); 
new Task(); 

echo Task::$tid; 

將輸出2

3

下會增加每次創建一個新的類實例時靜態。您必須使用self關鍵字。然後您可以使用$var::$tid訪問該值或創建一個函數來返回該值。以下將返回1122.當然,正如Nordenheim指出的那樣,如果$ tid是public static,則不需要getter fn。如果它是private static,getter將允許訪問它。

class task 
{ 
    public static $tid = 0; 

    public function __construct() 
    { 
     self::$tid++; 
    } 

    public function gettid(){ 
    return self::$tid; 
    } 

} 

$a = new task; 
echo ($a->gettid()); 
echo $a::$tid; 

$b = new task; 
echo ($b->gettid()); 
echo $b::$tid; 
+0

你是否意識到,當你實際上在課堂外做了'task :: $ tid'時,實現一個能改變'self :: $ tid'的getter是非常荒謬的事情,就像附上一支筆到一個模特的手,並控制模特的手在你的筆記本上寫文字 –

+0

@Nordenheim - 我只是展示了引用變種的不同方法,如果tid是一個私人靜態,這將是你的獲得者。變量應該或不應該是公共的或私人的。 – mseifert

相關問題