2010-05-15 4 views
5

ich dieses Tutorial arbeiten: http://www.killerphp.com/tutorials/object-oriented-php/php-objects-page-3.phpanfang oop php frage: nehmen Konstruktoren den Platz des Getters?

Zuerst hat er Ihnen einen Setter und Getter-Methode in der Klasse erstellen:

<?php 

class person{ 
    var $name;  

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

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

php?> 

Und dann erstellen Sie das Objekt und Echo die Ergebnisse:

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

?> 

Funktioniert wie erwartet, und ich verstehe.

Dann führt er Bauer:

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

und kehrt in etwa so:

<?php 

    $joel = new person("Joel"); 

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

Das alles in Ordnung ist und Sinn macht.

Dann habe ich versucht, die beiden zu kombinieren und habe einen Fehler, so bin ich neugierig - ist ein Konstruktor immer an die Stelle einer "get" -Funktion? Wenn Sie einen Konstruktor haben, müssen Sie beim Erstellen eines Objekts immer ein Argument einfügen?

Gewährt Fehler:

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

Antwort

6

Es gibt Ihnen Fehler, weil der Konstruktor Parameter benötigt. Ich mache einen Parameter einen Standardwert optional geben wie diese

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

dies jetzt

$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. Ich verstehe das. Vielen Dank! – Joel

5

Ein Konstruktor verwendet wird, um ein Objekt zu initialisieren. Die Erwartung in der objektorientierten Programmierung besteht darin, dass ein Objekt nur existieren sollte, wenn es sich in einem gültigen Zustand befindet. Beispiel: Eine Person ohne Vor- und Nachname wird möglicherweise nicht als gültige Entität betrachtet. Wenn das Objekt zum ersten Mal erstellt wird, sollte es daher im Konstruktor mit einem Vor- und Nachnamen initialisiert werden.

Der Grund, warum Sie einen Fehler erhalten haben, ist, dass der Konstruktor über einen erforderlichen Parameter verfügt. Sie müssen daher ein Argument übergeben.

P.S. Ich hasse Erklärungen von objektorientierter Programmierung, die versuchen, Analogien wie "Hund ist ein Säugetier" zu verwenden. Sie sollten sich wahrscheinlich von diesen Beispielen fernhalten. Sie geben wirklich keine hilfreiche Information in der realen Weltprogrammierung und geben manchmal Studenten die Illusion, dass sie verstehen, wie man verwendet, was sie unterrichtet werden.

Wenn Sie eine praktische Anwendung der Verwendung eines Konstruktors zum Erstellen eines Objekts im gültigen Status suchen, stellen Sie sich einen Blogpost vor, der eine Datenbank für die Persistenz verwendet.

Zum Beispiel würde es keinen Sinn machen, einen langen Beitrag zu schreiben und dann $BlogPost->save(); aufzurufen, wenn der Blog nicht zuerst mit einem Verweis auf die Datenbank initialisiert wurde. Die Anwendung der Konstruktor in diesem Fall mit vielleicht

$BlogPost = new BlogPost($Database); 

wäre Es wäre sinnlos schreiben zu machen:

$BlogPost->setDatabase($Database); 

jedes Mal, wenn Sie wollte etwas damit zu tun. Vielleicht würden Sie vergessen, es einmal zu schreiben und Sie würden sich wundern, wo der Beitrag, für den Sie 30 Minuten geschrieben haben, verschwunden ist. Das ist ein Beispiel für einen ungültigen Zustand.

Die Idee ist, dass Sie alles einschließen, von dem die Klasse bei der ersten Initialisierung abhängig ist, anstatt die Möglichkeit zu riskieren, dass sich das Objekt in einem ungültigen Zustand befindet.

Bearbeiten: Korrigiert "zwei Parameter" zu eins.

+0

Vielen Dank für Ihre Arbeit wird Antwort-so sein, klar, wenn ich einen Konstruktor in einer Klasse habe, dann muss beim Erstellen eines Objekts immer ein Argument übergeben, sonst bekomme ich einen Fehler? IE, ich konnte nicht $ BlogPost = new BlogPost(); – Joel

+2

Das hängt ganz davon ab, wie Sie Ihren Konstruktor definieren. Die Funktion __construct ($ persons_name) hat eine Variable, $ persons_name ist der Parameter. In meinem Beispiel habe ich zufällig dasselbe gemacht, obwohl Sie es so definieren könnten, dass es eine beliebige Anzahl von Argumenten (oder keine) hat. –

+0

+1 sehr nett und erklärende Antwort. –