2010-05-15 2 views
5

Je travaille dans ce tutoriel: http://www.killerphp.com/tutorials/object-oriented-php/php-objects-page-3.phpdébut oop php question: les constructeurs prennent-ils la place du getter?

Au début, il vous a créer un setter et méthode de lecture dans la classe:

<?php 

class person{ 
    var $name;  

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

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

php?> 

Et puis vous créez l'objet et l'écho des résultats:

<?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(); 

?> 

Fonctionne comme prévu, et je comprends.

Puis il introduit les constructeurs:

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; 
    } 
} 

et retourne comme ceci:

<?php 

    $joel = new person("Joel"); 

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

Tout cela est bien et a du sens.

Puis j'ai essayé de combiner les deux et j'ai eu une erreur, donc je suis curieux: est-ce qu'un constructeur prend toujours la place d'une fonction "get"? Si vous avez un constructeur, avez-vous toujours besoin d'inclure un argument lors de la création d'un objet?

donne des erreurs:

<?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(); 
?> 

Répondre

6

Il vous donne des erreurs car le constructeur a besoin de paramètres. Pour un paramètre optionnel lui donner une valeur par défaut comme celui-ci

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

cela maintenant travailler

$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

Cool. Je comprends ça. Merci! – Joel

5

Un constructeur est utilisé pour initialiser un objet. L'attente dans la programmation orientée objet est qu'un objet ne devrait pas exister à moins qu'il ne soit dans un état valide. Par exemple, une personne sans prénom et nom peut ne pas être considérée comme une entité valide. Par conséquent, lorsque l'objet est créé pour la première fois, il doit être initialisé avec un nom et un prénom dans le constructeur.

La raison pour laquelle vous avez reçu une erreur est que le constructeur a un paramètre requis, donc vous devez lui passer un argument.

P.S. Je déteste vraiment les explications de la programmation orientée objet qui essaie d'utiliser des analogies comme "Dog is-a Mammal". Vous devriez probablement rester loin de ces exemples. Ils ne donnent vraiment aucune information utile dans la programmation du monde réel et parfois même donnent aux étudiants l'illusion qu'ils comprennent comment utiliser ce qu'on leur enseigne.

Si vous recherchez une application pratique d'utilisation d'un constructeur pour créer un objet dans un état valide, imaginez un article de blog qui utilise une base de données pour la persistance.

Par exemple, il ne serait pas utile d'écrire un post long, puis d'appeler $BlogPost->save(); si le blog n'était pas initialisé avec une référence à la base de données. L'application de l'aide d'un constructeur dans ce cas serait peut-être

$BlogPost = new BlogPost($Database); 

Il n'y aurait aucun sens d'avoir à écrire:

$BlogPost->setDatabase($Database); 

chaque fois que vous vouliez faire quelque chose avec elle. Peut-être que vous oublieriez de l'écrire une fois et vous vous demanderiez où le poste que vous avez passé 30 minutes à écrire a disparu. C'est un exemple d'état invalide. L'idée est que vous incluiez tout ce dont la classe dépend lors de sa première initialisation, au lieu de risquer la possibilité que l'objet soit dans un état invalide.Edit: Corrigé 'deux paramètres' à un.

+0

Merci pour votre réponse, afin d'être clair si j'ai un constructeur dans une classe, alors je devra toujours passer un argument lors de la création d'un objet sinon je reçois une erreur? IE, je ne pouvais pas faire $ BlogPost = new BlogPost(); – Joel

+2

Cela dépend entièrement de la façon dont vous définissez votre constructeur en premier lieu. La fonction __construct ($ persons_name) a une variable, $ persons_name est le paramètre. Dans mon exemple, je suis juste arrivé à faire la même chose, bien que vous puissiez le définir pour avoir n'importe quel nombre d'arguments (ou aucun). –

+0

+ 1 réponse très agréable et explicative. –