問題が発生しましたが、これが正常な動作なのか、何か間違った書き方をしたのかわかりません。基本クラスに、特定のクラスのすべての新しいインスタンスのプロキシを作成することにより、特定のクラスにグローバルフィルターを適用するメソッドがあります。私がそれについて行くことを計画した方法は次の通りです:
static $global_filter
フィルタリングしたいクラスに(プロキシ)をアタッチします。これにより、基本クラスが拡張されます。object
- ロードメカニズムを介して、新しいインスタンス化時に実際のクラスの代わりにプロキシを返します(これにより、メソッド呼び出しがマスクされ、それに応じてフィルターが適用されます)
ただし、手順1static $global_filter
で行き詰まり、フィルタリングしたい子孫クラスに割り当てようとすると、基本クラスobject
にも同じ割り当てが割り当てられ、それ以降のすべてが中断されるようです。
関連するコードについては、以下を参照してください。
class object {
public static $global_filter;
public function _filterGlobal($class, $method, $callback) {
if ( !is_object($class::$global_filter) ) {
$class::$global_filter = new filterable(null);
# Replace the object being called with the new proxy.
}
var_dump($class);
var_dump($class::$global_filter); // `filterable`
var_dump(\core\blueprint\object::$global_filter); // Returns same as line above
die();
return $class::$global_filter->_add($method, $callback);
}
}
$class::$global_filter
と(基本クラス)の両方\core\blueprint\object::$global_filter
が同じインスタンスを返しています。私object::$global_filter
はnullになると思っていましたが。
一貫性を維持するためにレイトスタティックバインディングを使用していません(単一オブジェクトフィルターとグローバルフィルターの両方が非静的にほとんど同じ方法で呼び出されます)。
どんな助けでも大歓迎です:)
編集、完全な例
これは具体的なクラスになりますmodel
。object
<?php
use core\blueprint\model;
class modelMock extends model {
protected $schema = array();
public function method($test) {
return $test;
}
}
これは別のオブジェクト(コントローラーなど)であり、これも拡張されobject
ます。のすべての新しいインスタンスにフィルターを適用しますmodel
<?php
use core\blueprint\object;
class objectMock extends object {
public function applyFilters() {
$this->_filterGlobal('core\blueprint\model', 'method', function($self, $chain) {
$chain->params[0] = 'new param'; // adjust the paramters
return $chain->next();
});
}
}