Php получить все методы объекта

Функции для работы с классами и объектами

Сделайте объект какого-нибудь класса. Примените к объекту функцию get_class и узнайте имя класса, которому принадлежит объект.

Сделайте два класса: Test1 и Test2 . Пусть оба класса имеют свойство name . Создайте некоторое количество объектов этих классов и запишите в массив $arr в произвольном порядке. Переберите этот массив циклом и для каждого объекта выведите значение его свойства name и имя класса, которому принадлежит объект.

Функция get_class_methods

Сделайте класс Test с методами method1 , method2 и method3 . С помощью функции get_class_methods получите массив названий методов класса Test .

Создайте объект класса Test , запишите его в переменную $test . С помощью функции get_class_methods получите массив названий методов объекта. Переберите этот массив циклом и в этом цикле вызовите каждый метод объекта.

Функция get_class_vars

Сделайте класс Test с публичными свойствами prop1 и prop2 , а также с приватными свойствами prop3 и prop4 .

Вызовите функцию get_class_vars снаружи класса Test . Выведите массив доступных свойств.

Вызовите функцию get_class_vars внутри класса Test (например, в конструкторе). Выведите массив доступных свойств.

Функция get_object_vars

Сделайте класс Test с публичными свойствами prop1 и prop2 , а также с приватными свойствами prop3 и prop4 . Создайте объект этого класса. С помощью функции get_object_vars получите массив свойств созданного объекта.

Читайте также:  Объединение ячеек

Функция class_exists

Пусть у вас есть класс Test1 и нет класса Test2 . Проверьте, что выведет функция class_exists для класса Test1 и для класса Test2 .

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

Функция method_exists

Сделайте класс Test с методом method1 и без метода method2 . Проверьте, что выведет функция method_exists для метода method1 и для метода method2 .

Пусть GET параметрами в адресную строку передаются название класса и его метод. Проверьте, существует ли такой класс. Если существует — проверьте существование переданного метода. Если и метод существует — создайте объект данного класса, вызовите указанный метод и выведите результат его работы на экран.

Функция property_exists

Сделайте класс Test со свойством prop1 и без свойства prop2 . Проверьте, что выведет функция property_exists для свойства prop1 и для свойства prop2 .

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

Функция get_parent_class

Сделайте класс ChildClass наследующий от ParentClass . С помощью функции get_parent_class выведите на экран родителя класса ParentClass .

Функции is_subclass_of

Сделайте класс ChildClass наследующий от ParentClass , который в свою очередь наследует от GrandParentClass

С помощью функции is_subclass_of проверьте, является ли класс ChildClass потомком GrandParentClass .

С помощью функции is_subclass_of проверьте, является ли класс ParentClass потомком GrandParentClass .

С помощью функции is_subclass_of проверьте, является ли класс ChildClass потомком ParentClass .

Функция is_a

Сделайте класс ChildClass наследующий от ParentClass . Создайте объект класса ChildClass , запишите его в переменную $obj .

С помощью функции is_a проверьте, принадлежит ли объект $obj классу ChildClass .

С помощью функции is_a проверьте, принадлежит ли объект $obj классу ParentClass .

Функция get_declared_classes

Выведите на экран список всех объявленных классов.

Пусть у вас есть интерфейс iTest1 и нет интерфейса iTest2 .

Проверьте, что выведет функция interface_exists для интерфейса iTest1 и для интерфейса iTest2 .

Функция get_declared_interfaces

Выведите на экран список всех объявленных интерфейсов.

Функция get_declared_traits

Выведите на экран список всех объявленных трейтов.

Функция trait_exists

Пусть у вас есть трейт Trait1 и нет трейта Trait2 .

Проверьте, что выведет функция trait_exists для трейта Trait1 и для трейта Trait2 .

Источник

Функции для работы с классами и объектами

В PHP предусмотрен широкий набор функций для тестирования классов и объектов. Для чего это нужно? Вы, наверняка, сами написали большинство классов, которые используются в сценарии. На самом деле во время выполнения программы не всегда известно, какие классы используются. Например, вы могли разработать систему для «прозрачной» работы со сложными классами, разработанными сторонними производителями. В подобном случае экземпляр объекта обычно создается только на основании имени класса. В PHP разрешается использовать строки, чтобы ссылаться на классы динамически, как показано ниже:

