Я пытаюсь найти изящный способ создания C # -характерных свойств в PHP
Сейчас у меня есть:
class Example
{
private $allowedProps = array('prop1', 'prop2', 'prop3');
private $data = array();
public function __set($propName, $propValue)
{
if (in_array($propName, $this->allowedProps))
{
// set property
}
else
{
// error
}
}
public function __get($propName)
{
if (array_key_exists($propName, $this->data))
{
// get property
}
else
{
// error
}
}
}
В закомментированных разделах длячто-то более сложное, чем простая запись или извлечение из массива $data
, проще всего было бы просто разделить логику, где это необходимо, с помощью if-else
или switch
.Это грязно, хотя и противоречит тому, что я хочу.Есть ли способ вызвать функцию обратного вызова, которая будет иметь доступ к массиву $data
?
РЕДАКТИРОВАТЬ: кажется, что самое простое, что можно сделать:
class Example
{
private $allowedProps = array('prop1', 'prop2', 'prop3');
private $data = array();
public function __set($propName, $propValue)
{
$propName = strtolower($propName);
if (in_array($propName, $this->allowedProps))
{
$funcName = "set" . ucfirst($propName);
$this->$funcName($propValue);
}
else
{
// error
}
}
public function __get($propName)
{
$propName = strtolower($propName);
if (array_key_exists($propName, $this->data))
{
$funcName = "get" . ucfirst($propName);
$this->$funcName();
}
else
{
// error
}
}
private function getProp1()
{
// do stuff, and return the value of prop1, if it exists
}
// ...
}
Я не уверен, стоит ли использовать множество частных методов установки и получения.Лямбды, вероятно, были бы идеальными, но они доступны только в PHP 5.3+.