Get class methods: примеры (PHP)

Работа с get_class_methods: получение методов класса
Раздел: Объектно-ориентированное программирование
get_class_methods(string|object $object): array
Функция get_class_methods в PHP

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

Когда применяется
  • Интроспекция объектов во время выполнения
  • Проверка доступных методов в плагинах или модулях
  • Автодокументирование или генерация документации
  • Создание динамических обработчиков
  • Отладка и анализ структуры классов
Аргументы функции

Функция принимает один обязательный параметр:

  1. object_or_class (объект или строка) - экземпляр объекта или имя класса в виде строки. Начиная с PHP 8.0.0, можно передавать объекты любого типа, ранее требовался только объект.
Примеры использования
Работа с объектом
class User {
    public function getName() {}
    private function validate() {}
    protected function save() {}
}

$user = new User();
$methods = get_class_methods($user);
print_r($methods);
Array
(
    [0] => getName
)
Передача имени класса
$methods = get_class_methods('User');
print_r($methods);
Array
(
    [0] => getName
)
Стандартный класс
$methods = get_class_methods('DateTime');
print_r(array_slice($methods, 0, 5));
Array
(
    [0] => __construct
    [1] => __wakeup
    [2] => __set_state
    [3] => createFromFormat
    [4] => getLastErrors
)
Похожие функции в PHP

Проверяет существование метода в классе или объекте. Возвращает true или false. Удобна для проверки отдельного метода.

if (method_exists('User', 'getName')) {
    echo 'Метод существует';
}

Возвращает массив доступных свойств класса. Работает только с публичными свойствами.

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

ReflectionClass

Предоставляет расширенные возможности интроспекции, включая информацию о модификаторах доступа, параметрах методов. Используется когда нужна детальная информация.

Аналоги в других языках
Python: dir()
class User:
    def get_name(self):
        pass
    def _validate(self):
        pass

print([m for m in dir(User) if not m.startswith('_')])
['get_name']
JavaScript: Object.getOwnPropertyNames
class User {
    getName() {}
    #validate() {}
}

console.log(Object.getOwnPropertyNames(User.prototype));
['constructor', 'getName']
Java: Class.getMethods()
import java.lang.reflect.Method;

Method[] methods = User.class.getMethods();
for (Method method : methods) {
    System.out.println(method.getName());
}
MySQL: INFORMATION_SCHEMA.ROUTINES
SELECT ROUTINE_NAME 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_SCHEMA = 'database_name';
Типичные ошибки
Несуществующий класс
$methods = get_class_methods('NonExistentClass');
var_dump($methods);
NULL
Передача null
$methods = get_class_methods(null);
var_dump($methods);
Deprecated: get_class_methods(): Passing null to parameter #1 ($object_or_class) of type object|string is deprecated
Использование с интерфейсом
interface Logger {
    public function log($message);
}

$methods = get_class_methods('Logger');
print_r($methods);
Array
(
    [0] => log
)
Пустой результат
class EmptyClass {}
$methods = get_class_methods(new EmptyClass());
var_dump($methods);
array(0) {
}
Изменения в версиях PHP
PHP 8.0.0

Параметр object_or_class теперь принимает объекты любого типа. Ранее принимались только экземпляры классов. Убрано требование передачи только объектов.

PHP 7.0.0

Добавлена поддержка передачи имени класса в виде строки. Ранее требовался экземпляр объекта.

PHP 5.0.0

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

Расширенные примеры
Сравнение методов родительского и дочернего класса
Пример php
class ParentClass {
    public function parentMethod() {}
}

class ChildClass extends ParentClass {
    public function childMethod() {}
}

$parentMethods = get_class_methods('ParentClass');
$childMethods = get_class_methods('ChildClass');
$diff = array_diff($childMethods, $parentMethods);

print_r($diff);
Array
(
    [0] => childMethod
)
Фильтрация магических методов
Пример php
class Example {
    public function normal() {}
    public function __construct() {}
    public function __toString() { return ''; }
}

$allMethods = get_class_methods('Example');
$filtered = array_filter($allMethods, 
    fn($method) => !str_starts_with($method, '__')
);

print_r($filtered);
Array
(
    [2] => normal
)
Динамический вызов методов
Пример php
class Calculator {
    public function add($a, $b) { return $a + $b; }
    public function multiply($a, $b) { return $a * $b; }
}

$calc = new Calculator();
$methods = get_class_methods($calc);

foreach ($methods as $method) {
    if ($method !== '__construct') {
        echo $method . ': ' . $calc->$method(5, 3) . '\n';
    }
}
add: 8
multiply: 15
Работа с трейтами
Пример php
trait Loggable {
    public function log($message) {}
    private function format($message) {}
}

class Product {
    use Loggable;
    public function getPrice() {}
}

$methods = get_class_methods('Product');
print_r($methods);
Array
(
    [0] => log
    [1] => getPrice
)
Анализ встроенных классов
Пример php
$splClasses = get_declared_classes();
$splClasses = array_filter($splClasses, 
    fn($class) => str_starts_with($class, 'SPL')
);

foreach ($splClasses as $class) {
    $count = count(get_class_methods($class));
    echo "$class: $count методов\n";
}
SPL... (результат зависит от окружения)

PHP get_class_methods function comments

En
Get class methods Gets the class methods' names