Referenz zurückgeben / chainability

'nabend allerseits,

ich habe ein Object, das ein array mit anderern Objekten hat. Ich würde gerne in php 4.x eine reference auf ein inneres Objekt so zurückgeben, das ich die Methodenaufrufe verketten kann.

ein kleines Beispiel:

class Sardine{
 var $name;
 function Sardine( $name ){
 $this-\>name = $name;
 }

 function sprich(){
 echo ''sardine schweigt";
 }
}

class Dose{
 var sardinen = Array();

 function Dose( $sardinencount ) {
 for ( $i = 0; $isardinen[] = new Sardine( 'sard' . $i );
 }

 function &getSardineByName( $name ){
 for( $i=0; $isardinen ); $i++){
 if( $this-\>sardinen[$i]-\>name == $name ) return $this-\>sardinen[$i];
 }
 }
}


$dose = new Dose(15);

// so gehts
$fisch &= $dose-\>getSardineByName( 'sard2' );
$fisch-\>sprich();

// so geht es aergerlicherwise nicht:
$dose-\>getSardineByName( 'sard2' )-\>sprich();

Hat jemand eine Idee wie sich solche Aufrufe sinnvoll verketten lassen?
Ich brauche eine Referenz, da ich das Orginalobjekt (sardine) auch von aussen verändern können will.
($dose->getSardineByName( ‚sard2‘ )->name = ‚Herman Toothrot‘; )

Hat jemand eine Idee dazu? Ich bin mit meinem php am ende.

Danke schonmal & Gruß
vbt

Hi,

ich hab’ dein Beispiel mal nach korrektur der Flüchtigkeitsfehler ausgeführt und rumprobiert, bin auf genausoviel gekommen wie du, nämlich dass PHP das direkte Ansprechen von Funktionsrückgaben, die nicht in einer Variable zwischengespeichert wurden, verbietet. Das gilt nicht nur bei Referenzen und nicht nur bei Objekten:

//Das funktioniert geauso wenig…
function meer()
{
return array(‚Flunder‘, ‚Pottwahl‘);
}
echo meer()[0];

//…wie das hier
function meer()
{
$var = new Sardine(‚anonym‘);
return $var;
}
meer()->sprich();

//…oder das hier (referenz)
function &meer()
{
$var = new Sardine(‚anonym‘);
return $var;
}
meer()->sprich();

Aber was ist so schlimm daran, die Zurückgegebene Referenz erst zwischenzuspeichern?

$temp =& $dose->getSardineByName( ‚sard2‘ );
$temp->name = ‚Herman Toothrot‘;

Das funktioniert doch genau wie

$dose->getSardineByName( ‚sard2‘ )->name = ‚Herman Toothrot‘;

Würd mich freuen mehr darüber zu hören, interessiert mich jetzt.

Hallo,

Hat jemand eine Idee dazu? Ich bin mit meinem php am ende.

Das geht leider erst mit PHP5, in PHP4 geht der Zugriff nicht, ohne das Ergebnis der Funktion in einer Variable zwischenzuspeichern.

Alexander

hey,

alx hat Recht. Geht nicht.

Ich habe mir mit einer Methode von Dose beholfen, die als Argumente einen Sardienennamen, einen Sardienen-Methodennamen und n Argumente übernimmt und dann den Rückgabewert durchschleift.

Ziemlich grausig, aber so gehts.

gruß
vbt.