OOP Constructor von anderem Constructor aufrufen
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
code
entnehmen
ersten code
folgendes sagen
funktion
http
manual
meister
menge
methode
parameter
post
schlaf
schlafen
sprache
stilmittel
test
tun
url
verlesen
-
Ich bin derzeit etwas C# geschädigt und frage mich gerade ob so etwas auch in OOP-PHP Möglich ist:
class Test { public Test() { DoSomething(); } public Test(int count) : this() { DoSomethingWithCount(count); } public Test(int count, string name) : this(count) { DoSomethingWithName(name); } }
Also sollte ich jetzt $bla = new Test(5, "Blub"); mach soll zuerst der dritte Constructor aufgerufen werden, dann der zweite und schliesslich der erste. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
nikic schrieb:
PHP als schwach-typisierende Sprache erlaubt es nicht Methoden zu überladen. Wenn du deinen Code ausführst, wirst du sowas wie "Cannot redeclare method Test. Test already decalred in ...".
Der Code wie oben geschrieben ist C# und funktioniert dort perfekt x) . Aber soweit ich aus deinem Post entnehmen kann ist es nicht möglich?
Beitrag zuletzt geändert: 19.4.2010 15:37:40 von fr3z3r -
ja, mein Post bezog sich auf eine PHP-Variante von deinem Code.
-
ich glaube wenn ich den meister genau verstanden habe wollte er folgendes sagen:
eine funktion, oder hier methode, kannst du nur einmal setzen.
gibt es die methode Test() schonmal und du machst eine 2te, kann auch vollkommen unterschiedlich sein, der name ist entscheident.
aber wenn ich recht verstanden habe, willst du, dass die methoden entweder:
- etwas machen
- etwas mit variable1 machen
- etwas mit variable2 machen
das kannst du auch so basteln:
class test { public function __construct ($count = false, $name = false) { if ($count && $name) { Do something with both } elseif ($name) { do something with name; } else if ($count) { do something with count; } else { do something } }
und dann sprichst du die funktion halt mit test('', '') an. denn wenn du jetzt für eine variable nichts übergibst erhält sie den wert false.
auch wenn das if - elseif - else gedöns nicht das beste ist, ist finde ich das leichteste. und wenn ich mich nicht verlesen habe müsste es das tun was du willst^^ wenn nicht nimms nich übel, ich schlafe eig schon wieder.
und den constructor würd ich mit
class foo { public __construct($var) { work with $var; } }
das ist nen stilmittel, aber ich finde so findet man in einer klasse die dinge schnell wieder (obwohl man den constructor auch einfach nach ganz oben hinsetzen kann), es sieht aber schöner aus mit __construct wenn unten ein __destruct steht^^
PS: C# ist nicht ganz PHP ^^
nen benkannter kann auch C++ und C# sehr gut, aber an PHP hapert er tierisch. (heißt nciht dass du es nciht kannst :) es ist halt nur etwas bischen anderes^^ . dafür krieg ich diesen kaqq C kram nich drauf)
Edit: ersten code an klasse angepasst, bin wie gesagt schon am schlafen. meister nikic, nicht sauer sein wenns falsch ist xD (nikic musst du wissen hat ne ganze menge aufn kasten! das ist echt gewaltig)
Beitrag zuletzt geändert: 19.4.2010 16:15:43 von ggamee -
Deine Sache funktioniert auch mit optionalen Parametern.
function __construct() { if( func_num_args >= 0 ) { // erster konstruktor } if( func_num_args > 0 ) { // zweiter konstruktor } if( func_num_args > 1 ) { // dritter konstruktor } }
Damit werden einzelne Konstruktoren gemacht, aber wenn der Dritte aufgerufen wird werden alle aufgerufen.
Schau dir dazu das an:
http://php.net/manual/de/function.func-num-args.php
http://www.php.net/manual/de/function.func-get-arg.php
Beitrag zuletzt geändert: 19.4.2010 17:28:12 von reimann -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage