Как я динамично вызываю метод класса в PHP?

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

52
задан hakre 4 June 2012 в 20:23
поделиться

6 ответов

Это работает оба пути - необходимо использовать правильный синтаксис

//  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)
92
ответ дан hakre 7 November 2019 в 09:07
поделиться

Опция 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 является порядками величины, медленнее тогда использующими любую упомянутую выше опцию.

25
ответ дан David 7 November 2019 в 09:07
поделиться

Вы имеете в виду как это?

<?php

class A {
    function test() {
        print 'test';
    }
}

$function = 'test';

// method 1
A::$function();

// method 2
$a = new A;    
$a->$function();

?>
16
ответ дан Jeremy Ruten 7 November 2019 в 09:07
поделиться
call_user_func(array($object, 'methodName'));

для получения дополнительной информации, посмотрите php документация обратного вызова.

2
ответ дан Neil Williams 7 November 2019 в 09:07
поделиться

РЕДАКТИРОВАНИЕ: Я просто разработал то, что Вы пытались спросить... ах хорошо.. оставит мои комментарии внутри так или иначе. Можно заменить названиями классов и методов с переменными, если Вам нравится.. (но Вы являетесь сумасшедшими) - зарубка

<час>

Для вызывания функции из класса, можно сделать это один из двух путей...

Любой можно создать экземпляр класса, и затем назвать его. например:

$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, поскольку нет никакого экземпляра класса. (это - одна из причин, почему они идут намного быстрее.)

1
ответ дан Ether 7 November 2019 в 09:07
поделиться

С 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 назовет его автоматически.

0
ответ дан 7 November 2019 в 09:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: