проверка существования метода класса php

method_exists

(PHP 4, PHP 5, PHP 7, PHP 8)

method_exists — Проверяет, существует ли метод в данном классе

Описание

Список параметров

Экземпляр объекта или имя класса

Возвращаемые значения

Примеры

Пример #1 Пример использования method_exists()

Результат выполнения данного примера:

Пример #2 Пример статического использования method_exists()

Результат выполнения данного примера:

Примечания

Вызов этой функции будет использовать все зарегистрированные функции автозагрузки, если класс ещё не известен.

Смотрите также

User Contributed Notes 20 notes

As noted [elsewhere] method_exists() does not care about the existence of __call(), whereas is_callable() does:

Undocumented change since 7.4.0 is released:

class Foo
<
private function privateMethodTest ()
<

class Bar extends Foo
<

var_dump ( method_exists ( Bar ::class, ‘privateMethodTest’ ));
// PHP 7.4: bool(false)
// PHP 7.3: bool(true)

var_dump ( is_callable ( Bar ::class, ‘privateMethodTest’ ));
// PHP 7.3: bool(true)
// PHP 7.4: bool(true)

A couple of the older comments (specifically «jp at function dot fi» and «spam at majiclab dot com») state that is_callable() does not respect a methods visibility when checked outside of that class. ie. That private/protected methods are seen as callable when tested publicly. However, this was a bug (#29210) in early versions of PHP 5 and was fixed (according to the changelog) in PHP 5.0.5 (and/or PHP 5.1.0).

Just to mention it: both method_exists() and is_callable() return true for inherited methods:

class ChildClass extends ParentClass

$p = new ParentClass ();
$c = new ChildClass ();

This function is case-insensitive (as is PHP) and here is the proof:
class A <
public function FUNC () < echo '*****' ; >
>

if you want to check for a method «inside» of a class use:

small example for those who didn’t understood what i mean ( maybe caused by bad english 🙂 ):

?>

the output will be: a::test() exists!

maybe this will help someone

Note that prepending the namespace (if any) is required even if the calling class is in the same namespace:

If you want to check in a class itself if a method is known you may do so with magic variable __CLASS__

private function foo ()<

$test = new A ( ‘foo’ );
//should return true

It wasn’t spelled out but could be inferred: method_exists() also works on interfaces.

a little difference :

to find a method of an object (instance of a class)

Here is a useful function that you can use to check classes methods access e.g whether it is public, private or static or both..

// Example class
class myClass <

public function publ () <

private function priv () <

private static function privstatic () <

public static function publstatic () <

static function mytest () <

As mentioned before, is_callable and method_exists report all methods callable even if they are private/protected and thus actually not callable. So instead of those functions you may use following work-around which reports methods as supposed to.

class Foo1 <
public function bar () <
echo «I’m private Foo1::bar()» ;
>
>

class Foo2 <
private function bar () <
echo «I’m public Foo2::bar()» ;
>
>

$f1 =new Foo1 ;
$f2 =new Foo2 ;

?>

output
Foo1::bar() is callable (correct)
Foo2::bar() is callable (incorrect)
Foo1::bar() is callable (correct)
Foo2::bar() isn’t callable (correct)

Using method_exists inside an object’s __call() method can be very usefull if you want to avoid to get a fatal error because of a limit in function nesting or if you are calling methods that dont exist but need to continue in your application:

call_user_method uses the same mechanism as a normal method call. So you can get the returned values as well in this way.

I was wondering if caching the the methods in an array would have a faster lookup. So I ran a very simple benchmark using xdebug_time_index() with 10000 iterations on each statement.

using PHP 5.3.13 btw

Please note that the test was done on multiple methods, not just one, the code presented above is to show the results, not the actual test code that ran. Also, this was tested just out of curiosity and I didn’t set up a specific environment or used any profiling tools, and it was not meant to be an official benchmark in anyway.

Just a note that the behaviour of this function changed between version 5.0.x and 5.1.x when using static member functions

Im not sure of a workaround for PHP 5.0.x yet.

Источник

Проверка существования метода класса php

Reg.ru: домены и хостинг

Крупнейший регистратор и хостинг-провайдер в России.

Более 2 миллионов доменных имен на обслуживании.

Продвижение, почта для домена, решения для бизнеса.

Более 700 тыс. клиентов по всему миру уже сделали свой выбор.

Бесплатный Курс «Практика HTML5 и CSS3»

Освойте бесплатно пошаговый видеокурс

по основам адаптивной верстки

на HTML5 и CSS3 с полного нуля.

Фреймворк Bootstrap: быстрая адаптивная вёрстка

Пошаговый видеокурс по основам адаптивной верстки в фреймворке Bootstrap.

Научитесь верстать просто, быстро и качественно, используя мощный и практичный инструмент.

Верстайте на заказ и получайте деньги.

Что нужно знать для создания PHP-сайтов?

Ответ здесь. Только самое важное и полезное для начинающего веб-разработчика.

Узнайте, как создавать качественные сайты на PHP всего за 2 часа и 27 минут!

Создайте свой сайт за 3 часа и 30 минут.

После просмотра данного видеокурса у Вас на компьютере будет готовый к использованию сайт, который Вы сделали сами.

Вам останется лишь наполнить его нужной информацией и изменить дизайн (по желанию).

Изучите основы HTML и CSS менее чем за 4 часа.

После просмотра данного видеокурса Вы перестанете с ужасом смотреть на HTML-код и будете понимать, как он работает.

Вы сможете создать свои первые HTML-страницы и придать им нужный вид с помощью CSS.

Бесплатный курс «Сайт на WordPress»

Хотите освоить CMS WordPress?

Получите уроки по дизайну и верстке сайта на WordPress.

Научитесь работать с темами и нарезать макет.

Бесплатный видеокурс по рисованию дизайна сайта, его верстке и установке на CMS WordPress!

Хотите изучить JavaScript, но не знаете, как подступиться?

После прохождения видеокурса Вы освоите базовые моменты работы с JavaScript.

Развеются мифы о сложности работы с этим языком, и Вы будете готовы изучать JavaScript на более серьезном уровне.

*Наведите курсор мыши для приостановки прокрутки.

PHP: Получение информации об объекте или классе, методах, свойствах и наследовании

Получение информации об объекте или классе

Как вы знаете, с помощью уточнений типов классов можно ограничить тип аргумента для метода некоторого объекта. Но, увы, даже используя эту возможность, не всегда можно быть уверенным в отношении типа объекта.

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

В данном фрагменте кода мы получаем что-то от функции getProduct(). Чтобы быть абсолютно уверенными, что это объект типа CdProduct, мы используем функцию get_class().

Ниже привожу определение функции getProduct().

Как видите, функция getProduct() просто создает экземпляр объекта СdProduct и возвращает его. Вскоре мы воспользуемся этой функцией.

Допустим, мы хотим убедиться, что объект принадлежит семейству ShopProduct, но при этом не имеет значения, к какому классу конкретно: BookProduct или CdProduct. Для этой цели в PHP предусмотрен оператор instanceof.

Работает он с двумя операндами: объектом, который нужно проверить (указывается слева от ключевого слова instanceof), и именем класса или интерфейса справа.

Оператор возвращает значение true, если объект является экземпляром класса указанного типа.

Получение информации о методах

Иногда бывает нужно получить список всех методов класса. Для этого нужно воспользоваться функцией get_class_methods(). В качестве аргумента ей передается имя класса, а она возвращает массив, содержащий имена всех методов класса.

Предполагая, что класс CdProduct существует, получим такой результат.

C таким же успехом мы могли бы передать функции get_class_methods() не только класс, но и конкретный объект.

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

Всё вроде бы неплохо, однако такой подход таит в себе определенную опасность. Что произойдет, если метода не существует? Очевидно, сценарий завершится ошибкой. У нас уже есть опыт проверки того, существует ли метод.

Прежде, чем вызвать метод, мы проверяем, есть ли его имя в массиве, возвращенном функцией get_class_methods(). Неплохое решение, однако в PHP для этой цели уже изобретен другой «велосипед»)

