Я также нашел полезным получить доступ к атрибутам объекта, где имена атрибутов меняются в зависимости от некоторых итераторов.Например, я использовал приведенный ниже шаблон для набора периодов времени: час, день, месяц.
$periods=array('hour', 'day', 'month');
foreach ($periods as $period)
{
$this->{'value_'.$period}=1;
}
Этот же шаблон также можно использовать для доступа к методам класса.Просто создайте имя метода таким же образом, используя строки и строковые переменные.
Можно легко утверждать, что просто используйте массив для хранения значений по периодам.Если бы это приложение было только PHP, я бы согласился.Я использую этот шаблон, когда атрибуты класса отображаются на поля в таблице базы данных.Хотя можно хранить массивы в базе данных с помощью сериализации, это неэффективно и бессмысленно, если отдельные поля должны быть проиндексированы.Я часто добавляю массив имен полей, набранных итератором, для лучшего из обоих миров.
class timevalues
{
// Database table values:
public $value_hour; // maps to values.value_hour
public $value_day; // maps to values.value_day
public $value_month; // maps to values.value_month
public $values=array();
public function __construct()
{
$this->value_hour=0;
$this->value_day=0;
$this->value_month=0;
$this->values=array(
'hour'=>$this->value_hour,
'day'=>$this->value_day,
'month'=>$this->value_month,
);
}
}