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

Использование 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)
instanceof

Оператор для проверки принадлежности объекта к классу. Работает быстрее функций.

class Vehicle {}
$car = new Vehicle();
var_dump($car instanceof Vehicle);
bool(true)
Выбор функции

get_class применяется, когда требуется именно имя класса как строка. Для проверки типа лучше подходит instanceof или is_a. Для получения информации о наследовании используется get_parent_class.

Аналоги в других языках

Python: type и __class__

В Python для получения класса объекта используются атрибут __class__ или функция type().

class User:
    pass
obj = User()
print(obj.__class__.__name__)
print(type(obj).__name__)
<class '__main__.User'>
User
JavaScript: constructor.name

В JavaScript имя конструктора объекта доступно через свойство constructor.name.

class User {}
let user = new User();
console.log(user.constructor.name);
User
MySQL: Нет прямой аналогии

В MySQL нет прямого аналога, так как это СУБД, а не язык ООП. Типы данных определяются иначе.

Типичные ошибки

Передача не объекта (PHP 8)
// 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)
// PHP 7.4 и ниже, вне контекста класса
var_dump(get_class());
bool(false)
Передача null в PHP 8
// 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

PHP 8.0.0

Параметр $object стал обязательным. Вызов get_class() без аргументов теперь вызывает исключение TypeError. Ранее такая конструкция возвращала имя текущего класса в контексте метода или false в глобальной области.

PHP 7.0.0

Вызов get_class() без аргументов вне контекста метода класса начал вызывать ошибку уровня E_WARNING. Ранее возвращалось false без предупреждения.

Расширенные примеры

Использование с анонимными классами
Пример php
$anonymous = new class {
    public function getName() {
        return get_class($this);
    }
};
echo $anonymous->getName();
class@anonymous/home/project/test.php0x7f3c2a1b0123
Фабричный метод с логированием
Пример php
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
Проверка типа в полиморфном методе
Пример php
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
Оплата картой
Сравнение классов в цепочке наследования
Пример php
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);
Сервис администратора
Автоматическое разрешение зависимостей
Пример php
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

PHP get_class function comments

En
Get class Returns the name of the class of an object