В качестве первого аргумента ей передается строковая переменная, определяющая имя функции. Если заданная функция существует и ее можно вызвать, функция is_callable() возвращает значение true.

Функция вернет значение true, если указанный метод существует в классе.

Функции method_exists() передается ссылка на объект (или имя класса) и имя метода, а она возвращает значение true, если заданный метод существует в классе объекта.

Важно!
То, что метод существует, еще не означает, что его можно вызвать. функция method_exists() возвращает значение true для всех методов: закрытых (private), защищенных (protected) и, конечно же, общедоступных (public).

Получение информации о свойствах

Точно так же, как можно запросить список методов класса, можно запросить и список его свойств. Функции get_class_vars() передается имя класса, а она возвращает ассоциативный массив.

Давайте выполним проверку объекта CdProduct. Для наглядности добавим к классу общедоступное свойство: CdProduct::$coverUrl.

В результате вызова

будет показано только общедоступное свойство.

Получение информации о наследовании

С помощью функций для работы с классами можно также выявлять отношения наследования.

Например, с помощью функции get_parent_class() можно узнать имя родительского класса для указанного класса.

Этой функции передается ссылка на объект или имя класса, а она возвращает имя родительского класса (суперкласса), если таковой существует. Если же такого класса нет, то функция вернет значение false. В результате вызова

