как узнать методы класса php
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)));
Функции для работы с классами и объектами
В PHP предусмотрен широкий набор функций для тестирования классов и объектов. Для чего это нужно? Вы, наверняка, сами написали большинство классов, которые используются в сценарии. На самом деле во время выполнения программы не всегда известно, какие классы используются. Например, вы могли разработать систему для «прозрачной» работы со сложными классами, разработанными сторонними производителями. В подобном случае экземпляр объекта обычно создается только на основании имени класса. В PHP разрешается использовать строки, чтобы ссылаться на классы динамически, как показано ниже:
Обычно подобные операции выполняют, когда нужно, чтобы система могла выполнять созданные пользователем подключаемые дополнительные модули (plug-ins). Но прежде чем делать такие рискованные вещи в реальном проекте, вы должны проверить, что указанный класс существует, у него есть нужные вам методы и т.д.
В PHP 5 часть функций для работы с классами была заменена более мощным Reflection API, который мы будем изучать в следующей статье. Однако простота и удобство использования в некоторых случаях делают эти функции более предпочтительными. По этой причине мы сейчас и приступим к их рассмотрению.
Поиск классов
Функции class_exists() передается строка, содержащая имя класса. Она возвращает значение true, если класс существует, и false — в противном случае. С помощью этой функции можно сделать предыдущий фрагмент кода более безопасным:
Конечно, мы не можем быть уверенными, что для конструктора рассматриваемого класса не потребуются аргументы. Для достижения такого уровня безопасности программирования необходимо обратиться к Reflection API, который мы будем изучать в следующей статье. Тем не менее перед его использованием с помощью функции class_exists() мы должны убедиться в том, что нужные нам классы существуют.
Не забывайте, что всегда следует с осторожностью относиться к данным, полученным из внешних источников, и проверять их перед использованием в своем сценарии. В случае получения пути и имени файла следует экранировать или удалять точки и разделители каталогов, тем самым предотвращается возможность взлома сайта, когда недобросовестный пользователь может заменить имена каталогов и включить в них нежелательные файлы.
Чтобы получить массив всех классов, определенных в сценарии, можно воспользоваться функцией get_declared_classes():
В результате будет выведен список встроенных и определенных пользователем классов. Помните, что данная функция возвращает только те классы, которые были объявлены к моменту ее вызова.
Получение информации об объекте или классе
Функция getProduct() просто создает экземпляр объекта CDProduct и возвращает его. Мы воспользуемся данной функцией в этом разделе. Функция get_class() выдает очень специфическую информацию. Обычно же нужна более общая информация о принадлежности к семейству классов. Предположим, нам нужно знать, что объект принадлежит семейству ShopProduct, но при этом не имеет значения, к какому классу конкретно: BookProduct или CDProduct. Для этой цели в PHP предусмотрен оператор instanceof.
Оператор instanceof работает с двумя операндами: объектом, который нужно протестировать (указывается слева от ключевого слова instanceof), и именем класса или интерфейса справа. Оператор возвращает значение true, если объект является экземпляром класса указанного типа:
Получение информации о методах
Чтобы получить список всех методов класса, можно воспользоваться функцией get_class_methods(). В качестве аргумента ей передается имя класса, а она возвращает массив, содержащий имена всех методов класса:
Код PHP Получение всех методов класса CDProduct
В этом примере мы передаем имя класса функции get_class_methods() и выводим возвращенный ею массив с помощью цикла foreach. Мы могли бы также передать функции get_class_methods() объект и получили бы такой же результат. Если вы используете не самую старую версию PHP, то в возвращенный список будут включены только имена общедоступных методов.
Получение информации о свойствах
Точно так же, как можно запросить список методов класса, можно запросить и список его полей. Функции get_class_vars() передается имя класса, а она возвращает ассоциативный массив. Имена полей сохраняются в виде ключей этого массива, а значения полей — в виде значений.
Получение информации о наследовании
С помощью функций для работы с классами можно также выявлять отношения наследования. Например, с помощью функции get_parent_class() можно узнать имя родительского класса для указанного класса. Этой функции передается ссылка на объект или имя класса, а она возвращает имя суперкласса, если таковой существует. Если же такого класса нет, т.е. если у проверяемого класса нет родительского класса, то функция вернет значение false. В результате вызова
мы получим имя родительского класса ShopProduct, как и можно было ожидать.
С помощью функции is_subclass_of() можно также проверить, является ли класс дочерним для другого класса. Этой функции передается ссылка на дочерний объект и имя родительского класса. Функция возвращает значение true, если второй класс является суперклассом первого аргумента:
Функция is_subclass_of() сообщит информацию только об отношениях наследования в классе. Но она не поможет вам узнать, реализует ли класс интерфейс. Для этой цели следует использовать оператор instanceof. Кроме того, можно воспользоваться функцией class_implements(), которая является частью SPL (Standard PHP Library — стандартная библиотека PHP). Этой функции передается имя класса или ссылка на объект, а она возвращает массив имен интерфейсов:
Прежде чем отобразить результат, в этом коде мы проверяем, есть ли имя интерфейса в массиве, возвращенном функцией class_implements().
Как узнать методы класса 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). Этой функции передается имя класса или ссылка на объект, а она возвращает массив имен интерфейсов.
Ну вот мы и разобрались с тем, как получать информацию об объекте или классе, методах, свойствах и наследовании. Увидимся в новых материалах.
Понравился материал и хотите отблагодарить?
Просто поделитесь с друзьями и коллегами!
Функции работы с классами и объектами
Содержание
User Contributed Notes 19 notes
[Editor’s note: If you are trying to do overriding, then you can just interrogate (perhaps in the method itself) about what class (get_class()) the object belongs to, or if it is a subclass of a particular root class.
You can alway refer to the parent overriden method, see the «Classes and Objects» page of the manual and comments/editor’s notes therein.]
There is no function to determine if a member belongs to a base class or current class eg:
class foo <
function foo () < >
function a () < >
>
class bar extends foo <
function bar () < >
function a () < >
>
lala = new Bar ();
?>
——————
how do we find programmatically if member a now belongs to class Bar or Foo.
To pillepop2003 at yahoo dot de:
I have the same issue. I have a base class that manages database tasks for a number of child classes. One of the functions in the base class is a find() method that returns instances of the child classes. Since find() is usually called as a static method, it needs to know the name of the child class. As you’ve found, this appears to be impossible to get in an easy fashion.
The only way I’ve found to get the child class name is to use the debug_traceback() function. This requires me to have a find() method in every child class, but it does work.
function find () <
return parent :: find ();
>
>
function find () <
return parent :: find ();
>
>
FYI: if you want to split your class into manageble chunks, what means different files for you, you can put you functoins into includes, and make include() have a return value. Like this:
And your included file:
Then your function call will be:
$instance = new Some_class ();
$instance->add_value (3);
And this will return
6
hopefully 😛
Keep in mind though, that the scope in the included file will be identical to the scope the function ‘add_value’ has.
And if you want to return the outcome, you should also have a return statement made in your include as well.
Something I found out just now that comes in very handy for my current project:
it is possible to have a class override itself in any method ( including the constructor ) like this:
in this case assuming that class b is already defined and also has the method ha ( )
note that the code after the statement to override itself is still executed but now applies to the new class
i did not find any information about this behaviour anywhere, so i have no clue wether this is supposed to be like this and if it might change. but it opens a few possibilities in flexible scripting!!
Re: Looking for an uninstantiated class
Why would I do this? Because I have my class layouts the same as their respective tables; the factory then selects the data (making sure that the variables match) and plugs in the data. (I’ve left out the actual code to do the selection/insertion).
To pillepop2003 at yahoo dot de:
It seems to me if there really is no nice way to get the class name in an un-instanciated class, there is a workaround in PHP5 though using static/class variables.
?>
However, you’ll need to have at least instanciated an object of the class myFooExtended before calling getClassName or introduce some other initialization (the class variable will need to be set at some point to __CLASS__ in the sub-class).
If you want to be able to call an instance of a class from within another class, all you need to do is store a reference to the external class as a property of the local class (can use the constructor to pass this to the class), then call the external method like this:
or if the double ‘->’ is too freaky for you, how about:
This is handy if you write something like a general SQL class that you want member functions in other classes to be able to use, but want to keep namespaces separate. Hope that helps someone.
I wanted to dynamically choose an extender for a class. This took awhile of playing with it but I came up with a solution. Note that I can’t verify how safe it is, but it appears to work for me. Perhaps someone else can shed light on the details:
Practical application: I have a database abstraction system that has individual classes for mysql, pgsql, et al. I want to be able to create a global db class that extends one of the individual db classes depending on the application configuration.
I know that there are probably much better ways of doing this but I haven’t reached that level when it comes to classes.
to covertka at muohio dot edu and pillepop2003 at yahoo dot de:
There’s a much easier solution to getting a class’ name for working with a factory function. Let’s assume you’re doing something like this:
?>
Now, consider the named parameter idiom and remember that PHP uses hashes for everything; as a result make the following changes:
?>
Nice ‘n simple. It seems that what the original poster wanted was something like C++ static data members; unfortunately as PHP4 has no static variables at all, there would need to be significant language change to support static-like behavior. If you move to PHP5, the static keyword solves your problem cleanly.
To access an object member with an illegal character in the name, use this syntax:
This is particularly relevant with the dynamically-generated classes used by, for instance, database objects and the SoapClient class.
Subject: using «sql_calc_found_rows» in a MySQL query while exploiting result in a PHP db class object.
There is a nice function in MySQL that allows to know how many records would have been returned if no «where» clause were set : SQL_CALC_FOUND_ROWS.
If you have create a db object to collect the returned lines, you will be a little perplex when trying to call the result of this function.
Then, the only way to get the right result seems to be the use of a class function, like :
A small function that allows finding all references to the object. Written in 3 minutes and may be buggy (for ex pass object as reference in some places?)
Why do u want to know the classname of an non-existant object?
The only possible explanation for this question seems to me u want to know the class before u instantiate the object. Well, this is of no use since u always instantiate a class of ur choice.
When the class is instantiated into an object u can find the class of the object by means of get_class(). This is all u need. In case of inheritance u can use get_class($this) to get the class of the instantiated object. Now u can differentiate according to which class the object belongs to.
$object1 = new A ();
$object2 = new B ();
?>
When u run this code-snippet the output will be:
Object is an instance of class A which is the parent-class.
Object is an instance of class B which is the child-class.
We have an array with many objects in a style like
Because there is no function in php api, we made the following function.
Warning: function is very slow and should only be called if it’s necessary for debugging reasons:
// clean the output-buffer
ob_end_clean ();
// cache the last match
$lastMatch = array();
// the return value
$return = array();
?>
I know, it’s not that elegant but I hope it’s useful for a few people.