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.
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
Kommentar