мы получим имя родительского класса ShopProduct, как и можно было ожидать.

С помощью функции is_subclass_of() можно также проверить, является ли класс дочерним для другого класса.

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

Кроме того, можно воспользоваться функцией call_implements(), которая является частью SPL (Standard PHP Library). Этой функции передается имя класса или ссылка на объект, а она возвращает массив имен интерфейсов.

Ну вот мы и разобрались с тем, как получать информацию об объекте или классе, методах, свойствах и наследовании. Увидимся в новых материалах.

Понравился материал и хотите отблагодарить?
Просто поделитесь с друзьями и коллегами!

Источник

Проверка существования метода в PHP

Классы могут содержать динамические методы, наличие которых неочевидно внешнему разработчику. Кроме того, в процессе эксплуатации могут создаваться разнородные массивы объектов, которые могут содержать различные методы. Для подобных ситуаций необходимы инструменты проверки существования метода в классе. В качестве такого инструмента в PHP выступает функция «method_exists()».

Функция в качестве первого параметра принимает имя класса или объект, а в качестве второго имя метода и возвращает «true», если объект или класс имеет данный метод, и «false» в противном случае.

Продемонстрируем работу функции «method_exists()» и создадим класс «myExists», который будет содержать два метода, открытый и закрытый.

В примере при помощи функции «method_exists()» в объекте класса «myExists» проверяется наличие существующих методов «method_public()», «method_private()» и не существующего метода «method_protected()». Результат:

Как видно из результата проверки, функция возвращает «true» для каждого из методов, независимо от его спецификатора доступа, «false» возвращается только в том случае, если объект не обладает ни закрытым, ни открытым методом с таким именем.

В качестве первого аргумента функции «method_exists()» используется объект класса «$_Class_myExists», однако для проверки метода вовсе не обязательно создавать объект, достаточно передать имя класса. Пример:

При работе с функцией «method_exists()» следует учитывать, что она не может определить наличие динамических методов, созданных при помощи специального метода «__call()», «__callStatic()».

Помимо функции «method_exists()» можно воспользоваться альтернативной функцией «is_callable()», которая в отличие от «method_exists()», кроме проверки метода класса позволяет проверить существование функции, не входящей в состав класса.

Работая со сторонним классом, разработчик зачастую не знает досконально всех методов данного класса. Для того чтобы получить их полный список, можно воспользоваться функцией «get_class_methods()». В качестве первого параметра функция принимает имя класса, а возвращает массив его открытых методов. Следует подчеркнуть, что закрытые методы этой функцией не возвращаются. Пример:

Как можно видеть, закрытый метод «method_private()» не включён в результирующий массив. Динамические методы, которые эмулируются при помощи специального метода «__call()», «__callStatic()», также не попадают в список, получаемый при помощи функции «get_class_methods()».

Источник

Проверка существования метода класса php

Класс может содержать собственные константы, переменные (называемые свойствами) и функции (называемые методами).

Пример #1 Простое определение класса

Результат выполнения данного примера в PHP 7:

Результат выполнения данного примера в PHP 8:

Если с директивой new используется строка ( string ), содержащая имя класса, то будет создан новый экземпляр этого класса. Если имя находится в пространстве имён, то оно должно быть задано полностью.

В случае отсутствия аргументов в конструктор класса, круглые скобки после названия класса можно опустить.

Пример #3 Создание экземпляра класса

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

Пример #4 Присваивание объекта

Результат выполнения данного примера:

Создавать экземпляры объекта можно двумя способами:

Пример #5 Создание новых объектов

class Test
<
static public function getNew ()
<
return new static;
>
>

class Child extends Test
<>

Результат выполнения данного примера:

Обратиться к свойству или методу только что созданного объекта можно с помощью одного выражения:

