Instantiierung eines Objekts verhinden
Heinz
- php
Hallo,
gibt es eine Möglichkeit die Instantiierung eines Objekts zu verhindern wenn mir z.B. eines der übergebenen Argumente im Klassenkonstuktor nicht gefällt ?
Bisher konnte ich keine PHP4-kompatible Lösung dafür finden:
Beispiel:
class TestClass
{
var $x;
function TestClass($x)
{
if (empty($x))
// ... hier sollte die Instantiierung nun verhindert werden
else
$this->x=$x;
}
}
Irgendwelche Vorschläge ? Weder "return false" oder "unset($this)" funktionieren :(
Grüße,
Heinz
Hi,
mmh. Da ein Konstruktor in einer Klasse optional ist, denke ich, dass zur Laufzeit desselbigen die Instantiierung bereits abgeschlossen ist.
Man könnte evtl. aus dem Konstruktor heraus eine Destruktor aufrufen.
Den gibt es aber meines Wissen erst in PHP 5.
Lasse mich aber gerne berichtigen.
Schöne Grüße
Axel
Hello,
ich könnte mir vorstellen, dass das mit einem Wrapper vorgeneommen werden kann.
Man kann ja auch bedingte Funktionsdefinitionen vornehmen. Die Funktion wird dann nur definiert, wenn bestimmte Voraussetzungen erfüllt sind. Damit das ganze aber sinnvoll ist, muss man die Definition selbst erst dynamisch dazuladen, wenn sie denn tatsächlich benötigt wird.
Das ist bestimmt nur bei großen "Speicherklötzen" sinnvoll, denn das Dazuladen kostet jedemal typisch 5-8ms. Und solange die IO/Funktion aktiv ist, stellt der Prozessor sozusagen 100% für den einen Prozess zur Verfügung. Das Ganze könnte also recht teuer werden, wenn man es übertreibt.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hi,
ich könnte mir vorstellen, dass das mit einem Wrapper vorgeneommen werden kann.
gsss. Kennt PHP eigentlich Exceptions? So wie ich den Fall betrachte, wäre das exakt das richtige Mittel. Oder halt der Eselsweg mit einer isokay()-Methode oder so.
Cheatah
Hello,
ich könnte mir vorstellen, dass das mit einem Wrapper vorgeneommen werden kann.
gsss.
Naja, ist nur ne Krücke...
Kennt PHP eigentlich Exceptions? So wie ich den Fall betrachte, wäre das exakt das richtige Mittel. Oder halt der Eselsweg mit einer isokay()-Methode oder so.
PHP 5 kennt Exceptions. Ich habe aber noch nicht damit gearbeitet.
auf http://www.php.net/zend-engine-2.php Druckseite 7 von 14 steht ein Besipiel
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hi,
ich könnte mir vorstellen, dass das mit einem Wrapper vorgeneommen werden kann.
gsss.
Naja, ist nur ne Krücke...
sollte kein Vorwurf sein :-)
PHP 5 kennt Exceptions.
Heia, vorher noch nicht? Mir hat das Konzept von PHP noch nie gefallen.
auf http://www.php.net/zend-engine-2.php Druckseite 7 von 14 steht ein Besipiel
Hm, unter der URL gibt es bei mir nicht viel mehr als eine Bildschirmseite. Druckst Du eventuell stark vergrößert aus ;-) oder muss die Seite noch irgendwie konfiguriert werden?
Cheatah
Hello,
auf http://www.php.net/zend-engine-2.php Druckseite 7 von 14 steht ein Besipiel
Hm, unter der URL gibt es bei mir nicht viel mehr als eine Bildschirmseite. Druckst Du eventuell stark vergrößert aus ;-) oder muss die Seite noch irgendwie konfiguriert werden?
Vielleicht stammt mein Ausdruck noch aus der Zeit, als es keine eigene Seite für die Exceptions gab? Mir hat das Konzept von PHP 5 nämlich gefallen, sodass ich mich schon eine Weile damit beschäftige. siehe also nun http://de2.php.net/manual/en/language.oop5.exceptions.php
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hi,
Vielleicht stammt mein Ausdruck noch aus der Zeit, als es keine eigene Seite für die Exceptions gab?
wie sagte Sir Timothy so schön: "Good URIs don't change. People change them." :-)
Mir hat das Konzept von PHP 5 nämlich gefallen, sodass ich mich schon eine Weile damit beschäftige.
Mit PHP 5 habe ich mich noch nicht beschäftigt, allerdings war ja schon vorher die Tendenz spürbar, die alten Fehler auszuräumen. Dennoch, es basiert auf etwas ziemlich Unausgegorenem, steht also auf einem schwachen Fundament. Ich werde PHP daher weiterhin mit äußerster Vorsicht begegnen :-)
siehe also nun http://de2.php.net/manual/en/language.oop5.exceptions.php
Danke!
Cheatah
gibt es eine Möglichkeit die Instantiierung eines Objekts zu verhindern wenn mir z.B. eines der übergebenen Argumente im Klassenkonstuktor nicht gefällt ?
Bisher konnte ich keine PHP4-kompatible Lösung dafür finden:
das objekt wird bei new klasse instantiiert. dann ist es für den konstruktor schon zu spät.
Irgendwelche Vorschläge ? Weder "return false" oder "unset($this)" funktionieren :(
ja - statisch aufrufen. $objekt = klasse:klasse($parm);
im konstuktor (leider) selbst switchen, ob statisch oder dynamischer aufruf.
case statisch:
prüfen, ob parms gefallen finden.
dann return new klasse($parm);
sonst return NULL;
case dynamisch:
was jetzt schon da steht.
Hi!
Irgendwelche Vorschläge ? Weder "return false" oder "unset($this)" funktionieren :(
Evtl. mal
$this = NULL;
sonst
die();
Musst dann aber dafür sorgen dass sowas nicht nur hier und da zur Laufzeit passiert. die() wurde z.B. oft verwendet, um mit PHP4 abstrakte Klassen abzubilden:
if ($this) die();
Aber Du willst ja etwas anderes, wenn ich das richtig sehe.
Ich würde evtl. überlegen das Objekt nicht per "new Obj" zu instanzieren, sondern von einer Factory-Methode erzeugen zu lassen, die dann das Objekt zurück gibt, oder eben FALSE, das würde ich als sauberer empfinden.
Das heißt so:
$var = MeineKlasse::factory($arg);
wobei factory() dann so aussieht:
function factory($arg) {
if (!check($arg)) {
return FALSE;
}
else {
return new MeineKlasse($arg);
}
}
nur mal ganz verkürzt. Kannst ja mal nach "Factory Pattern" googlen. Allerdings würde ich inzwischen bei neuen projekten durchaus erwägen PHP5 einzuseten, es gibt wirklich zahlreiche (bekannte) Provider, die das inzwischen anbieten.
Grüße
Andreas