3

クラスを自動ロードしていて、使用時にクラスを動的にインスタンス化する方法が必要です。

親クラスに20のクラスのインスタンス化を設定する代わりに、呼び出されたときにクラスをインスタンス化する方法が必要です。

例えば:

$this->template->render();

インスタンス化されます

$this->template = new Template();

私はこれを試みました

public function __set($name, $value)
{
    return $this->$name;
}

public function __get($name)
{
    $this->$name = new $name();
}

これはうまくいかないようですが、私も間違っていると思います。

私が理解できない問題の1つは、クラスが\System名前空間にあることです。エラーが発生したり、発生しnew "\System".$name()たりすることなく、取り組むことができないようです。new \System.$name()

4

3 に答える 3

4
private $_template;
public function __set($name, $value)
{
  $this->{'_' . $name} = $value;
}

public function __get($name)
{
  if (!$this->{'_' . $name}) {
    $classname = '\\System\\' . ucfirst($name);
    $this->{'_' . $name} = new $classname();
  }
  return $this->{'_' . $name};
}
于 2012-04-19T20:59:10.690 に答える
3

__getは値を返す必要があります。そのような:

public function __get($name)
{
    $this->$name = new $name();
    return $this->$name;
}

パズルの一部です。

あなたが言ったことから、 __set はまったく必要ありません-同等のプロパティが保護されていると宣言されていて、インスタンスの外部から設定する場合を除きます(しかし、なぜそれを行うのですか)。

@KingCrunch で示されているように、名前空間付きのクラスを次のように参照できます。

$classname = '\\System\\' . ucfirst($name);
$foo = new $classname;
于 2012-04-19T21:05:42.993 に答える
1

あなたはおそらくこれをもっと探しています:

public function __set($name, $value)
{
    $this->$name = $value;
}

public function __get($name)
{
    if (isset($this->$name)) {
        return $this->$name;
    }

    $class = sprintf('\\System%s', ucfirst($name));
    return $this->$name = new $class();        
}

クラス名を処理し、割り当てが実際に行われたことを確認します(コードにはありませんでした)。

于 2012-04-19T21:04:24.137 に答える