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.