Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
Это работает оба пути - необходимо использовать правильный синтаксис
// Non static call
call_user_func( array( $obj, 'method' ) );
// Static calls
call_user_func( array( 'ClassName', 'method' ) );
call_user_func( 'ClassName::method' ); // (As of PHP 5.2.3)
Опция 1
// invoke an instance method
$instance = new Instance();
$instanceMethod = 'bar';
$instance->$instanceMethod();
// invoke a static method
$class = 'NameOfTheClass';
$staticMethod = 'blah';
$class::$staticMethod();
Опция 2
// invoke an instance method
$instance = new Instance();
call_user_func( array( $instance, 'method' ) );
// invoke a static method
$class = 'NameOfTheClass';
call_user_func( array( $class, 'nameOfStaticMethod' ) );
call_user_func( 'NameOfTheClass::nameOfStaticMethod' ); // (As of PHP 5.2.3)
Опция 1 быстрее, чем Опция 2, так попытайтесь использовать их, если Вы не знаете сколько аргументов Ваша попытка быть передающими к методу.
<час>Редактирование: Предыдущий редактор сделал отличную работу по чистке моего ответа, но удалил упоминание о call_user_func_array, который отличается тогда call_user_func.
PHP имеет
mixed call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] )
http://php.net/manual/en/function.call-user-func.php
И
mixed call_user_func_array ( callable $callback , array $param_arr )
, http://php.net/manual/en/function.call-user-func-array.php
Используя call_user_func_array является порядками величины, медленнее тогда использующими любую упомянутую выше опцию.
Вы имеете в виду как это?
<?php
class A {
function test() {
print 'test';
}
}
$function = 'test';
// method 1
A::$function();
// method 2
$a = new A;
$a->$function();
?>
call_user_func(array($object, 'methodName'));
для получения дополнительной информации, посмотрите php документация обратного вызова.
РЕДАКТИРОВАНИЕ: Я просто разработал то, что Вы пытались спросить... ах хорошо.. оставит мои комментарии внутри так или иначе. Можно заменить названиями классов и методов с переменными, если Вам нравится.. (но Вы являетесь сумасшедшими) - зарубка
<час>Для вызывания функции из класса, можно сделать это один из двух путей...
Любой можно создать экземпляр класса, и затем назвать его. например:
$bla = new Blahh_class();
$bla->do_something();
или... можно вызвать функцию статически.. т.е. без экземпляра класса. например:
Blahh_class::do_something()
, конечно, действительно необходимо объявить, что функция статична:
class Blahh_class {
public static function do_something(){
echo 'I am doing something';
}
}
, Если класс не определяется как статичный, то необходимо создать экземпляр объекта.. (таким образом, объекту нужен конструктор), например:
class Blahh_class {
$some_value;
public function __construct($data) {
$this->$some_value = $data;
}
public function do_something() {
echo $this->some_value;
}
}
важная вещь помнить состоит в том, что статические функции класса не могут использовать $this
, поскольку нет никакого экземпляра класса. (это - одна из причин, почему они идут намного быстрее.)
С PHP7 Вы используете подобный массиву путь:
// Static call only
[TestClass::class, $methodName](...$args);
// Dynamic call, static or non-static doesn't matter
$instance = new TestClass;
[$instance, $methodName](...$args);
Просто заменяют имя класса TestClass
, имя метода с $methodName
и аргументы метода с ...$args
. Обратите внимание, что в более позднем случае не имеет значения, что метод является статическим или нестатичным; PHP назовет его автоматически.