2010-05-15 52 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