Get class: примеры (PHP)
get_class(object $object): stringОсновы функции get_class
Функция get_class возвращает имя класса, к которому принадлежит переданный объект. Это основная функция для интроспекции объектов, часто используемая при отладке, ведении логов или в коде, который должен работать с объектами неизвестных классов.
Функция имеет следующий синтаксис:
get_class(?object $object = null): string|false
Параметры:
- $object (обязательный с PHP 8.0.0, опциональный ранее): Экземпляр объекта, имя класса которого нужно получить. Начиная с PHP 8.0.0, параметр является обязательным. Если передан null, функция выбрасывает исключение TypeError.
Возвращаемые значения:
- Строка (string) с именем класса объекта.
- false - возвращается только в устаревших версиях PHP при вызове функции без параметров не внутри метода класса.
Базовые примеры использования
class User {}
$user = new User();
echo get_class($user);User
class Logger {
public function logSelf() {
// Получаем имя текущего класса
echo get_class($this);
}
}
$logger = new Logger();
$logger->logSelf();Logger
class Animal {}
class Dog extends Animal {}
$dog = new Dog();
echo get_class($dog);Dog
Похожие функции в PHP
Возвращает имя родительского класса для объекта или класса. Если родительского класса нет, возвращает false.
class A {}
class B extends A {}
echo get_parent_class(new B());A
Проверяет, является ли объект экземпляром класса или его родителем, либо реализует ли интерфейс.
class Animal {}
$cat = new Animal();
var_dump(is_a($cat, 'Animal'));bool(true)
Оператор для проверки принадлежности объекта к классу. Работает быстрее функций.
class Vehicle {}
$car = new Vehicle();
var_dump($car instanceof Vehicle);bool(true)
get_class применяется, когда требуется именно имя класса как строка. Для проверки типа лучше подходит instanceof или is_a. Для получения информации о наследовании используется get_parent_class.
Аналоги в других языках
В Python для получения класса объекта используются атрибут __class__ или функция type().
class User:
pass
obj = User()
print(obj.__class__.__name__)
print(type(obj).__name__)<class '__main__.User'> User
В JavaScript имя конструктора объекта доступно через свойство constructor.name.
class User {}
let user = new User();
console.log(user.constructor.name);User
В MySQL нет прямого аналога, так как это СУБД, а не язык ООП. Типы данных определяются иначе.
Типичные ошибки
// PHP 8 и выше
try {
get_class('string');
} catch (TypeError $e) {
echo $e->getMessage();
}get_class(): Argument #1 ($object) must be of type object, string given
// PHP 7.4 и ниже, вне контекста класса
var_dump(get_class());bool(false)
// PHP 8
try {
get_class(null);
} catch (TypeError $e) {
echo 'Ошибка: ' . $e->getMessage();
}Ошибка: get_class(): Argument #1 ($object) must be of type object, null given
Изменения в последних версиях PHP
Параметр $object стал обязательным. Вызов get_class() без аргументов теперь вызывает исключение TypeError. Ранее такая конструкция возвращала имя текущего класса в контексте метода или false в глобальной области.
Вызов get_class() без аргументов вне контекста метода класса начал вызывать ошибку уровня E_WARNING. Ранее возвращалось false без предупреждения.
Расширенные примеры
$anonymous = new class {
public function getName() {
return get_class($this);
}
};
echo $anonymous->getName();class@anonymous/home/project/test.php0x7f3c2a1b0123
class Factory {
public static function create($type) {
$className = 'Product' . ucfirst($type);
if (!class_exists($className)) {
throw new Exception('Класс не найден');
}
$object = new $className();
// Логируем создание объекта
Logger::log('Создан объект класса: ' . get_class($object));
return $object;
}
}
class ProductA {}
// Эмуляция логгера
class Logger {
public static function log($message) {
echo $message . "\n";
}
}
$product = Factory::create('A');Создан объект класса: ProductA
interface PaymentMethod {}
class CreditCard implements PaymentMethod {
public function process() {
return 'Оплата картой';
}
}
class PayPal implements PaymentMethod {
public function process() {
return 'Оплата через PayPal';
}
}
class PaymentProcessor {
public function handle(PaymentMethod $payment) {
// Логируем тип платежа
$type = get_class($payment);
echo "Обработка платежа типа: $type\n";
return $payment->process();
}
}
$processor = new PaymentProcessor();
echo $processor->handle(new CreditCard());Обработка платежа типа: CreditCard Оплата картой
class BaseService {}
class UserService extends BaseService {}
class AdminService extends UserService {}
function checkServiceType($service) {
$class = get_class($service);
if ($class === 'BaseService') {
return 'Базовый сервис';
} elseif ($class === 'UserService') {
return 'Сервис пользователя';
} elseif ($class === 'AdminService') {
return 'Сервис администратора';
}
}
$admin = new AdminService();
echo checkServiceType($admin);Сервис администратора
class Container {
private $instances = [];
public function get($className) {
if (!isset($this->instances[$className])) {
$this->instances[$className] = new $className();
}
return $this->instances[$className];
}
public function resolve($object) {
$className = get_class($object);
echo "Разрешение зависимостей для: $className\n";
// Здесь может быть логика внедрения зависимостей
return $this->get($className);
}
}
class Mailer {}
$container = new Container();
$mailer = new Mailer();
$resolved = $container->resolve($mailer);Разрешение зависимостей для: Mailer