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.