Как вызвать метод класса php
Перейти к содержимому

Как вызвать метод класса php

  • автор:

Как сделать вызов функции внутри класса php?

Для вызова функции внутри класса используется ключевое слово self или $this-> . Например:

 class MyClass  public function helloWorld()  echo 'Hello World!'; > public function callHelloWorld()  self::helloWorld(); > > $myClass = new MyClass(); $myClass->callHelloWorld(); // => Hello World! 
 class MyClass  public function helloWorld()  echo 'Hello World!'; > public function callHelloWorld()  $this->helloWorld(); > > $myClass = new MyClass(); $myClass->callHelloWorld(); // => Hello World! 

Вызвать метод класса без создания экземпляра

Вызвать метод класса без создания экземпляра можно через модификатор static .

class myFunc < public static function showPHPVersion() < return PHP_VERSION; > >; echo myFunc::showPHPVersion(); // 7.3.12 

В статических методах нельзя использовать свойство $this . Вместо свойство $this можно использовать следующее:

$t = new self(); return $t->vars;

Обновлено: 01 ноября 2020

Комментарии

Авторизуйтесь, чтобы добавлять комментарии

  • Работа с ООП
  • Конструктор и деструктор
  • Наследование
  • Модификаторы доступа (Инкапсуляция)
  • Вызвать метод класса без создания экземпляра
  • Интерфейс и абстрактный класс
  • Вызов объекта как текст или функция
  • Запретить переопределять метод класса
  • Автоматически подключать класс
  • Синглтон (Singleton)
  • Запретить создавать экземпляр класса

Как вызвать метод в классе с динамически генерируемым именем через рефлексию в PHP

Допустим, у вас есть какой-то объект и вы хотите вызвать его метод, например вызов метода индекс на контроллере:

$controller->indexAction();

С этим все понятно, а что если имя метода неизвестно в тот момент, когда вы написали свой скрипт, и вам нужно получить его из переменной, например $method . Тоже норм:

$method = 'indexAction'; $object->();

но если метод не существует на объекте, это вызовет фатальную ошибку и прекратит выполнение скрипта. Но вы скажете, что можно использовать функцию method_exists , чтобы проверить, существует ли метод класса, и вы правы, это можно сделать:

$method = 'indexAction'; if (method_exists($object,$method)) < $object->(); > else

А что делать, если вы хотите передать какие-то параметры в вызываемый метод? если число параметров и их значений являются постоянными, вы можете легко передать его в обычном виде:

$object->($some,$param);

В случае когда количество параметров наперед не известно, вы можете передать динамический набор параметров создав массив и передав их в вызов функции call_user_func_array как это сделано в следующем примере:

$params = []; $params[] = 1; $params[] = 'second param value'; call_user_func_array([$object,$method]), $params); // это вызовет метод с двумя параметрами

А как же обрабатывать ошибки, которые могут возникнуть в случае, если количество параметров неверно или отсутствуют некоторые параметры? И как правильно вызвать статический метод объекта, который находится в пространстве имен?

call_user_func_array(__NAMESPACE__ .'\Controller::aliasAction',['about']);

Это бы сработало, но эта часть кода выглядит ужасно. Да, действительно, функция call_user_func_array была в пхп еще задолго до того как появились неймспейсы да и вообще обьекты, поэтому она не особо приспособлена для таких вещей. В таких случаях лучше (красивее, мы не говорим здесь об эффективности) использовать Reflection Api для вызова методов на объектах. Давайте посмотрим, как сделать такие вещи:

Вызов метод класса через отражение

Сначала вам нужно получить объект ReflectionMethod , который ссылается на необходимый вам класс и метод. Это можно сделать двумя способами:

    создать экземпляр ReflectionMethod:

 $method = new ReflectionMethod('ClassName','MethodName');
 $class = new ReflectionClass('ClassName'); $method = $class->getMethod('MethodName');

Давайте посмотрим на сложный пример вызова метода с параметрами, при помощи класса ReflectionMethod :

 $controller = new IndexController(); // imagine its a controller from framework with mvc architecture $method = 'indexAction'; // you need to call indexAction on it $params = ['en','about']; try < $reflectionMethod = new ReflectionMethod($controller,$method); // this would throw an exception in case method is not exists on object $reflectionMethod->invokeArgs($controller,$params); // throws exception if parameters are wrong > catch (/ReflectionException $e)

Да, куда лучше и понятнее чем пример выше с помощью call_user_func_array .
Более того, вышеупомянутый пример позволяет вам вызывать любой метод объекта таким образом: статический или обычный, с параметрами или без.

