Get class methods: примеры (PHP)
get_class_methods(string|object $object): arrayФункция get_class_methods возвращает массив с именами методов, доступных для указанного объекта или класса. Эта функция часто используется при интроспекции объектов, для динамического вызова методов или проверки возможностей классов.
- Интроспекция объектов во время выполнения
- Проверка доступных методов в плагинах или модулях
- Автодокументирование или генерация документации
- Создание динамических обработчиков
- Отладка и анализ структуры классов
Функция принимает один обязательный параметр:
- 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
)Проверяет существование метода в классе или объекте. Возвращает true или false. Удобна для проверки отдельного метода.
if (method_exists('User', 'getName')) {
echo 'Метод существует';
}Возвращает массив доступных свойств класса. Работает только с публичными свойствами.
Возвращает массив всех объявленных классов. Полезно для анализа всей среды выполнения.
Предоставляет расширенные возможности интроспекции, включая информацию о модификаторах доступа, параметрах методов. Используется когда нужна детальная информация.
class User:
def get_name(self):
pass
def _validate(self):
pass
print([m for m in dir(User) if not m.startswith('_')])['get_name']
class User {
getName() {}
#validate() {}
}
console.log(Object.getOwnPropertyNames(User.prototype));['constructor', 'getName']
import java.lang.reflect.Method;
Method[] methods = User.class.getMethods();
for (Method method : methods) {
System.out.println(method.getName());
}SELECT ROUTINE_NAME
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_SCHEMA = 'database_name';$methods = get_class_methods('NonExistentClass');
var_dump($methods);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) {
}Параметр object_or_class теперь принимает объекты любого типа. Ранее принимались только экземпляры классов. Убрано требование передачи только объектов.
Добавлена поддержка передачи имени класса в виде строки. Ранее требовался экземпляр объекта.
Функция начала возвращать только публичные методы. В более ранних версиях возвращались все методы независимо от модификатора доступа.
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
)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
)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
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
)$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... (результат зависит от окружения)