Poznajemy dalej zagadnienie refleksji w programowaniu obiektowym, ponieważ będzie nam ona niezbędna w przyszłości. Do dzieła.

Na początek trzy proste klasy, które będziemy badać:

<?php 

class Person {
    public string $name;
    public int $age;
}

class Rectangle {
    public int $a;
    public int $b;

    public function __construct(int $a,  int $b)
    {
        $this->a = $a;
        $this->b = $b;
    }
}

class Worker {
    public static $workers = 1;
    public function __construct()
    {
        static::$workers++;
    }
}

Okej, teraz metoda sprawdzająca, czy klasa ma konstruktor:

class ReflectionHelper {
    public static function hasConstructor($className){
        $reflector = new ReflectionClass($className);
        $constructor = $reflector->getConstructor();
        return !is_null($constructor);
    }
}

Wypróbujmy:

var_dump(ReflectionHelper::hasConstructor(Person::class));
//bool(false)
var_dump(ReflectionHelper::hasConstructor(Rectangle::class));
//bool(true)

Teraz metoda sprawdzająca, czy klasa ma konstruktor bez parametrów:

class ReflectionHelper {

    //(...)

    public static function hasParameterlessConstructor($className){
        $reflector = new ReflectionClass($className);
        $constructor = $reflector->getConstructor();
        $parameters = $constructor->getParameters();
        return count($parameters) === 0;
    }
}

Wypróbujmy:

var_dump(ReflectionHelper::hasParameterlessConstructor(Worker::class));
// bool(true)
var_dump(ReflectionHelper::hasParameterlessConstructor(Rectangle::class));
//bool(false)
var_dump(ReflectionHelper::hasParameterlessConstructor(Person::class));
//ERROR

Prawie dobrze, musimy tylko sprawdzić, czy w ogóle jakiś konstruktor ma, zanim zaczniemy sprawdzać, czy jest parameterless:

class ReflectionHelper {
    public static function hasConstructor($className){
        $reflector = new ReflectionClass($className);
        $constructor = $reflector->getConstructor();
        return !is_null($constructor);
    }

    public static function hasParameterlessConstructor($className){
        if(!static::hasConstructor($className))
            return false;
        $reflector = new ReflectionClass($className);
        $constructor = $reflector->getConstructor();
        $parameters = $constructor->getParameters();
        return count($parameters) === 0;
    }
}

Teraz wszystko powinno działać:

var_dump(ReflectionHelper::hasParameterlessConstructor(Worker::class));
// bool(true)
var_dump(ReflectionHelper::hasParameterlessConstructor(Rectangle::class));
//bool(false)
var_dump(ReflectionHelper::hasParameterlessConstructor(Person::class));
//bool(false)

Więcej refleksji w następnych lekcjach.