__get und Arrays

visiondpc

Erfahrenes Mitglied
Hallo, ich sitze grad an eine Klasse, die dazu dient andere Klassen zu initiieren und dann in einer Art überwachtem Modus laufen zu lassen.

Der Umgang mit Methoden und Variablen klappt problemlos. Wenn ich aber versuche ein Array zu verwenden wird beim schreiben eines Wertes die __get anstatt der __set Methode verwendet.

PHP:
class foo
{
	private $instance = false;
	
	public function __construct($classname)
	{
		$this->instance = new $classname;
	}
	
	public function __call($method, $arguments)
	{
		echo 'Methode '.$method.' wird aufgerufen<br />';
		return call_user_func_array(array($this->instance, $method), $arguments);
	}
	
	public function __set($var, $value)
	{
		echo $var.' wird auf '.$value.' gesetzt<br />';
		$this->instance->$var = $value;
	}
	
	public function __get($var)
	{
		echo 'Der Wert von '.$var.' wird abgefragt<br />';
		return $this->instance->$var;
	}
}

class bar
{
	public $var;
	public $array = array();
	
	public function test($value)
	{
		return $value.' aus Methode test';
	}
	
	public function zeige()
	{
		echo $this->var.'<br />';
		print_r($this->array);
	}
}

$foo = new foo('bar');
$foo->array['key'] = '2';

Im obrigen Beispiel wird nur die Ausgabe Der Wert von array wird abgefragt erzeugt.

Google war leider keine große Hilfe und zeigt nur die Standardfunktionsweisen von __get und __set.
Mein Versuch eine Referenz zu setzen hat leider auch nicht funktioniert.

Kennt jemand eine Möglichkeit, wie man dieses Problem umgehen kann?
 
Er geht davon aus, dass $foo->array ein bereits exisiterender array ist, in den du den Eintrag 'key'=>2 setzen willst. Also muss er den array auslesen -> __get().

als Umgehung dieses Problems kannst du dem Property direkt den array zuweisen
PHP:
$foo = new foo('bar');
$foo->array = array('key' => '2');
 
Danke für die Antwort. Was aber wenn in bar::array schon Werte existieren? Die würden durch diese Methode überschrieben werden.

Sinn des Ganzen ist es auf die Klasse bar zugreifen zu können als wenn ich sie direkt aufgerufen hätte.
 
Du setzt ja in deiner setter-Methode nur eine Variable und nicht das Array, folglich wird $var immer wieder überschrieben.
So müsste es funcktionieren:
PHP:
public function __set($var, $value)
    {
        echo $var.' wird auf '.$value.' gesetzt<br />';
        $this->instance->array[$var] = $value;
    }
 
Zuletzt bearbeitet:
Stimmt, so geht es zwar mit dem Array, aber was ist mit allem anderen?

$foo->var = 'hallo welt';

und

$foo->array['key']['key2'] = '5';

würden so nichtmehr funktionieren.
 
Benenn doch die Klassenvariable um, dann kommst du in keinen Konflikt wenn du die Variable von ausserhalb der Klasse aufrufst.

PHP:
<?php
class foo
{
    private $instance = false;
    
    public function __construct($classname)
    {
        $this->instance = new $classname;
    }
    
    public function __call($method, $arguments)
    {
        echo 'Methode '.$method.' wird aufgerufen<br />';
        return call_user_func_array(array($this->instance, $method), $arguments);
    }
    
    public function __set($var, $value)
    {
        echo $var.' wird auf '.$value.' gesetzt<br />';
        $this->instance->data[$var] = $value;
    }
    
    public function __get($var)
    {
        echo 'Der Wert von '.$var.' wird abgefragt<br />';
        return $this->instance->data;
    }
}

class bar
{
    public $var;
    public $data = array();
    
    public function test($value)
    {
        return $value.' aus Methode test';
    }
    
    public function zeige()
    {
        echo $this->var.'<br />';
        print_r($this->data);
    }
}

$foo = new foo('bar');
$foo->array = array('foo'=>array('bar'=> 2)); // Hier kannst du dein Array setzen mit den Keys
$foo->test = 23;

echo "<pre>";
$foo->zeige();
echo "</pre>";

Edit: Aber eine Mehrfach-Definition vom Array bekommst du so auch nicht hin. Hier würde eventuell das ArrayAccess-Interface helfen, wobei das glaub ich nur 1D-Arrays verarbeiten kann:
http://www.php.net/manual/de/class.arrayaccess.php#97163
 
Zuletzt bearbeitet:
Zurück