// Файл Task.php namespace tasks; class Task < function doSpeak() < echo "Привет!"; >> // Файл TaskRunner.php $classname = "Task"; require_once ".php"; $classname = "tasks\\$classname"; $myObj = new $classname(); $myObj->doSpeak();

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

Обычно подобные операции выполняют, когда нужно, чтобы система могла выполнять созданные пользователем подключаемые дополнительные модули (plug-ins). Но прежде чем делать такие рискованные вещи в реальном проекте, вы должны проверить, что указанный класс существует, у него есть нужные вам методы и т.д.

В PHP 5 часть функций для работы с классами была заменена более мощным Reflection API, который мы будем изучать в следующей статье. Однако простота и удобство использования в некоторых случаях делают эти функции более предпочтительными. По этой причине мы сейчас и приступим к их рассмотрению.

Курс PHP для начинающих

Поиск классов

Функции class_exists() передается строка, содержащая имя класса. Она возвращает значение true, если класс существует, и false — в противном случае. С помощью этой функции можно сделать предыдущий фрагмент кода более безопасным:

// Файл TaskRunner.php $classname = "Task"; $path = ".php"; if ( !file_exists( $path )) < throw new Exception( "Файл не найден" ); > require_once( $path ); $qclassname = "tasks\\$classname"; if ( !class_exists( $qclassname ) ) < throw new Exception( "Класс $qclassname не найден" ); >$myObj = new $qclassname(); $myObj->doSpeak();

Конечно, мы не можем быть уверенными, что для конструктора рассматриваемого класса не потребуются аргументы. Для достижения такого уровня безопасности программирования необходимо обратиться к Reflection API, который мы будем изучать в следующей статье. Тем не менее перед его использованием с помощью функции class_exists() мы должны убедиться в том, что нужные нам классы существуют.

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

Чтобы получить массив всех классов, определенных в сценарии, можно воспользоваться функцией get_declared_classes():

print_r(get_declared_classes());

В результате будет выведен список встроенных и определенных пользователем классов. Помните, что данная функция возвращает только те классы, которые были объявлены к моменту ее вызова.

Курс PHP для начинающих

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

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

function getProduct() < return new CDProduct('Первый снег', 'Группа', 'Моральный кодекс', 2.99, 55.01); >$product = getProduct(); if (get_class($product) == 'CDProduct') echo '$product - объект класса CDProduct';

Функция getProduct() просто создает экземпляр объекта CDProduct и возвращает его. Мы воспользуемся данной функцией в этом разделе. Функция get_class() выдает очень специфическую информацию. Обычно же нужна более общая информация о принадлежности к семейству классов. Предположим, нам нужно знать, что объект принадлежит семейству ShopProduct, но при этом не имеет значения, к какому классу конкретно: BookProduct или CDProduct. Для этой цели в PHP предусмотрен оператор instanceof.

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

$product = getProduct(); if ($product instanceof ShopProduct) echo '$product - объект класса CDProduct';

Курс PHP для начинающих

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

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

foreach (get_class_methods('CDProduct') as $key=>$value) < echo "$key => ()
"; >

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

Курс PHP для начинающих

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

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

Курс PHP для начинающих

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

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

echo get_parent_class('CDProduct');

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

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

function getProduct() < return new CDProduct('Первый снег', 'Группа', 'Моральный кодекс', 2.99, 55.01); >$product = getProduct(); // Получим объект if (is_subclass_of($product, 'ShopProduct')) echo 'CDProduct является подклассом класса ShopProduct';

Функция is_subclass_of() сообщит информацию только об отношениях наследования в классе. Но она не поможет вам узнать, реализует ли класс интерфейс. Для этой цели следует использовать оператор instanceof. Кроме того, можно воспользоваться функцией class_implements(), которая является частью SPL (Standard PHP Library — стандартная библиотека PHP). Этой функции передается имя класса или ссылка на объект, а она возвращает массив имен интерфейсов:

$product = getProduct(); if (in_array('IChargeable', class_implements($product))) echo 'CDProduct реализует интерфейс IChargeable';

Прежде чем отобразить результат, в этом коде мы проверяем, есть ли имя интерфейса в массиве, возвращенном функцией class_implements().

Источник

Оцените статью