Frage zu PHP. Mehrere Konstruktoren für eine Klasse?
Hey Leute :D
Ich bin gerade dabei PHP zu lernen. Und jetzt habe ich eine Frage zu den Konstruktoren in PHP.
Ich habe eine User Klasse. Und die will ich entweder mit der E-Mail Adresse, der Datenbank ID oder dem Vor undd Nachnamen aufrufen können.
Meine Frage ist, wie PHP da unterscheidet ob nun der Konstruktor für die E-Mail Adresse oder der für die Datenbank ID aufgerufen wird und ob das so überhaupt funktionieren wird? Da ja bei beiden Konstruktoren nur eine Variable beim Aufruf der Klasse übergeben wird.
Vielen Dank im Voraus für hilfreiche Antworten! :)
4 Antworten
Mal abgesehen von der Konstruktorproblematik, die ja wohl hinreichend beantwortet wurde...
Es ist generell kein guter Ansatz, ein Objekt zur erzeugen und im Konstruktor dessen Inhalte aus der Datenbank (oder woher auch immer) zu lesen (ich vermute diesen Sinn hinter der Frage).
Hier wäre eine Factory angebracht, deren Methoden z.B.
createFromDatabaseById
createFromDatabaseByName
createFromDatabaseByEMail
lauten.
Hier wäre nämlich die Möglichkeit gegeben, dass die Methode eben kein Objekt zurückgibt, wenn z.B. die ID in der Datenbank gar nicht vorhanden ist.
Schau dich mal nach "multiple constructors" um. Mit PHP musst Du das schon selbst schreiben. Hier ein Beispiel: https://stackoverflow.com/questions/31542425/type-hinting-and-multiple-constructors
Funktionsüberladung in PHP funktioniert etwas anders, als bei anderen objektorientierten Sprachen. Siehe dazu hier:
Bei gleichem Datentyp wird es allerdings schwierig, zu unterscheiden. Daher gibt es noch folgende Alternativen:
a) Du übergibst ein assoziatives Array oder ein Objekt. Je nachdem, welche Keys / Eigenschaften in diesem definiert sind, kann auch ausgelesen werden.
b) Du verwendest statische Helferfunktionen zum Erstellen des Objekts:
class User { // declare vars ... public function __construct() { } public static function withEMail($mail) { $instance = new self(); $instance->mail = $mail; return $instance; } public static function withDatabaseId($id) { $instance = new self(); $instance->databaseId = $id; return $instance; } }
Aufruf:
$user = User::withEMail("johndoe@gmail.com");
Bei gleichem Datentyp wird es allerdings schwierig, zu unterscheiden.
Ab PHP 7 kann man ja den Datentyp mit angeben. Hab es aber noch nicht beim Konstruktor getestet.
Hallo,
ich habe dir mal ein nützlichen Forumbeitrag von einem anderen Forum gesucht:
https://www.php.de/forum/webentwicklung/php-fortgeschrittene/12975-erledigt-mehrere-konstruktoren
Gruß und viel Erfolg und Spaß!
Hallo,
ok danke! Wusste ich nicht! Beschäftige mich momentan bzw. schon seit längerem mit PHP nicht mehr!
Gruß!
Danke für die blitzschnelle Antwort! :)
Also verstehe ich das richtig, dass ich in meinem Fall den Konstruktor mit vier möglichen Attributen ausstatte und denen Null zuweise ($datenbankID = null, $email = null, $vorname = null, $nachname = null)?
Und dann überprüfe was davon nicht Null ist?
Vielen Dank!
Oh. Sehe die Kommentare erst jetzt. Schade.
Dann versuche ich es mit der anderen Antwort. Trotzdem Danke.
Der dort beschrieben Weg geht mit PHP >= 5 nicht mehr.