andi_b: PHP :: objektreferenzen aus funktion

moijen alle,

ich habe mir gerade die featurelist von php5 durchgelesen und bin dabei auf eine für mich interessante stelle gestossen: objektrefenzen aus funktionen zurückgeben http://php5.de/zend-engine-2.php.

dort steht, dass das neu wäre. jetzt habe ich das mal in 4 probiert und es funktioniert auch. ist an dem beispiel jetzt was dran, was 'gefährlich' ist (irgendwelche objekte, die zu früh gelöscht werden könnten)?

danke für eure hilfe,

andi

<?php
/*---------------------------
 parent class for extending
---------------------------*/
class parentClass{
 function parentClass(){
  out::o("constructing class parentClass");
 }

function insideParent($string = ""){
  out::o("calling parentClass".$string);
 }
}
/*---------------------------
 child classes
---------------------------*/

class bum extends parentClass {
 function bum(){
  parent::parentClass();
  out::o("constructing class bum");
 }
}

class bam extends parentClass {
 function bam(){
  out::o("constructing class bam");
 }
}
/*---------------------------
 class instantiating the child classes, returns reference to object
---------------------------*/

class constructionClass{
 function constructionClass(){
  out::o("constructing class constructionClass");
 }

function caller($string){
  switch ($string){
   case "bum":
    $bumInside = &new bum();
    return $bumInside;
    break;
   case "bam":
    $bamInside = &new bam();
    return $bamInside;
    break;
   default:
    out::o("ERROR: no valid parameter");
    break;
  }
 }
}
//***************************
/*---------------------------
 main
---------------------------*/
$cc = &new constructionClass();
out::o("---");

$bum = &$cc->caller("bum");
$bam = &$cc->caller("bam");
out::o("---");

$bum->insideParent();
$bam->insideParent();
out::o("---");

$bumStatic = &caller("bum");
$bamStatic = &caller("bam");
$bumStatic->insideParent();
$bamStatic->insideParent();

//END main
//***************************

