2010-06-25 90 views
2

我一直在看一些代碼,並且很難在php類中處理變量聲明。具體來說,我看到的代碼在使用它們之前沒有聲明類變量。現在可以預料到這一點,但我找不到任何可能的信息。所以你會期待這個:在PHP中隱式類變量聲明?

class Example 
{ 

    public function __construct() 
    { 
     $this->data = array(); 
     $this->var = 'something'; 

    } 

} 

工作?這是否會在類實例上創建這些變量以供以後使用?

回答

3

這個工作同樣作爲一個正常的變量聲明將工作:

$foo = 'bar'; // Created a new variable 

class Foo { 
    function __construct() { 
     $this->foo = 'bar'; // Created a new variable 
    } 
} 

PHP類是不太一樣的其他語言,其中的成員變量需要被指定爲類聲明的一部分。 PHP類成員可以隨時創建。

說了這麼多,你應該聲明變量像public $foo = null;在類的聲明,如果它應該是類的常任理事國,清楚地表達意圖。

2

所以你會期望:(代碼示例)工作?
是的。這是非常糟糕的做法(至少它讓我的C++皮膚爬行),但它絲毫不會讓我感到驚訝。有關使用另一個而未事先聲明的示例,請參見下面的示例2。 http://www.php.net/manual/en/language.oop5.basic.php如果啓用E_STRICT,它將引發錯誤。

這是否會在類實例上創建這些變量以供以後使用?

是的。不是PHP的樂趣?來自C++/C#的背景,PHP花了一段時間用它非常寬鬆的打字來增長我,但它有它的優勢。

+0

這第二個例子是關於調用使用'$ this'靜態,不是成員變量的方法。 – deceze 2010-06-25 02:20:05

+0

查看第二個例子中的B類。 – Caladain 2010-06-25 02:34:20

+0

是的,我做到了。它調用'A :: foo()'。這裏根本沒有成員變量。 – deceze 2010-06-25 02:42:15

1

這是完全有效的,但意見不同。由於類成員變量的創建在構造函數中,因此它們將存在於對象的每個實例中,除非被刪除。

這是傳統與信息註釋來聲明類成員變量:

class Example 
{ 
    private $data; // array of example data 

    private $var; // main state variable 

    public function __construct() 
    { 
     $this->data = array(); 
     $this->var = 'something'; 
    } 
} 
+0

應該指出,原來的例子會導致公衆成員,而你的例子有私人成員。 – 2016-11-08 18:52:59