Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Я думаю, что вы ищете call_user_func
.
Пример из руководства PHP:
<?php
function barber($type) {
echo "You wanted a $type haircut, no problem";
}
call_user_func('barber', "mushroom");
call_user_func('barber', "shave");
?>
Вы также можете использовать call_user_func_array()
. Он позволяет передавать массив параметров в качестве второго параметра, поэтому вам не нужно точно знать, сколько переменных вы передаете.
Я знаю исходный вопрос, заданный о PHP 4.3, но сейчас прошло несколько лет, и я просто хотел отстаивать свой предпочтительный способ сделать это в PHP 5.3 или новее.
PHP 5.3+ сейчас включает поддержку анонимных функций (закрытий) , поэтому вы можете использовать некоторые стандартные методы функционального программирования, как в таких языках, как JavaScript и Ruby (с несколькими оговорками). Переписывание приведенного выше примера call_user_func в «стиле закрытия» будет выглядеть следующим образом:
$barber = function($type) {
echo "You wanted a $type haircut, no problem\n";
};
$barber('mushroom');
$barber('shave');
Очевидно, это не так много покупает в этом примере - сила и гибкость приходят, когда вы передаете эти анонимные функции другим функциям (как в исходном вопросе). Поэтому вы можете сделать что-то вроде:
$barber_cost = function($quantity) {
return $quantity * 15;
};
$candy_shop_cost = function($quantity) {
return $quantity * 4.50; // It's Moonstruck chocolate, ok?
};
function get_cost($cost_fn, $quantity) {
return $cost_fn($quantity);
}
echo '3 haircuts cost $' . get_cost($barber_cost, 3) . "\n";
echo '6 candies cost $' . get_cost($candy_shop_cost, 6) . "\n";
Это может быть сделано с помощью call_user_func, конечно, но я считаю этот синтаксис более ясным, особенно после того, как будут задействованы пространства имен и переменные-члены.
Одно предостережение: я буду первым, кто признает, что я точно не знаю, что здесь происходит, но вы не можете всегда вызывать замыкание, содержащееся в членной или статической переменной и, возможно, в некоторых других случаях. Но переназначение его на локальную переменную позволит ему вызываться. Так, например, это даст вам ошибку:
$some_value = \SomeNamespace\SomeClass::$closure($arg1, $arg2);
Но это простое решение проблемы:
$the_closure = \SomeNamespace\SomeClass::$closure;
$some_value = $the_closure($arg1, $arg2);
В php это очень просто.
<?php
function here() {
print 'here';
}
function dynamo($name) {
$name();
}
//Will work
dynamo('here');
//Will fail
dynamo('not_here');
function foo($function) {
$function(" World");
}
function bar($params) {
echo "Hello".$params;
}
$variable = 'bar';
foo($variable);
Кроме того, вы можете сделать это таким образом. См. переменные функции .
Если вам нужна функция pass с параметром как параметр, вы можете попробовать следующее:
function foo ($param1){
return $param1;
}
function bar ($foo_function, $foo_param){
echo $foo_function($foo_param);
}
//call function bar
bar('foo', 'Hi there'); //this will print: 'Hi there'
Надеюсь, это будет полезно ...