Пример #6 Доступ к свойствам/методам только что созданного объекта

Результатом выполнения данного примера будет что-то подобное:

Замечание: До PHP 7.1 аргументы не имели значения, если не определена функция конструктора.

Свойства и методы

Пример #7 Доступ к свойству vs. вызов метода

public function bar () <
return ‘метод’ ;
>
>

Результат выполнения данного примера:

Это означает, что вызвать анонимную функцию, присвоенную переменной, напрямую не получится. Вместо этого свойство должно быть назначено, например, переменной. Можно вызвать такое свойство напрямую, заключив его в скобки.

Пример #8 Вызов анонимной функции, содержащейся в свойстве

Результат выполнения данного примера:

extends

Класс может наследовать константы, методы и свойства другого класса используя ключевое слово extends в его объявлении. Невозможно наследовать несколько классов, один класс может наследовать только один базовый класс.

Наследуемые константы, методы и свойства могут быть переопределены (за исключением случаев, когда метод класса объявлен как final) путём объявления их с теми же именами, как и в родительском классе. Существует возможность доступа к переопределённым методам или статическим свойствам путём обращения к ним через parent::

Пример #9 Простое наследование классов

class ExtendClass extends SimpleClass
<
// Переопределение метода родителя
function displayVar ()
<
echo «Расширенный класс\n» ;
parent :: displayVar ();
>
>

Результат выполнения данного примера:

Правила совместимости сигнатуры

Пример #10 Совместимость дочерних методов

Результат выполнения данного примера:

Следующие примеры демонстрируют, что дочерний метод, который удаляет параметр или делает необязательный параметр обязательным, несовместим с родительским методом.

Пример #11 Фатальная ошибка, когда дочерний метод удаляет параметр

class Extend extends Base
<
function foo ()
<
parent :: foo ( 1 );
>
>

Результат выполнения данного примера в PHP 8 аналогичен:

Пример #12 Фатальная ошибка, когда дочерний метод делает необязательный параметр обязательным.

Результат выполнения данного примера в PHP 8 аналогичен:

Переименование параметра метода в дочернем классе не является несовместимостью сигнатуры. Однако это не рекомендуется, так как приведёт к Error во время выполнения, если используются именованные аргументы.

Пример #13 Ошибка при использовании именованных аргументов и параметров, переименованных в дочернем классе

Результатом выполнения данного примера будет что-то подобное:

::class

Пример #14 Разрешение имени класса

namespace NS <
class ClassName <
>

Результат выполнения данного примера:

Разрешение имён класса с использованием ::class происходит на этапе компиляции. Это означает, что на момент создания строки с именем класса автозагрузки класса не происходит. Как следствие, имена классов раскрываются, даже если класс не существует. Ошибка в этом случае не выдаётся.

Пример #15 Отсутствует разрешение имени класса

Результат выполнения данного примера:

Начиная с PHP 8.0.0, константа ::class также может использоваться для объектов. Это разрешение происходит во время выполнения, а не во время компиляции. То же самое, что и при вызове get_class() для объекта.

Пример #16 Разрешение имени объекта

Результат выполнения данного примера:

Методы и свойства Nullsafe

Пример #17 Оператор Nullsafe

Оператор nullsafe лучше всего использовать, когда null считается допустимым и ожидаемым значением для возвращаемого свойства или метода. Для индикации ошибки предпочтительнее выбрасывать исключение.

User Contributed Notes 11 notes

I was confused at first about object assignment, because it’s not quite the same as normal assignment or assignment by reference. But I think I’ve figured out what’s going on.

First, think of variables in PHP as data slots. Each one is a name that points to a data slot that can hold a value that is one of the basic data types: a number, a string, a boolean, etc. When you create a reference, you are making a second name that points at the same data slot. When you assign one variable to another, you are copying the contents of one data slot to another data slot.

Now, the trick is that object instances are not like the basic data types. They cannot be held in the data slots directly. Instead, an object’s «handle» goes in the data slot. This is an identifier that points at one particular instance of an obect. So, the object handle, although not directly visible to the programmer, is one of the basic datatypes.

What makes this tricky is that when you take a variable which holds an object handle, and you assign it to another variable, that other variable gets a copy of the same object handle. This means that both variables can change the state of the same object instance. But they are not references, so if one of the variables is assigned a new value, it does not affect the other variable.

Источник

get_class_methods

(PHP 4, PHP 5, PHP 7, PHP 8)

