Ответ 1
Я создал более короткую версию, которая работает так же, как call_user_func(), и протестировала ее на всех разных типах в руководстве PHP для обратных вызовов/вызовов. Таким образом, вы можете использовать его практически в любом месте. call_user_func() не принимает только объекты, и мне не показалось, что эта функция должна либо, так как она обрабатывает только обратные вызовы.
Тесты и предложения о том, как их использовать, приведены ниже, и я надеюсь, что это поможет:
function getNrOfParams($callable)
{
$CReflection = is_array($callable) ?
new ReflectionMethod($callable[0], $callable[1]) :
new ReflectionFunction($callable);
return $CReflection->getNumberOfParameters();
}
Тест и его результат целиком:
<?php
class Smart
{
public function __invoke($name)
{
}
public function my_callable($one, $two, $three)
{
}
public static function myCallableMethod($one, $two)
{
}
public static function who()
{
echo "smart the parent class";
}
}
class Smarter extends Smart
{
public static function who()
{
echo "smarter";
}
}
function my_ca($one)
{
}
function getNrOfParams($callable)
{
$CReflection = is_array($callable) ? new ReflectionMethod($callable[0], $callable[1]) : new ReflectionFunction($callable);
return $CReflection->getNumberOfParameters();
}
// Test 1 Callable Function
echo "Test 1 - Callable function:" . getNrOfParams('my_ca');
// Test 2 Static method
echo " Test 2 - Static class method:" . getNrOfParams(array('Smart', 'myCallableMethod'));
// Test 3 Object method
$smart = new Smart();
echo " Test 3 - Object method:" . getNrOfParams(array($smart, 'my_callable'));
// Test 4 Static method call (As of PHP 5.2.3)
//echo " Test 4 - Static class method call:" . getNrOfParams('Smart::myCallableMethod');
// Calling a static method this way does not work in ReflectionFunction.
// However, Test 2 provides a solution.
// Test 5 Relative static method (As of PHP 5.3.0)
//echo " Test 5 - Relative static class method:" . getNrOfParams(array('Smarter', 'parent::who'));
// Calling a relative static method doesn't work either. ReflectionMethod lacks support.
// All other tests work.
// Tesy 6 __invoke
echo " Test 6 - __invoke:" . getNrOfParams(array($smart, '__invoke'));
// Test 7 Closure
$closure = function($one, $two, $three)
{
// Magic
};
echo " Test 7 - Closure:" . getNrOfParams($closure);