Sie sollten Setter/Getter-Methoden haben. Sie sind ein Schmerz, aber Sie müssen sie nicht unbedingt selbst schreiben. Eine IDE (z. B. Eclipse oder Netbeans) kann diese automatisch für Sie generieren, solange Sie das Klassenmitglied angeben. Wenn aber wollen Sie nicht mit diesem überhaupt beschäftigen und Sie sind auf PHP5 können Sie die magischen Methoden verwenden, um das Problem zu beheben:
protected $_data=array();
public function __call($method, $args) {
switch (substr($method, 0, 3)) {
case 'get' :
$key = strtolower(substr($method,3));
$data = $this->_data[$key];
return $data;
break;
case 'set' :
$key = strtolower(substr($method,3));
$this->_data[$key] = isset($args[0]) ? $args[0] : null;
return $this;
break;
default :
die("Fatal error: Call to undefined function " . $method);
}
}
Dieser Code wird jedes Mal, wenn Sie eine nicht vorhandene Methode verwenden, läuft beginnend mit Set oder Get. So können Sie jetzt setzen/get (und erklären implizit) Variablen wie folgt:
$object->setName('Bob');
$object->setHairColor('green');
echo $object->getName(); //Outputs Bob
echo $object->getHairColor(); //Outputs Green
Keine Notwendigkeit an Mitglieder oder Setter/Getter Funktionen zu erklären. Wenn Sie in der Zukunft Funktionalität zu einer set/get-Methode hinzufügen müssen, deklarieren Sie sie einfach, indem Sie die magische Methode im Wesentlichen außer Kraft setzen. Da auch die Setter-Methode gibt $ this Sie können sie wie so chain:
$object->setName('Bob')
->setHairColor('green')
->setAddress('someplace');
, die für Code macht, die sowohl einfach zu schreiben und zu lesen ist.
Der einzige Nachteil dieses Ansatzes ist, dass es Ihre Klassenstruktur schwieriger zu erkennen macht. Da Sie im Wesentlichen Member und Methoden zur Laufzeit deklarieren, müssen Sie das Objekt während der Ausführung ausgeben, um zu sehen, was es enthält, anstatt die Klasse zu lesen. Wenn Ihre Klasse ein klar definiertes Interface deklarieren muss (weil es eine Bibliothek ist und/oder Sie möchten, dass phpdoc die API-Dokumentation generiert), würde ich Ihnen dringend raten, die public facing set/get-Methoden zusammen mit dem obigen Code zu deklarieren.
Ein weiterer wichtiger Punkt bei der Verwendung von Getter/Setter ist es, alle Methoden als 'public' zu vermeiden, damit der Entwickler sie ohne Kontrolle nicht ändern kann. – Strae