Как сделать вызов функции внутри класса 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 бронзовых знаков
Вот определение которое поможет понять разницу между статическими методами и свойствами классов и методами,св-вами объектов.
Статические методы — это функции, используемые в контексте класса. Они сами не могут получить доступ ни к каким обычным свойствам класса, потому что такие свойства принадлежат объектам. Однако из статических методов можно обращаться к статическим свойствам. И если вы измените статическое свойство, то все экземпляры этого класса смогут получить доступ к новому значению.