2016-07-14 17 views
1

我有一個關於變量聲明在PHP中的問題,我知道這個問題可能有點愚蠢。我有以下代碼我需要聲明一個變量,然後在PHP構造函數中初始化它

<?php 
    Class Test{ 
    function __construct(){ 
     $this->test = 'helloworkd'; 
    } 
    function test(){ 
     echo $this->test; 
    } 
    } 
    $test = new Test(); 
    $test->test(); 

好像我可以使用測試變量未聲明的。我的問題是爲什麼test()方法可以訪問測試變量? 測試是一個全局變量嗎?

感謝您的幫助!

+3

不是全局的,因爲你使用了'$ this->',所以它已經將它創建爲類的一個樣本。這是真的,你不必在PHP中正式聲明一個屬性。 **但是,宣佈你知道你將要使用的屬性是一個好主意**,因爲它使得一個類對其他人更具可讀性,並且當你想修改類時,你需要6個月的時間。 – RiggsFolly

+2

更好如果你聲明它,因爲它有助於IDE自動完成。 – vaso123

+2

您還可以搜索PHP魔術方法 – dios231

回答

0

我的問題是爲什麼test()方法可以訪問測試變量?

與其他語言不同,PHP允許您爲變量賦值而不必首先聲明它們。口譯員會爲你初始化它們。這是不良的做法,因爲它使代碼更難閱讀和調試,因爲如果你試圖它可能會導致錯誤讀取這是從來沒有聲明的變量:

<?php 
$nonexistentArray['key'] = 7; //Bad practice, but PHP won't complain 
$a = $fakeArray['key']; //Undefined variable error 

即使在第二種情況下,PHP將繼續執行腳本的其餘部分,但它會抱怨。

測試是一個全局變量嗎?

不。它生活在本地範圍內。

<?php 
function myFunc(){ 
    //$arr was never declared, but PHP won't complain 
    $arr['key'][]=7; 
} 
myFunc(); 

//Undefined var error. The $arr that was initialized in myFunc is not global 
print_r($arr); 

如果您嘗試使用您從未聲明過的變量,一個好的IDE會發出抱怨。在你的情況下,當你在構造函數中做:

$this->test = 'helloworkd'; 

PHP會爲你初始化這個類屬性。現在剩下的代碼可以使用它,包括test()方法。如果它看起來像一個全局變量,那不是。這是一個類屬性。如果你試圖從課堂以外只訪問它test,你將無法做到。您必須使用$test->test$this->test中的訪問器運算符->

+0

謝謝。我只是根據你的回答做了一些測試。
如果myFunc()處於Class上下文中,並且$ arr ['key'] [] = 7更改爲$ this-> arr ['key'] [],它將創建一個類屬性,僅僅因爲$ this關鍵詞,對吧? –

+0

非常好的測試:-) – BeetleJuice

0

許多「測試」!你在構造器中有asign test =「helloworld」,所以它爲每一個新的Test()做了一個值。

$x = new Test(); 
$y = new Test(); 

echo $x->test(); //"helloworld" 
echo $y->test(); //"helloworld" 
0

我會聲明你的變量。這使得代碼對於任何看到你的代碼的任何其他人來說更具可讀性。

例如:

<?php 
    Class Test { 
    public $test; 
    function __construct($test){ 
     $this->test = $test; 
    } 
    function test(){ 
     echo $this->test; 
    } 

所以現在我們有一個公共變量是通過訪問這個類的一個實例調用 $實例 - >測試;

如果你不想這樣,那麼你可以公開更改爲私有或保護 你可以閱讀這個在這裏:http://php.net/manual/en/language.variables.scope.php

不管你創建這個類的一個實例時作爲參數傳遞將被分配給$測試變量。

0

我的問題是爲什麼test()方法可以訪問測試變量?

它不能。它試圖訪問常量test,如果要訪問類變量,請使用$this->test

例如:

<?php 
echo foo; 

迴音必出一個字符串 「foo」,並吐出了一張告示:使用未定義的常量的foo - 中...

+0

是的,你是對的,我只是接受我的問題的編輯。應該是$ this-> test –

0
<?php 
class test{ 
public $test; 
public function __construct(){ 
$this->test = 'helloworkd'; 
} 
$newtest = new Test(); 
echo $newtest->test; 
?> 
假設 '富'
+0

儘管這段代碼可能會回答這個問題,但應該真的給它​​添加一個解釋。 – BDL

+3

儘管這段代碼可能會解決這個問題,但[包括解釋](// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)確實有助於提高帖子的質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。也請儘量不要使用解釋性註釋來擠佔代碼,因爲這會降低代碼和解釋的可讀性! – FrankerZ

相關問題