Klassen - prüfen ob Objekt erstellt wurde
Klassen - prüfen ob Objekt erstellt wurde
am 05.10.2006 15:10:47 von kaycee
Hallo Leute,
wie kann ich prüfen, ob eine Instanz einer Klasse erzeugt wurde bzw.
verhindern dass eine erzeugt wird, also:
class xy{
function xy($param){
if($param==ungültiger Wert) return false; // in diesem Fall soll
keine Instanz erzeugt werden
return true;
}
}
if(!$obj=3Dnew xy(parameter)) die("Instanz wurde nicht erzeugt");
oder
irgendwie funzt das nicht
gruß christian
Re: Klassen - prüfen ob Objekt erstellt wurde
am 05.10.2006 16:34:04 von Ulf Kadner
kaycee@vw-style.net wrote:
> wie kann ich prüfen, ob eine Instanz einer Klasse erzeugt wurde bzw.
Indem du diese z.B. als singleton aufbaust.
> verhindern dass eine erzeugt wird, also:
geht nicht. kannste nicht vehindern. In PHP5 werden Dir zwar mehr mittel
an die Hand gegeben um über Sichbarkeitsbereiche zu beeinflussen was
normal wie zugänglich ist, aber dort existiert auch Reflection die das
alles irgnoriert.
> if(!$obj=new xy(parameter)) die("Instanz wurde nicht erzeugt");
Halt als Singleton! Damit (statische Zwischenebene) ists kein Problem.
MfG, Ulf
Re: Klassen - prüfen ob Objekt erstellt wurde
am 05.10.2006 20:21:48 von dafox
Ulf Kadner schrieb:
> kaycee@vw-style.net wrote:
[Verhindern, dass Klasse erzeugt wird]
> geht nicht. kannste nicht vehindern. In PHP5 werden Dir zwar mehr mittel
> an die Hand gegeben um über Sichbarkeitsbereiche zu beeinflussen was
> normal wie zugänglich ist, aber dort existiert auch Reflection die das
> alles irgnoriert.
Hä, wie kommst du denn jetzt auf Reflection? Ich glaube, er meint etwas wie:
class Blubb {
public function __construct() {
throw new Exception("Error");
}
}
$a = null;
try {
$a = new Blubb;
} catch(Exception $ex) {
print "Instanz wurde nicht erzeugt!
";
}
var_dump($a); // NULL
>> if(!$obj=new xy(parameter)) die("Instanz wurde nicht erzeugt");
> Halt als Singleton! Damit (statische Zwischenebene) ists kein Problem.
Warum sollte man das als Singleton implementieren? Der OP schreibt
nirgends, dass er nur eine Instanz der Klasse erzeugen will.
MfG,
Thomas
Re: Klassen - prüfen ob Objekt erstellt wurde
am 05.10.2006 20:34:16 von Ulf Kadner
Thomas 'DaFox' Hamacher wrote:
>> geht nicht. kannste nicht vehindern. In PHP5 werden Dir zwar mehr
>> mittel an die Hand gegeben um über Sichbarkeitsbereiche zu
>> beeinflussen was normal wie zugänglich ist, aber dort existiert auch
>> Reflection die das alles irgnoriert.
>
>
> Hä, wie kommst du denn jetzt auf Reflection?
Nur ein Überlegung. Wieso nicht? Reflection umgeht nunmal Sichbarkeit.
Im endeffekt aber nicht relevant, da der OP PHP4 nutzt (siehe code)
> class Blubb {
> public function __construct() {
> throw new Exception("Error");
> }
> }
Eher nicht mit PHP4 ;-)
>> Halt als Singleton! Damit (statische Zwischenebene) ists kein Problem.
>
> Warum sollte man das als Singleton implementieren? Der OP schreibt
> nirgends, dass er nur eine Instanz der Klasse erzeugen will.
Nein lies was er schrieb. Er will das false zurueck gegeben wird. So
wies im seinen Code halt schon ansatzweise drin steht. Das geht nunmal
nur wenn man alles in eine statische Initialmethode packt, da man den
Konstruktor nicht dazu überreden kann.
MfG, Ulf
Re: Klassen - prüfen ob Objekt erstellt wurde
am 05.10.2006 20:54:55 von Niels Braczek
kaycee@vw-style.net schrieb:
^^^^^^^^^^^^^^^^^^^
Gib hier bitte deinen Vor- und Nachnamen an.
> wie kann ich prüfen, ob eine Instanz einer Klasse erzeugt wurde bzw.
> verhindern dass eine erzeugt wird, also:
>=20
> class xy{
> function xy($param){
> if($param==ungültiger Wert) return false; // in diesem Fall s=
oll
> keine Instanz erzeugt werden
> return true;
> }
> }
>=20
> if(!$obj=3Dnew xy(parameter)) die("Instanz wurde nicht erzeugt");
> oder
> irgendwie funzt das nicht
Indem du eine Factory benutzt. Die kann Werte zurückgeben.
class XY
{
function XY( $param )
{
if ( !$this->valid( $param ) ) {
die( 'Do not instantiate directly' );
}
// do the init stuff
}
function &factory( $param )
{
if ( !$this->valid( $param ) ) {
return false;
}
$Obj =3D& new XY( $param );
return $Obj;
}
}
if ( !$obj =3D& XY::factory( $parameter ) ) {
die( 'Instanz wurde nicht erzeugt' );
}
HTH
Niels
--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------
Re: Klassen - prüfen ob Objekt erstellt wurde
am 05.10.2006 21:02:40 von dafox
Ulf Kadner schrieb:
> Thomas 'DaFox' Hamacher wrote:
>>> geht nicht. kannste nicht vehindern. In PHP5 werden Dir zwar mehr
>>> mittel an die Hand gegeben um über Sichbarkeitsbereiche zu
>>> beeinflussen was normal wie zugänglich ist, aber dort existiert auch
>>> Reflection die das alles irgnoriert.
>> Hä, wie kommst du denn jetzt auf Reflection?
> Nur ein Überlegung. Wieso nicht? Reflection umgeht nunmal Sichbarkeit.
> Im endeffekt aber nicht relevant, da der OP PHP4 nutzt (siehe code)
private static ... sieht stark nach PHP3 aus :)
Ja, und var_dump() und print_r() umgehen auch Sichtbarkeit, aber das
geht ein wenig an der Frage des OP vorbei. Daher meine Nachfrage, wie du
in diesem Kontext auf Reflection kommst :).
>> class Blubb {
>> public function __construct() {
>> throw new Exception("Error");
>> }
>> }
> Eher nicht mit PHP4 ;-)
Der OP nutzt offensichtlich PHP5 und da sollte das Beispiel genau das
tun, was der OP will. Nur das die Exception eben fangen muss.
>>> Halt als Singleton! Damit (statische Zwischenebene) ists kein Problem.
>>
>> Warum sollte man das als Singleton implementieren? Der OP schreibt
>> nirgends, dass er nur eine Instanz der Klasse erzeugen will.
> Nein lies was er schrieb. Er will das false zurueck gegeben wird. So
> wies im seinen Code halt schon ansatzweise drin steht. Das geht nunmal
> nur wenn man alles in eine statische Initialmethode packt, da man den
> Konstruktor nicht dazu überreden kann.
Richtig, aber das ist dann nicht unbedingt als Singleton implementiert
und für den OP wäre ein Singleton hier ungeeignet, da er eben nicht nur
eine Instanz der Klasse erzeugen will.
Re: Klassen - prüfen ob Objekt erstellt wurde
am 05.10.2006 21:10:39 von dafox
Ulf Kadner schrieb:
> Thomas 'DaFox' Hamacher wrote:
>>> geht nicht. kannste nicht vehindern. In PHP5 werden Dir zwar mehr
>>> mittel an die Hand gegeben um über Sichbarkeitsbereiche zu
>>> beeinflussen was normal wie zugänglich ist, aber dort existiert auch
>>> Reflection die das alles irgnoriert.
>> Hä, wie kommst du denn jetzt auf Reflection?
> Nur ein Überlegung. Wieso nicht? Reflection umgeht nunmal Sichbarkeit.
Weil ich das in diesem Zusammenhang nicht wirklich einordnen kann. S.u.
>> class Blubb {
>> public function __construct() {
>> throw new Exception("Error");
>> }
>> }
> Eher nicht mit PHP4 ;-)
Ja, schon klar. Ich wollte damit auch nur verdeutlichen, was der OP
meint und da kann ich Reflection und Sichtbarkeit jetzt nicht so richtig
einordnen.
Verhindern, dass ein Objekt der Klasse erzeugt wird kann man zwar auch mit
private __construct() ...
aber ich glaube, dass sich der OP nur unglücklich ausgedrückt hat, da
sein Codebeispiel nicht so aussieht, als wolle er verhindern, dass ein
Objekt erzeugt wird.
>>> Halt als Singleton! Damit (statische Zwischenebene) ists kein Problem.
>> Warum sollte man das als Singleton implementieren? Der OP schreibt
>> nirgends, dass er nur eine Instanz der Klasse erzeugen will.
> Nein lies was er schrieb. Er will das false zurueck gegeben wird. So
> wies im seinen Code halt schon ansatzweise drin steht. Das geht nunmal
> nur wenn man alles in eine statische Initialmethode packt, da man den
> Konstruktor nicht dazu überreden kann.
Ja, aber das ist nicht zwangsläufig ein Singleton, sondern in diesem
Beispiel vielmehr eine Factory.
Re: Klassen - prüfen ob Objekt erstellt wurde
am 08.10.2006 20:08:50 von kaycee
Erstmal Danke für Eure Aufmerksamkeit.
Hintergrund der ganzen Geschichte ist, dass die Klasse ein JPG-Bild
verwalten soll und die Instanz mit übergabe eines Pfades erzeugt
werden soll also $xy=3Dnew xpic("images/bla.jpg");
Im "Konstrukor" soll dann schon im Vorfeld geprüft werden, ob dieses
Bild ein "echtes" JPG ist oder nicht. Ist das Bild ein JPG -> Objekt
wird erzeugt, ist Bild kein JPG soll kein Objekt erzeugt werden. Das
meinte ich mit dem Hinweis "return false"
Re: Klassen - prüfenob Objekt erstellt wurde
am 08.10.2006 22:41:59 von daniel.gorski
[kaycee@vw-style.net in de.comp.lang.php.misc]
Wenn du dir einen korrekten Vor- und Zunamen in deinem Client zulegst, dann
werden deine Fragen sicherlich weniger gefiltert und schneller beantwortet.
> Hintergrund der ganzen Geschichte ist, dass die Klasse ein JPG-Bild
> verwalten soll und die Instanz mit übergabe eines Pfades erzeugt
> werden soll also $xy=new xpic("images/bla.jpg");
> Im "Konstrukor" soll dann schon im Vorfeld geprüft werden, ob dieses
> Bild ein "echtes" JPG ist oder nicht. Ist das Bild ein JPG -> Objekt
> wird erzeugt, ist Bild kein JPG soll kein Objekt erzeugt werden. Das
> meinte ich mit dem Hinweis "return false"
Nochmal zum Verständins: Konstruktoren haben keine Rückgabewerte ausser dem
Objekt selbst resp. der Referenz auf das selbige. Ein "return false" im
Konstruktor zu schreiben ist somit sinnlos. Ein Konstruktor kann aber, wie
du schon gelesen hast, eine Exception werfen - dies verhindert aber
logischerweise nicht das erstellen eines Objektexemplars.
Nebenbei verstehe ich nicht, was dich daran hindert ein Objekt zu erstellen,
welches eine Exception wirft, wie von Thomas Hamacher angedeutet.
mfg dtg