2010-05-15 53 views
5

我通過本教程: http://www.killerphp.com/tutorials/object-oriented-php/php-objects-page-3.php開始oop php問題:做構造函數代替getter?

起初,他已經創建的類setter和getter方法:

<?php 

class person{ 
    var $name;  

    function set_name($new_name){ 
     $this->name=$new_name; 
    } 

    function get_name(){ 
     return $this->name; 
    } 
} 

php?> 

,然後創建對象和回聲結果:

<?php 
    $stefan = new person(); 
    $jimmy = new person(); 

    $stefan ->set_name("Stefan Mischook"); 
    $jimmy ->set_name("Nick Waddles"); 

    echo "The first Object name is: ".$stefan->get_name(); 
    echo "The second Object name is: ".$jimmy->get_name(); 

?> 

按預期工作,我明白了。

接着,他介紹了構造函數:

class person{ 
    var $name; 

    function __construct($persons_name) {  
     $this->name = $persons_name;   
    }  

    function set_name($new_name){ 
     $this->name=$new_name; 
    } 

    function get_name(){ 
     return $this->name; 
    } 
} 

,並返回像這樣:

<?php 

    $joel = new person("Joel"); 

    echo "The third Object name is: ".$joel->get_name(); 
?> 

這是所有罰款和有意義。

然後我試圖把兩者結合起來,並得到一個錯誤,所以我很好奇 - 是一個構造函數總是代替「get」函數嗎?如果你有一個構造函數,你是否總是需要在創建一個對象時包含一個參數?

給出錯誤:

<?php 
    $stefan = new person(); 
    $jimmy = new person(); 
    $joel = new person("Joel Laviolette"); 
    $stefan ->set_name("Stefan Mischook"); 
    $jimmy ->set_name("Nick Waddles"); 

    echo "The first Object name is: ".$stefan->get_name(); 
    echo "The second Object name is: ".$jimmy->get_name(); 
    echo "The third Object name is: ".$joel->get_name(); 
?> 

回答

6

它給你錯誤,因爲構造函數有必需的參數。爲了使可選的參數給它這樣的

function __construct($persons_name=null) { 
    if ($persons_name) { 
     $this->set_name($persons_name);//use the setter in the constructor. 
    }  
} 

默認值它將會爲您的工作

$stefan = new person(); 
$stefan ->set_name("Stefan Mischook"); 
$joel = new person("Joel Laviolette"); 
echo "The first Object name is: ".$stefan->get_name(); 
echo "The second Object name is: ".$joel->get_name(); 
+0

很酷。我明白這一點。謝謝! – Joel 2010-05-15 02:40:57

5

構造函數被用於初始化的目的。面向對象編程的期望是一個對象不應該存在,除非它處於有效狀態。例如,沒有名字和姓氏的Person可能不會被認爲是有效的實體,所以當第一次創建對象時,它應該在構造函數中用名字和姓氏進行初始化。

你得到一個錯誤的原因是因爲構造函數有一個必需的參數,所以你必須傳遞一個參數給它。

P.S.我真的很討厭嘗試使用「狗是一隻哺乳動物」等類比的面向對象編程的解釋。你應該遠離這些例子。他們在真實世界的編程中確實沒有提供有用的信息,有時甚至會讓學生理解如何使用他們所教的內容。

如果您正在尋找使用構造函數創建處於有效狀態的對象的實際應用程序,請設想一個使用數據庫進行持久性的博客文章。

例如,如果博客未首先通過引用數據庫進行初始化,那麼寫一個長文章就沒有意義,然後調用$BlogPost->save();。在這種情況下使用構造的應用或許會成爲

$BlogPost = new BlogPost($Database); 

這將毫無意義有寫:

$BlogPost->setDatabase($Database); 

每次你想用它做任何事情的時間。也許你會忘記寫一次,你會想知道你寫了30分鐘寫作的帖子消失了。這是一個無效狀態的例子。

這個想法是,你將包括類首次初始化時依賴的任何東西,而不是冒着對象處於無效狀態的可能性。

編輯:將「兩個參數」更正爲一。

+0

感謝的答案,所以要清楚,如果我在一個類有一個構造函數,然後我在創建對象時總是必須傳遞一個參數,否則我會得到一個錯誤? IE,我無法做$ BlogPost = new BlogPost(); – Joel 2010-05-15 02:39:01

+2

這完全取決於你如何定義你的構造函數。函數__construct($ persons_name)有一個變量,$ persons_name是參數。在我的例子中,我只是碰巧做同樣的事情,雖然你可以定義它有任何數量的參數(或沒有)。 – 2010-05-15 02:41:05

+0

+1非常好的解釋性答案。 – 2010-05-15 02:45:26