2017-09-13 135 views
0

我不明白什麼是__construct()。我不能看到這兩個例子之間的差異:兩個類之間的區別__construct()

1)

class Person { 

public function __construct($person) { 
    echo $person; 
} 

$person = new Person('Name'); 

2)

class Person { 
    public function name($name) { 
     echo $name; 
    } 
} 

$person = new Person(); 
$person->name('Name'); 
+3

手冊:[構造函數和析構函數](http://php.net/manual/en/language.oop5.decon.php) –

+1

構造函數簡單地定義創建對象時的第一個和所需的行爲 – Kazz

+0

您看不到差異?!一個在施工時傳遞參數,另一個在後面傳給另一個實例方法。非常明顯的差異IMO。你可能想澄清爲什麼你認爲沒有什麼不同。 – deceze

回答

2

您的兩個示例確實可能看起來相同,但僅從單一(您的,現在)的角度來看。


class Person { // First case : using the constructor 

    public function __construct($person) { 
     echo $person; 
    } 
} 

// ---------------------------------------------------------------- 
$person = new Person('Name'); 

在這個例子中,你非常清楚的是Person類(或子類之一)的每一個對象都必須儘快它創建一個名字。在任何時候都不會有沒有名字的Person。如果您以某種方式共享您的代碼,那麼您選擇強加給自己的設計約束(如果您打算創建類Person的對象)或其他設計約束。如果有人試圖違反這個約束,PHP將掛起一個明確的錯誤/警告消息。 (演示:https://3v4l.org/hCXZ8


class Person { // Second case : no constructor (equivalent to an empty constructor) 

    public function name($name) { 
     echo $name; 
    } 
} 

// ---------------------------------------------------------------- 
$person = new Person(); 
$person->name('Name'); 

這是一個不同的野獸:你可以創建Person類的一個對象,你可以顯示一個名稱。您也可以創建一個Person,並且從不顯示任何名稱。實際上,如果你因爲某種原因而沒有把目光放在類代碼上(通常的做法是爲每個類指定一個獨特的文件),你甚至可能不知道你可以。


在這兩個例子,我畫了類聲明和使用量之間的註釋行,因爲這是兩個不同的角度(覺得他們甚至可以是兩個不同的人誰也不能互相通信)。作爲課堂作者,您可以將您的約束條件精確地轉換爲您可以生成的最明確的代碼。作爲類的用戶,您不想浪費時間來理解所使用類的複雜性:您希望以最小的複雜度創建對象,以最小的開銷和學習曲線充分利用功能,並繼續使用代碼和業務。

4

在這種人爲的例子,第二個是細。

如果name是該類的一個字段,而不僅僅是一個回聲方法?在你明確地設置它之前,它的價值是什麼?

爲確保字段被初始化並在可以使用對象之前完成設置,請使用構造函數。如果你不需要初始化,你不一定需要寫一個顯式的構造函數。

+0

好吧,我現在明白了......我想....但我如果你想寫一個小例子來更好地理解它。非常感謝你! –

+0

@ΜάνοςΑρβανίτης我沒寫過PHP,所以我希望避免編寫代碼。我不希望我介紹的任何錯誤進一步混淆局面。你有多少研究對象的使用和創造?如果你剛開始,構造函數的目的可能不明顯。一旦你開始寫更復雜的對象,它應該變得更清晰。你發佈的例子的問題是首先使用類沒有意義。該方法可能不過是一個純粹的功能。 – Carcigenicate

+0

試圖從首先濫用類的代碼中得出關於類操作的結論是毫無用處的。 – Carcigenicate