/*---------------------------
 static function, same as in constructionClass
---------------------------*/
function caller($string){
 switch ($string){
  case "bum":
   $bumInside = &new bum();
   return $bumInside;
   break;
  case "bam":
   $bamInside = &new bam();
   return $bamInside;
   break;
  default:
   out::o("ERROR: no valid parameter");
   break;
 }
}
/*---------------------------
 function for output
---------------------------*/
class out{
 function o($out){
  echo $out."<br />";
 }
}
?>

  1. Hello,

    ich habe mir gerade die featurelist von php5 durchgelesen und bin dabei auf eine für mich interessante stelle gestossen: objektrefenzen aus funktionen zurückgeben http://php5.de/zend-engine-2.php.

    dort steht, dass das neu wäre. jetzt habe ich das mal in 4 probiert und es funktioniert auch. ist an dem beispiel jetzt was dran, was 'gefährlich' ist (irgendwelche objekte, die zu früh gelöscht werden könnten)?

    Welche 4er-Version ist denn im Einsatz. Das finde ich aber sehr interessant...

    Liebe Grüße aus http://www.braunschweig.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. Welche 4er-Version ist denn im Einsatz. Das finde ich aber sehr interessant...

      getestet auf 4.3.4 windows und 4.3.3 linux
      keine notices/warnings

      andi

  2. Hi!

    ich habe mir gerade die featurelist von php5 durchgelesen und bin dabei auf eine für mich interessante stelle gestossen: objektrefenzen aus funktionen zurückgeben http://php5.de/zend-engine-2.php.

    Ja, das geht prinzipiell auch in PHP 4, auf welchen Abschnitt beziehst Du Dich genau? "Dereferencing objects returned from functions" -> http://www.zend.com/php5/articles/engine2-php5-changes.php#Heading13?

    dort steht, dass das neu wäre.

    Wenn Du das meinst was ich glaube, da steht im Beispiel:

    ShapeFactoryMethod("Circle")->draw();

    sowas geht halt nicht in PHP4, aber in PHP5.

    jetzt habe ich das mal in 4 probiert und es funktioniert auch.

    Hast Du das Beispiel dort ausprobiert?

    ist an dem beispiel jetzt was dran, was 'gefährlich' ist (irgendwelche objekte, die zu früh gelöscht werden könnten)?

    Sorry, Dein Beispiel ist mit etwas zu lang um mich da jetzt reinzudenken ;-)

    Bzgl. PHP5, den Änderungen, Migration... findest Du (und alle die das noch interessiert ;-)) auf folgenden Seiten ne Menge Infos:

    http://www.zend.com/php5/
    vor allem:
      - http://www.zend.com/php5/in-depth.php
      - http://www.zend.com/php5/whats-new.php
      - http://www.zend.com/php5/migration.php
    http://www.sitepoint.com/article/coming-soon-webserver-near
    http://talks.php.net/show/migrating-ffm/
    http://talks.php.net/show/php5_ca/

    PHP5 stable soll Anfang Juli kommen, lohnt sich also langsam sich mal näher mit den neuen Möglichkeiten zu beschäftigen, gerade bei OOP, XML, SOAP, .NET und DB hat sich ne Menge getan. Und wahrscheinlich gibt es auch wieder GIF-Create Support.

    Den letzten Release-Candidate runterladen: http://de3.php.net/downloads.php#v5

    PHP4 und PHP5 parallel verwenden: http://www.sitepoint.com/blog-post-view.php?id=159852

    Grüße
    Andreas

    --
    SELFHTML Tipps & Tricks: http://aktuell.de.selfhtml.org/tippstricks/
    1. hi,

      ShapeFactoryMethod("Circle")->draw();

      sowas geht halt nicht in PHP4, aber in PHP5.

      jo, das hatte ich auch schon getestet. ist aber nicht so dramatisch, da es ja eh das gleiche macht. nebenbei hat man den vorteil, dass man kein 'anonymes' objekt zurückbekommt und es dadurch öfter nutzen kann.

      jetzt habe ich das mal in 4 probiert und es funktioniert auch.
      Hast Du das Beispiel dort ausprobiert?

      ja, wie gesagt 4.3.4 (win), 4.3.3 (linux)

      andi

      1. Hi!

        ShapeFactoryMethod("Circle")->draw();

        sowas geht halt nicht in PHP4, aber in PHP5.
        jo, das hatte ich auch schon getestet. ist aber nicht so dramatisch, da es ja eh das gleiche macht. nebenbei hat man den vorteil, dass man kein 'anonymes' objekt zurückbekommt und es dadurch öfter nutzen kann.

        Was meinst Du mit "anonymes Objekt"? Das angesprochene, neue Feature von PHP 5 ermöglicht halt eine Syntax, die vorher nicht möglich war, welche IMHO allerdings auch eher selten gebraucht wird.

        btw.: Wenn Du von einer Funktion eine Referenz auf ein Objekt zurückgeben willst macht man das (mit PHP4) so: http://de3.php.net/manual/de/language.references.return.php
        (sonst bekommst Du eine Kopie!)

        Grüße
        Andreas

        --
        SELFHTML Tipps & Tricks: http://aktuell.de.selfhtml.org/tippstricks/
        1. Was meinst Du mit "anonymes Objekt"? Das angesprochene, neue Feature von PHP 5 ermöglicht halt eine Syntax, die vorher nicht möglich war, welche IMHO allerdings auch eher selten gebraucht wird.

          ...dass man das zurückgegebene objekt nur für diesen einen aufruf nutzen kann, danach ist es wieder weg - hat ja keine referenz mehr. dieser fall schränkt sich auch meiner meinung stark ein.

          btw.: Wenn Du von einer Funktion eine Referenz auf ein Objekt zurückgeben willst macht man das (mit PHP4) so: http://de3.php.net/manual/de/language.references.return.php
          (sonst bekommst Du eine Kopie!)

          uiuiui... danke für den tip. dann habe ich das bis jetzt falsch gemacht. aber zu deinem kommentar oben: dieser jenige anwendungsfall ist schon wieder viel brauchbarer, da man z.b. eine komplette form-result.php in eine klasse auslagern kann, die dann je nach situation die objekte passend initialisiert. bis jetzt hatte ich nämlich immer das problem dass diese result-seiten ellenlange switch-verzweigungen enthalten und somit nicht sonderlich übersichtlich waren...

          danke nochmal, andi

        2. nur der vollständigkeit halber - die funktionsdefinition aus dem beispiel muss heissen:

          function &caller($string){
          //....