<?php
trait SetterGetter
{
private function getFieldNameFromMethodName(string $methodName): string
{
$fieldName = mb_substr($methodName, 3);
$fieldNameFirstChar = mb_strtolower(mb_substr($fieldName, 0, 1));
$fieldNameLastChars = mb_substr($fieldName, 1);
$fieldName = $fieldNameFirstChar . $fieldNameLastChars;
return $fieldName;
}
private function methodAllowedToBeUsedOnProperty(string $methodName, object $object, string $fieldName): bool
{
$property = new ReflectionProperty(get_class($object), $fieldName);
$properties = $property->getAttributes();
foreach ($properties as $property) {
$methods[] = $property->getName();
}
return $methods;
}
public function __call(string $name, array $arguments)
{
$prefix = mb_substr($name, 0, 3);
if ($prefix !== 'get' && $prefix !== 'set') {
throw new SetterGetterException('Из необъявленных методов этого класса можно вызывать только геттер и сеттер.');
}
$fieldName = $this->getFieldNameFromMethodName($name);
if (!property_exists(get_class($object), $fieldName)) {
throw new SetterGetterException('В классе ' . get_class($object) . 'не существует свойства с именем' . $fieldName);
}
$methods = methodAllowedToBeUsedOnProperty($name, $this, $fieldName);
if (!in_array($prefix, $methods)) {
throw new SetterGetterException('К этому полю нельзя обращаться через метод ' . $prefix);
}
if ($prefix === 'get') {
return $this->$fieldName;
} elseif ($prefix === 'set') {
if (count($arguments) !== 1) {
throw new SetterGetterException('В сеттер можно передавать только один аргумент.');
}
$fieldValue = $arguments[0];
$this->$fieldName = $fieldValue;
}
}
}
- Output for 8.1.0 - 8.1.28, 8.2.0 - 8.2.19, 8.3.0 - 8.3.7
preferences:
63.59 ms | 402 KiB | 62 Q