0

ミニフレームワークがロードされると、多くのオブジェクトを初期化するオートローダーがあります。オブジェクトは静的変数として保存されますが、問題が発生しました。オートローダーでインスタンス化されたファイルがありますが、呼び出されたときに特別なケースを処理して、後で例外ハンドラーのように使用されます。このクラス内のメソッドがクラス オブジェクトである $this を返すことを意図していますが、その場合、返される値は呼び出されたオブジェクトのインスタンスではなく、それを呼び出したクラスに継承されます。さらに、呼び出された exception_handler はそれ自体のインスタンスであるだけでなく、オートローダー全体でインスタンス化されたすべてのものであり、すべてがロードされるときに $this を継承します。紛らわしいですが、小さな例を作成しました:

class a {
    public $a_tmp = 'tmp';
}

class b extends a {
    public $b_tmp = 'tmp';

    public function getOnlyThisClass() {
        return $this;
    }
}

$b = new b();
$b->getOnlyThisClass();

これは以下を返します:

object(b)#1 (2) {
  ["b_tmp"]=>
  string(3) "tmp"
  ["a_tmp"]=>
  string(3) "tmp"
}

そして、特別なメソッドが呼び出されたときに、呼び出されたクラスのみを返す必要があります。これは工場出荷時のパターンで修正できることはわかっていますが、この場合は避けたいと思います。

ありがとう。

4

1 に答える 1

0

Reflection を使用して、継承されたプロパティを使用せずにクラス オブジェクトのプロパティを取得してみてください。

<?php

class a {
    public $a_tmp = 'tmp';
}

class b extends a {
    public $b_tmp = 'tmp';

    public function getOnlyThisClass() {
        $cl       = new stdClass();
        $refclass = new ReflectionClass($this);
        foreach ($refclass->getProperties() as $property)
        {
            $name = $property->name;
            if ($property->class == $refclass->name) {
                $cc = $property->name;
                $cl->$cc = $this->$name;
            }
        }
        return $cl;
    }
}
$b = new b();
var_dump($b->getOnlyThisClass());

出力:

object(stdClass)#2 (1) { ["b_tmp"]=> string(3) "tmp" } 

stdClass を作成し、そこに見つかったプロパティを割り当てることができます。必要に応じてこれを終了します。

于 2013-01-09T09:28:31.963 に答える