インスタンス化された静的コンテキストで呼び出すことができるいくつかのPHPメソッドをセットアップしようとしています。これを行うためのいくつかの良い方法は何ですか?たとえば、私は次のことができるようにしたいと思います。
Foo::bar($item);
foo($item)->bar();
2つの別々のクラスを設定し、各関数でthisArgを変更して他の関数に委任することもできますが、もっと良い方法が必要なようです。1つのクラスだけでそれを行うことを考えることができる唯一の方法は、次のようなものです。
function foo($item = null) {
return $item instanceof Foo ? $item : new Foo($item);
}
class Foo {
protected $wrapped;
public function __construct($item = null) {
$this->wrapped = $item;
}
public function get() {
return $this->wrapped;
}
public function bar($item = null) {
isset($this) and $item = &$this->wrapped;
// do stuff with $item
return isset($this) ? $this : $item;
}
}
underscore.phpのコードを見ると、彼らはそのようなことをしています。コンテキストを決定するために使用すると警告が発生する可能性があることを指摘するいくつかの関連する質問をしばらく前に読んだことisset($this)
がありますが、それはうまくいくようです...それに関する更新された考えはありますか?もう1つの可能性は、2つのクラスを作成することです。1つはすべて静的バージョンのメソッドを使用し、もう1つは__callを使用して次のような静的メソッドに委任します。
class _Foo
{
protected $wrapped;
public function __construct($item = null) {
$this->wrapped = $item;
}
public function __call($method_name, $args) {
array_unshift($args, $this->wrapped);
$this->wrapped = call_user_func_array('Foo::' . $method_name, $args);
return $this;
}
}
アイデア?