get_class_methods — Возвращает массив имён методов класса

Описание

Возвращает массив имён методов класса.

Список параметров

Имя класса или объект

Возвращаемые значения

Список изменений

ВерсияОписание
8.0.0Параметр object_or_class теперь принимает только объекты или корректные имена классов.

Примеры

Пример #1 Пример использования get_class_methods()

class myclass <
// конструктор
function __construct ()
<
return( true );
>

// метод 1
function myfunc1 ()
<
return( true );
>

// метод 2
function myfunc2 ()
<
return( true );
>
>

$class_methods = get_class_methods ( ‘myclass’ );
// или
$class_methods = get_class_methods (new myclass ());

Результат выполнения данного примера:

Смотрите также

User Contributed Notes 13 notes

It should be noted that the returned methods are dependant on the current scope. See this example:

class C
<
private function privateMethod ()
<

>
public function publicMethod ()
<

$this:
array
0 => string ‘privateMethod’ (length=13)
1 => string ‘publicMethod’ (length=12)
2 => string ‘__construct’ (length=11)

C (inside class):
array
0 => string ‘privateMethod’ (length=13)
1 => string ‘publicMethod’ (length=12)
2 => string ‘__construct’ (length=11)

$c:
array
0 => string ‘publicMethod’ (length=12)
1 => string ‘__construct’ (length=11)

C (outside class):
array
0 => string ‘publicMethod’ (length=12)
1 => string ‘__construct’ (length=11)

There does not appear to be any PHP function to determine which methods are inherited and which are defined explicitly by a class.

$word = new COM(‘Word.Application’);
$methods = get_class_methods(get_class($word));
print_r($methods);

In PHP4, this function converts its return values to lowercase; but in PHP5, it leaves the return values in their original case. This can cause serious problems when trying to write code that dynamically calls a class method, and that works in both PHP4 and PHP5. This code snippet shows one way of achieving compatibility with both versions:

This function will return only the methods for the object you indicate. It will strip out the inherited methods.

I have created a very simple test runner using this function

now you just need to write your test class with tegst methods prefixed by ‘test’, and then just instantiate object of that test class of your, all those tests methods will get run automatically
The drawback is: your test methods must not accept any arguments

an example:
require ‘../autoload.php’;
register_autoload_paths(realpath(‘./’));

class Test_Test extends Tester <
function test_something() <
print(«method got executed»);
>
function testAnotherThing() <
print(«another test method»);
>
>

$Test = new Test_Test();

As an extension to onesimus’s code below for finding inherited methods, in PHP 5 you can use the Reflection API to find which of these are overriden.

In PHP4, if you need to get_class_methods in their original case. You can use this simple function I created.

// Note: this function assumes that you only have 1 class in 1 file

If you use «get_class_methods» to check if a Method is in a Class remember that the function return lowered name of class methods:

class classPippo
<
function DummyFunct()
<
// Do nothing.
>
>

!Concerning PHP5 Only!

If you want to receive all methods of a given Class in another Class you should use the PHP5 Reflection API. The following source allows to retrieve all methods from a derived class in its (abstract) Base Class.

In the example you need to call the base constructor from the derived classes constructor in order to let the base class know the name of the derived class. Use the «__CLASS__» definition for passing the classname of current class to its base class.

// Some abstract function
abstract protected function D ();

// Some private function
private function E () <
>

// Derived Class
class B extends A <

// Constructor for this class
// MUST call Base Constructor
public function __construct () <
// Call Base Constructor
parent :: __construct ( __CLASS__ );
>

// Some public function
public function A () <
>

// some protected function
protected function B () <
>

// some private function
private function C () <
>

// some abstract method from base class implemented
protected function D () <
>
>

As you can see these are all methods from class B and also all methods from Class A respectivly in order of their declaration. Note that only one method «__construct» and only one method «D» are being shown. This is due to overloading (__construct) and implementing (D) in PHP.

In this example any further method-handling methods should be implemented in the base class as these will be available in derived classes as well. Just make sure that you use the right access specifiers for these additional methods ( private, protected, public )

I’ve figured out how to get around my issue described below, using the Reflection API.

isPublic()) <
/* The method is one we’re looking for, push it onto the return array */
array_push($returnArray,$method);
>
>

If you only need the methods declared by the class, and not the parent classes ones, you can do something like:

$declared_methods = array_diff(get_class_methods($class), get_class_methods(get_parent_class($class)));

Источник

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

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