2

静的関数への参照を取得して実行することは可能ですか? このような:

namespace vendor\foo;

class Bar
{
    public static function f1()
    {
        echo 'f1';
    }
    public static function f2($id)
    {
        echo 'f2: '.$id;
    }

}

$fs = array(
    'f1'=>\vendor\foo\Bar::f1,
    'f2'=>\vendor\foo\Bar::f2
);

$fs['f1']();
$fs['f2']('some id');

または唯一の方法はcall_user_func

注: php 5.3

4

4 に答える 4

0

これを行うには複数のオプションがあります

  1. クラス名とメソッド名に文字列変数を使用する
  2. call_user_func() と一緒にコールバックを使用する
  3. リフレクションの使用

次の例は、これらのオプションを示しています。

<?php

namespace vendor\foo;

class Bar {

    public static function foo($arg) {
        return 'foo ' . $arg;
    }   
}

オプション 1 : クラス名とメソッド名に文字列変数を使用する:

/* prepare class name and method name as string */
$class = '\vendor\foo\Bar';
$method = 'foo';
// call the method
echo $class::$method('test'), PHP_EOL;
// output : foo test

オプション 2: コールバック変数を Perpare して、次の場所に渡しますcall_user_func()

/* use a callback to call the method */
$method = array (
    '\vendor\foo\Bar', // using a classname (string) will tell call_user_func()
                       // to call the method statically
    'foo'
);

// call the method with call_user_func()
echo call_user_func($method, 'test'), PHP_EOL;
// output : foo test

オプション 3: ReflectionMethod::invoke() を使用します。

/* using reflection to call the method */
$method = new \ReflectionMethod('\vendor\foo\Bar', 'foo');

// Note `NULL` as the first param to `ReflectionMethod::invoke` for a static call.
echo $method->invoke(NULL, 'test'), PHP_EOL;
// output : foo test
于 2013-01-08T01:02:00.117 に答える
0

これが PHP 5.3 でサポートされているかどうかは覚えていませんが、5.4 ではこれを行うことができます。

<?php
namespace Vendor;

class Foo
{
  public static function bar()
  {
    echo "bar\n";
  }
}

$funcs = [
  'bar' => ['\Vendor\Foo', 'bar']
];

$funcs['bar']();
于 2013-01-07T19:18:50.567 に答える
0

PHP 5.3 では、使用されているコールバックのタイプによって異なります。オブジェクトのメソッドであるあなたが示した例は、説明されている方法では呼び出すことができません。例が手続き型関数であった場合は、指定したコードを使用して呼び出すことができます。

技術的な理解からなぜこれが当てはまるのかはわかりませんが、PHPパーサーが名前付きの関数を探して\vendor\foo\Bar::f1、それを見つけることができないと推測しています。$var()変数関数、つまりを呼び出したい場合は、オブジェクト メソッドではなく関数である$var 必要があります。変数メソッドを呼び出したい場合は、以下の例を確認してください。


次の例は、可変静的オブジェクト メソッドを呼び出す有効な方法です。

<?php

class Foo {

    public static function a() {
        echo 'Foo::a()';
    }

    public static function b() {
        echo 'Foo::b()';
    }

}


$foo = 'Foo';
$aFunc = 'a';
$bFunc = 'b';

$foo::$aFunc();
Foo::$bFunc();
call_user_func('Foo::' . $aFunc);
call_user_func(array($foo, 'b'));

?>
于 2013-01-07T21:48:34.103 に答える
-1

はい、可能です。しかし、あなたがしようとしている方法はうまくいきません。callableを使用する必要があります:

$fs = array(
    'f1'=>array('\vendor\foo\Bar', 'f1'),
    'f2'=>array('\vendor\foo\Bar', 'f2')
);

$fs['f1']();
$fs['f2']('some id');
于 2013-01-07T18:47:11.077 に答える