1

私の問題はこれです。クラスの一部である配列に格納されている関数があります。この配列から関数を呼び出したいのですが、これcall_user_func()を書く方法がわかりません。

クラスにない配列から関数を呼び出すことは、そのように行うことができます。

 $thearray = array( 0 => 'funcone', 1 => 'functwo');
 call_user_func($thearray[0]);

ただし、クラス内の配列に対してこれを実行しようとすると、何らかの方法でクラスを参照する必要があるため、作業が送信されます。次のようなクラスから関数を呼び出すことができることを私は知っています:

 call_user_func(array($myclass, 'funcone'));

call_user_func()しかし、私の質問は、 ;を使用して、クラス内にある配列から関数を呼び出す方法です。誰かがこれで私を助けてくれることを願っています.

4

3 に答える 3

2

クラス内の配列がパブリックであると仮定すると、次のことができます。

call_user_func(array($myclass, $myclass->thearray[0]));

それはあなたの質問に答えましたか?

更新

私は次のことを試しましたが、うまくいきました:

<?php
class Foo {
    public function bar() {
        echo "quux\n";
    }

    public $baz = array('bar');
}

$foo = new Foo();
call_user_func(array($foo, $foo->baz[0]));

shell$ php userfunc.php 
quux
于 2012-06-05T05:46:28.463 に答える
0

少し長くなりますので、ご容赦ください。:)

ええと、私たちはPHPのoverloading概念を介してこれを達成できると思います。これは、ほとんどの人が知っているように、他のオブジェクト指向言語とはまったく異なります。

PHPマニュアルのオーバーロードページから- Overloading in PHP provides means to dynamically "create" properties and methods. These dynamic entities are processed via magic methods one can establish in a class for various action types.http://www.php.net/manual/en/language.oop5.overloading.php

このオーバーロードマジックの多くは、PHPのマジックメソッドに依存しています

魔法のメソッドのリストが表示されている場合、ここで役立つのは__call()です。

マジックメソッド__callは、存在しないクラスメソッドが呼び出されるたびに呼び出されます。

これは、エラーのスローを防止したり、カスタムメッセージを設定したりするのに役立ちます。そこで、上記の問題を解決するために使用できる例を次に示します。

<?php
class Test
{
    private $arr = array( 'funcone', 'functwo' );

    public function __call( $func_name, $func_args ) {
        echo "Method called: " . $func_name . "\n";
        echo "Arguments passed: " . $func_args . "\n";

        // this will call the desired function.
        call_user_func( array( $this, $this->arr[ $func_args ] ) );
    }
}

$obj = new Test;
// run the first function in the array
$obj->runTest(0);
?>

お役に立てば幸いです。これがうまくいかない場合は、少し試行錯誤して微調整できると確信しています。(今、私はPHPについて話しているのですよね?微調整...;))

于 2012-06-05T06:12:19.787 に答える
0

これを試して?

call_user_func(array($this, $thearray[0]));

http://codepad.org/lCCUJYLK

于 2012-06-05T05:50:42.183 に答える