Вызов private метода

Reflection API позволяет вам вызывать даже приватные методы класса. Предположим есть класс:

 class IndexController < private function disabledAction()< echo 'private action result'; >// . rest of code . >

Вам не удасться вызвать этот метод при помощи примера который мы привели выше:

 $controller = new IndexController(); $reflectionMethod = (new ReflectionClass($controller))->getMethod($method); $reflectionMethod->invoke($controller);

Такой код вызовет ексепшн, который может привести программу к несовсем ожидаемым последствиям. Для того чтобы вызвать приватный метод класса в PHP нужно сделать его доступным к исполнению. В арсенале Reflection API PHP есть метод для этого: перед тем как делать invoke нашего метода , вы должны setAccesible его:

 $controller = new IndexController(); $reflectionMethod = (new ReflectionClass($controller))->getMethod($method); $reflectionMethod->setAccessible(true); // вот строчка которая делает метод доступным к вызову даже если он private $reflectionMethod->invoke($controller); // сейчас никаких ексепшнов уже не будет

Плюсы и минусы

Что касается меня, то я скажу это гораздо более элегантный код, чем использование функции call_user_func_array . Конечно, метод, который мы выбрали для вызова метода, зависит от того, чего нам нужно достичь: если нужно использовать как можно меньше ресурсов, то лучше использовать функциональный стиль.

Если нам нужен более элегантный код, более читаемый и написанный в объектно-ориентированном стиле — лучше использовать Reflection Api. Reflection API выдает исключение, и вам не нужно обрабатывать номера ошибок, которые функциональный метод возвращает в случае сбоя операции и так далее. Более того, рефлексия позволяет вам вызывать закрытые и защищенные методы, что невозможно сделать другими способами .

А какой способ больше по душе вам?

Способы вызова функции класса в php

@Фарход — очень сильно советую должным образом изучить ООП (причем лучше, если есть возможность, не на примере PHP, а, например, на примере java, c++ etc.), мало того, что вы не будете задавать таких глупых вопросов, так вы еще и понимать что-то будете 😀

24 апр 2012 в 20:25

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

На самом деле, это два абсолютно разных вызова! Первый вызов — это вызов функции не из объекта класса, сконструированного после определения класса, а непосредственно из самого класса. НО! Так можно вызывать только статические методы, то есть методы, принадлежащие самому классу. Такие методы определяются спецификатором «static»:

class A < . static function print($msg). > A::print('Hello World!'); // статический вызов 

Ну, а второй вызов, это уже стандартный вызов метода класса из его объекта:

class A < . function print($msg). > A $a; $a->print('Hello World!'); // вызов из объекта класса . 

Отслеживать
ответ дан 24 апр 2012 в 17:49
13.6k 13 13 золотых знаков 61 61 серебряный знак 122 122 бронзовых знака
В чем плюс или минус вызова не посредственно из класса, а не из обекта класса?
24 апр 2012 в 17:59

Думаю, что не стоит так разбрасываться словом «интерфейс». Кроме того, вы описали инкапсуляцию, а не полиморфизм. Так что за пониманием ООП вам тоже следует обратиться. Полиморфизм позволяет в процессе наследования, например, изменить тот единственный метод для обслуживания данных, назовем это так.

24 апр 2012 в 21:33

@Фарход, на ваш вопрос на форуме уже отвечали. Смысл пользования статическими функциями имеет место, например, когда она (функция) логически принадлежит определенному классу, но фактически не имеет взаимодействия с полями класса. (например, для случая, когда параметров функции и возвращаемого значения (если есть) достаточно, чтобы произвести некоторую обработку).

24 апр 2012 в 21:41
@Asen, да будет так:)
25 апр 2012 в 6:16

В PHP, как ни странно, не является синтаксической ошибкой вызов не статического метода статическим способом. Но генерирует предупреждения. Но вызывать оператором :: обычные методы категорически не рекомендуется — это сулит радикальное снижение читаемости кода, и суровые баги.

Отслеживать
ответ дан 28 июн 2016 в 10:33
Гончаров Александр Гончаров Александр
5,219 15 15 серебряных знаков 39 39 бронзовых знаков

Вот определение которое поможет понять разницу между статическими методами и свойствами классов и методами,св-вами объектов.

Статические методы — это функции, используемые в контексте класса. Они сами не могут получить доступ ни к каким обычным свойствам класса, потому что такие свойства принадлежат объектам. Однако из статических методов можно обращаться к статическим свойствам. И если вы измените статическое свойство, то все экземпляры этого класса смогут получить доступ к новому значению.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *