Ankündigung

Einklappen
Keine Ankündigung bisher.

Anonyme Funktion gibt falschen Wert bzw Datentyp zurück.

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Anonyme Funktion gibt falschen Wert bzw Datentyp zurück.

    Hallo zusammen,

    bin seit ein paar Stunden am Grübeln warum ich nach dem Aufruf einer Methode nicht den richtigen Datentyp bzw. Wert zurück erhalte. Derzeit verwende ich die PHP Version 5.4

    Vielleicht hat jemand ein Idee.

    Kurze Erklärung.

    Ich rufe aus dem Hauptscript die Klasse Foo mit der Methode Test1 auf. Diese enthält einen Trigger, der wiederum einen Callback auf die Klasse CBase macht. Die Klasse führt danach den eigentlichen Callback in der Methode Test1() aus und speichert den Rückgabewert in der $this->method['scalar'] Variable (Array) ab.

    Nach meinen Verständnis sollte doch ein 'return $this->[scalar] = funct....' genügen um den richtigen Wert zu erhalten, oder? Mache ich das gleiche in dem ich die Methode Test2 aufrufe und eine weiter Zeile einfüge 'return $this->method['scalar'];' bekomme ich den richtigen Wert zurück.

    Ist das ein Standart Verhalten von PHP oder ein Bug?

    Vielen Dank für eure Hilfe.

    lg
    Roland

    Hier mal mein Beispiel.
    PHP-Code:
    namespace System;

    class 
    CTrigger implements \ArrayAccess {

      public 
    $type;
      private 
    $collection;
      private 
    $objCallback;

      public function 
    __construct($callback)  {
     
        
    $this->type NULL;
        
    $this->objCallback $callback;
        
    $this->collection = array();
     }

      public function 
    offsetSet($index$value) {
      
        if ((
    gettype($value) == 'object' '\\' .get_class($value) : gettype($value)) == '\Closure') {
      
          
    $this->type $index;
          
    $this->collection['callback'] = $value;
          
    $this->objCallback->__invoke();
        }
      }

      public function 
    offsetExists($index) { return isset($this->collection[$index]); }

      public function 
    offsetUnset($index) { unset($this->collection[$index]); }

      public function 
    offsetGet($index) { return $this->collection[$index]; }

    }

    class 
    CBase {

      protected 
    $method;

      public  function 
    __construct () {
        
        
    // -- Method callback --
        
    $objCallback = function() {
        
          
    $type $this->method->type;
        
          
    $result $this->method['callback']->__invoke();

          
    // -- Do Something --

          
    $this->method[$type] = $result;
        }
      
        
    $this->method = new \System\CTrigger($objCallback);

      }
    }

    class 
    CFoo extends \System\CBase {

      public  function 
    __construct () {
        
    parent::__construct();
      }

      
    // -- Hier wird der DatenTyp \Closure zurückgegeben. Sollte der Wert 10 sein. --
      
    public function Test1 () {  
      
        return 
    $this->method['scalar'] = function () { return 10; };
     
      }

      
    // -- Hier wird der Wert 10 zurückgegeben. --
      
    public function Test2 () {
      
        
    $this->method['scalar'] = function () { return 10; };
        return 
    $this->method['scalar'];
     
      }
    }

    // -- Example --

    $dummy = new \System\CFoo();

    echo(
    $dummy->Test1());  // -- FEHLER -- Datentyp: \Closure
    echo($dummy->Test2()); // -- OK -- Wert: 10 

  • #2
    Bei mir geben beide Test-Methoden ein Closure zurück:

    PHP-Code:
    echo($dummy->Test1()); // -- FEHLER -- Datentyp: \Closure
    echo($dummy->Test2()); // -- FEHLER -- Datentyp: \Closure 
    Das ist auch absolut richtig, da Deine CTrigger-Klasse überhaupt nicht zum Einsatz kommt. Streng genommen kannst Du Dir auch
    PHP-Code:
    class CFoo extends \System\CBase 
    komplett sparen, da Du den Konstruktor von CBase in CFoo ohnehin überschreibst. In beiden Fällen speicherst Du in $this->method das Closure und gibst es mit return wieder zurück, Du führst es aber niergendwo aus

    vg
    jack
    -

    Kommentar


    • Rol@nd
      Rol@nd kommentierte
      Kommentar bearbeiten
      Danke, ausgebessert.

  • #3
    In den Klassen Foo und CBase fehlt "function" vorm __construct

    Kommentar


    • Rol@nd
      Rol@nd kommentierte
      Kommentar bearbeiten
      Danke, ausgebessert.

  • #4
    Hi!

    Beide funktionen sollten einen \Closure zurückgeben. Das ist auch normal.
    Damit du Zehn zurückbekommst musst du die Closure aufrufen. Also:
    PHP-Code:
    $closure $dummy->Test1(); //Closure
    echo $closure(); //int: 10 
    Mein blog | Portfolio

    Kommentar

    Lädt...
    X