Aus mehreren Klassen ein Objekt bilden.

Sorry für den Doppelpost:

Eine kurze Frage habe ich noch.
Was macht die magische Methode __get denn genau. Also prinzipiell?.

Gruß
 
Wenn du in diesem Fall die Eigenschaft als Klassennamen aufrufst, ist diese Eigenschaft ja nicht vorhanden. Die __get-Methode versucht dann eben darauf zu reagieren und im Script kannst du dann selbst entscheiden wie weiter verfahren werden soll.

PHP:
$MyObject = new MyObject();

$MyObject->TestKlassenNamen->Foo();

// Object->Eigenschaft->Methode()
Eine Eigenschaft ist eine Klassenvariable, in diesem Speziellen Fall existiert sie nicht und mit __get kannst du darauf reagieren.
 
Maniac, deine Klasse hat ein Problem. Du erstellst jedes mal eine neue Instanz.

PHP:
class MyClass{
    protected $text = 'na';
    public function setValue($text){$this->text = $text;}
    public function getValue(){return $this->text;}
}

$object->MyClass->setValue('Hallo Welt');
//Das folgende wird 'na' ausgeben da die Klasse eine neue Instanz anlegt.
echo $object->MyClass->getValue();

Das kann man lösen indem mal die Instanzen behält. Also eine Mischung unserer Zwei Vorschläge
PHP:
class MyObject{
    protected $modules = array();
    public function __get($className)    {
        $path = '';
        if(!array_key_exists($className, $this->modules)){
            //Klasse neu instanzieren
            if(file_exists($path . $className . '.php')){
                require_once $path . $className . '.php';
                $this->modules[$className] = new $className();
            }else{
                throw new Exception('Keine Klasse gefunden');
            }
        }
        return $this->modules[$className];
    }
}
 
Hallo,

ich muss das Thema nochmal kurz aufgreifen.
Gibt es die Möglichkeit, Fehlermeldungen zu unterdrücken, wenn man versucht auf ein Objekt zuzugreifen und es nicht vorhanden ist?

Also z.b. $MyObj->Obj2->Methode()

Wobei $MyObj vorhanden ist, aber Obj2 nicht.

Gruß
 
Ungefähr so:

PHP:
class MyObj
{
  private $obj2;

  public function __get($property)
  {
    if( !isset( $this->obj2 ) )
      throw new Exception("Obj2 is not set!");
    return $this->obj2;
  }
}

$MyObj = new MyObj();

try
{
  $MyObj->obj2->Methode();
}
catch(Exception $e)
{
  echo $e->getMessage();
}
 
Zurück