Я понимаю, что это сложная задача, поэтому вам, возможно, придется использовать определенную структуру классов.Но есть и другой способ сделать это:
class Father
{
protected static $instance;
protected $firstName = '';
protected $lastName = '';
public function __call($name, $arguments)
{
if (property_exists($this, $name)) {
$this->$name = array_shift($arguments);
}
return $this;
}
public static function __callStatic($name, $arguments)
{
if (is_null(static::$instance)) {
static::$instance = new static;
}
return static::$instance->$name(...$arguments);
}
public function toArray()
{
return [
'firstName' => $this->firstName,
'lastName' => $this->lastName
];
}
}
В этой версии вы можете вызывать функцию с именем защищенной переменной как статическую или нет.Таким образом, вы можете сделать Father::firstName('dad')->lastName('saray')
или наоборот как Father::lastName('saray')->firstName('dad')
.Для краткости я не учел другие методы, такие как age.
Как и было запрошено в комментарии, вот что происходит:
Когда вы вызываете firstName()
или lastName()
как статический, магический метод__callStatic()
запущен.Если он обнаружит, что экземпляра нет, он создаст экземпляр, вызовет этот метод и вернет экземпляр.Все последующие вызовы будут обрабатываться магическим методом __call()
.Это установит свойство и вернет тот же экземпляр.Теперь это означает, что вы можете сначала вызвать firstName()
или lastName()
как статические, а затем все последующие вызовы будут нестатичными.