У меня есть класс PHP для создания тегов HTML. Каждый тег HTML становится новым экземпляром. У меня есть некоторые служебные методы, необходимые в классе для обработки определенных функциональных вещей, таких как экранирование атрибутов, и для настройки определенных параметров, влияющих на все экземпляры. Я объявляю утилиты и public static
, а внутри класса я использую self::
для вызова служебных методов. Как вы думаете, лучше держать все методы в одном классе или создать отдельный статический класс для утилит и иметь его таким образом, чтобы основной класс расширял статический (чтобы я мог вызывать методы с self::
)? Как лучше всего поступить в такой ситуации? (в PHP 5.2 и выше) Интерфейс класса выглядит следующим образом:
foo('div')->attr('id', 'example')->html('this is inner text')->get();
foo('img')->attr(array('src' => 'example.png', 'alt' => 'example'))->get();
Пример базового кода:
public function attr($name, $value = '')
{
if (is_scalar($name))
{
if (empty($name) && !is_int($name)) $this->attrs[] = $value;
else $this->attrs[$name] = $value;
}
else
{
foreach ((array) $name as $k => $v)
{
$this->attr($k, $v);
}
}
return $this;
}
// handler (doesn't get called until it's time to get)
public static function attr_encode($name, $value = '')
{
if (is_scalar($name))
{
if (is_int($name)) return self::attr_encode($value, '');
$name = preg_replace(self::ATTR_NAME_INVALIDS, '', $name);
if ('' === $name) return '';
if (1 === func_num_args() || '' === $value) return $name;
$value = is_null($value) ? 'null' : ( !is_scalar($value) ? (
self::supports('ssv', $name) ? self::ssv_implode($value) : json_encode($value)) : (
is_bool($value) ? (true === $value ? 'true' : 'false') : self::esc_attr($value)));
return $name . "='" . $value . "'"; // Use single quotes for compatibility with JSON.
}
// Non-scalar - treat $name as key/value map:
$array = array();
foreach ((array) $name as $attr_name => $attr_value)
{
self::push($array, true, self::attr_encode($attr_name, $attr_value));
}
return implode(' ', $array);
}
Foo
, то разве они не относятся к классуFoo
? Как это не ООП? - person ryanve   schedule 04.05.2012$this
, а не создавать новый экземпляр. - person AndrewR   schedule 04.05.2012