2012-05-11 22 views
2

PHP 5.2.1のコールバックとしてインスタンスメソッドを使用しようとしています。私は、PHP 5.4ではクロージャ内で$thisを使用でき、PHP 5.3では$thisという名前を$selfに変更し、クロージャに渡すことができることを認識しています。しかし、PHP 5.2.1で動作するためには、これらのメソッドでは十分ではありません。 2つのコメント行は私の最後の試みでした。その結果、Fatal error: Call to a member function hello() on a non-objectになります - とにかく、PHP 5.2.1でインスタンスメソッドへのコールバックができますか?

<?php 

class Test { 

    public function __construct() { 
     $self = &$this; 

     $cb = function() use ($self) { 
      $self->hello(); 
     }; 
     call_user_func($cb); 


     // $cb = create_function('$self', '$self->hello();'); 
     // call_user_func($cb); 

    } 

    public function hello() { 
     echo "Hello, World!\n"; 
    } 
} 

$t = new Test(); 

答えて

1
$cb = create_function('$self', '$self->hello();'); 

これはちょうど$selfと呼ばれるパラメータを取ることができます機能を作っています。これは、これと同じです:

function test($self){ 
    $self->hello(); 
} 

あなたが渡して試すことができ、あなたがそれを呼び出す関数に$self(または$this):

call_user_func($cb, $this); 

あなたはまたように、グローバル変数を$self作ってみることができますcreate_functionによって作成された無名関数がそれを読むことができます。

call_user_func(array($this, 'hello')); 

http://us3.php.net/manual/en/language.types.callable.php

+0

ああ、完璧! – v0idless

+0

私は助けることができる嬉しい:-) –

3

オブジェクトが含まれるように配列を渡しますか?

class Test { 

    public function __construct() { 
     $this -> funcName($this); 
    } 

    public function funcName($obj) { 
      $obj->hello(); 
    } 

    public function hello() { 
     echo "Hello, World!\n"; 
    } 
} 

更新:ちょうどコードをテストしました。彼らはこれを使ってうまく動作しています。

call_user_func_array(array($self, "hello"), array()); 
+0

本当に正しいです。この特定のコンテキストでcall_user_funcを変更できないように指定する必要がありました。ロケットのソリューションは正確に適合します。 – v0idless

1

どの程度SIMPLICITY

$GLOBALS['mySelf'] = $self; 
$cb = create_function('', 'global $mySelf; $mySelf->hello();'); 
call_user_func($cb); 
// You may want to unset this when done 
unset($GLOBALS['mySelf']); 
+1

+1これは簡単なことですが、これは私が遵守しなければならない特定のインタフェースの複雑な例です。 – v0idless

関連する問題