2017-08-24 81 views
-1

我已經開始真正深入到其他民族的代碼,我希望這被認爲是一個簡單的問題,但東西扔我,我希望你能解釋一下:未定義時在類對象中調用的變量?

當閱讀這個簡單的啓動腳本的模板引擎我注意到沒有爲$ variable->對象設置定義或變量。

class Template { 
protected $file; 
protected $values = array(); 

public function __construct($file) { 
    $this->file = $file; 
    } 
} 

如果在基本上面代碼中發現,這 - $>文件= $文件,「文件」對象沒有定義就引用。它是__construct函數的原因嗎?還是我錯過了別的?如果是的話,所有構造變量在函數內設置爲「define()」?

編輯:

的問題是,不__construct充當定義(),這樣的「文件」可以在任何地方使用的代碼,就好像它是一個變量$文件?或者是「受保護的」本質上定義變量$文件,允許我使用變量$文件。但如果是這樣的話,

怎麼來

function __construct($file) 

看起來並不像:

function __construct(file) if that is the case? 

猜猜我很困惑,如何「文件」已經調用了哪些部分代碼定義了「文件」?

+0

[在類定義上設置構造函數VS上的變量]的可能重複(https://stackoverflow.com/questions/1484265/setting-variables-on-constructor-vs-on-the-class-definition) –

+0

但通常它可能但不乾淨 –

+0

我不知道什麼是「未定義」在這裏。 'protected $ file'定義'$ this-> file'引用的屬性。 '$ file'作爲參數進入函數。 – deceze

回答

1

$file屬性在您的類中定義:

class Template { 
protected $file; // <-- HERE 
protected $values = array(); 

無論如何,定義屬性不是強制性的。在PHP中,即使未在類中定義值,也可以爲對象的屬性賦值。

然而,這是工作的ungly方式,這是出於兩個原因:

  • 如果你使用未定義的屬性,他們是沒有辦法的人誰看你的類要知道,這樣的屬性是使用,因爲它沒有記錄。
  • 定義屬性允許你指定一個訪問修飾符public如果屬性必須是從任何地方訪問,private如果它必須是可以從類只本身,protected如果必須從它的類本身或訪問任何延伸它的類。 如果您定義一個沒有訪問修飾符的屬性,它將默認爲公共。如果你根本沒有定義這個屬性,它將是一樣的,但更少的線索可以弄清楚發生了什麼。

只使用未定義的屬性,如果你打算,他們的工作將是使用或維護你的代碼要殺死你的開發人員,因爲我可以garantee你他們的意志。

+0

這樣保護在這個例子中的行爲與define()相同嗎?所以通過整個類,我可以簡單地鍵入文件,並且該類將知道引用受保護的$文件? – DEVPROCB

+0

我想我知道它$ this->文件本質上是引用template->文件,換句話說就是在這種情況下class-> variable?並且$文件是由哪個代碼啓動類正確設置的?如果是這種情況,那麼構造中的變量需要什麼? – DEVPROCB

+0

@DEVPROCB傳遞給'__constrruct()'的'$ file'用於設置'$ this-> file'。 – ksjohn

相關問題