Idziemy dalej w kierunku poznawania refleksji, dzięki której będzie można w przyszłości utworzyć graf zależności oraz kontener, bardzo przydatny wzorzec.

Nasze klasy:

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 = 0;
    public function __construct()
    {
        static::$workers++;
    }
}

Dotychczasowy helper:

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;
    }
}

Przykład użycia:

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

Tworzenie klas bez konstruktorów:

class ReflectionHelper {
    
   //(...)

    public static function makeSimple($className){
        return new $className;
    }
}

Przykład:

$worker = ReflectionHelper::makeSimple(Worker::class);
echo Worker::$workers;
//1

Tworzenie klas z konstruktorami:

class ReflectionHelper {
    
    //(...)

    public static function makeWithArgs($className, $args){
        return new $className(...$args);
    }
}

Przykład:

$rectangle = ReflectionHelper::makeWithArgs(Rectangle::class, ['a' => 10, 'b' => 15]);
echo $rectangle->a . " " . $rectangle->b;
//10 15

Graf zależności w następnej lekcji.