前回はこちら
例えば、$obj->ex = 'sleep'; として $obj->ex(); としても sleep は使えないですよね。ま、当然の話しで、オブジェクトメソッドを指定しているのに、オブジェクトにそのメソッドが無い。
※ $obj に sleep というメソッドがあれば call 出来ます。
実際に書いてみたのが以下のコード。書くまでも無くエラーになりますw
class foo{
function foo(){
$this->ex = 'she';
$this->ex();
}
}
// 確認用コード
// 呼び出す関数
function she(){echo 'Hi!';}
// 実装
$obj = new foo();// 結果 Call to undefined method foo::ex()
function foo(){
$this->ex = 'she';
$this->ex();
}
}
// 確認用コード
// 呼び出す関数
function she(){echo 'Hi!';}
// 実装
$obj = new foo();// 結果 Call to undefined method foo::ex()
当然、クラスの外で呼び出してやっても(例えば $obj->ex(); )エラーになります。
クラスメソッドにないものを指定している訳なので言わずもがななんですが。
んが、これ、create_function でオブジェクト内で生成した関数でもコールできません。create_function は、オブジェクト内で使っても $this を引き継げないことから、起動しているベースがオブジェクト外なんですね。おそらく。
結局、コアな環境でオブジェクト内にメソッドそのものを生成や追加する方法がない。もっとも。精通しているって程のもんじゃないので、推測の域をでませんがw。
詰まるところ生成や追加する方法がない限り、クラス内などでネイティブに記述した関数名しかコールできないんすね。敢えてそうしてある気もする。
が、拡張では色々できるようなので、スタンスが分からない。汗
ただ。可変関数とは言え、変数内はただの string のハズなので、コールが目的なら一旦、別の変数に入れてやれば呼びだせる様になります。結局はオブジェクトメソッドの指定から外して外部の関数をコールしてやるということです。
当然、ラッパーを用意すれば、自分自身のメソッドだろうと他人のメソッドだろうと呼び出せますし、$this も渡せます。
class foo{
function foo(){
$this->ex = 'she';
$call = $this->ex;
$call();
}
}
// 確認用コード
// 呼び出す関数
function she(){echo 'Hi!';}
// 実装
$obj = new foo();// 結果 Hi!
function foo(){
$this->ex = 'she';
$call = $this->ex;
$call();
}
}
// 確認用コード
// 呼び出す関数
function she(){echo 'Hi!';}
// 実装
$obj = new foo();// 結果 Hi!
当たり前ですが、クラスの外に記述してもOKです。例えば $i = $obj->ex; $i();
っと。これでコールできるようになった訳ですが、これはオブジェクトメソッド内から外部の関数を呼び出しているに過ぎません。
一応 call_user_func を使っても静的には呼び出せます。
結局、新規メソッドをオブジェクトメソッドの指定でコールできるってのは、あれこれ遣り繰りしなくても、動的に追加できるって事と等価なんじゃないかな。当然 $this も渡るハズですし。
ふう。前回の補足おわり。前回と言いながら同日ですw
いやぁ。いつもよりアクセスが伸びたので焦りましたw。
誤解されそうなのに流したままは、やっぱ無責任ですし。Webって怖いw
いやぁ。いつもよりアクセスが伸びたので焦りましたw。
誤解されそうなのに流したままは、やっぱ無責任ですし。Webって怖いw



この記事へのコメント