HTMLタグを作成するためのPHPクラスがあります。各HTMLタグは新しいインスタンスになります。属性のエスケープなどの特定の機能を処理したり、すべてのインスタンスに影響する特定のオプションを構成したりするために、クラス内に必要なユーティリティメソッドがいくつかあります。ユーティリティを宣言しpublic static
、クラス内でself::
ユーティリティメソッドを呼び出しています。すべてのメソッドを1つのクラスに保持するか、ユーティリティ用に別の静的クラスを作成して、メインクラスが静的クラスを拡張するようにする(メソッドを引き続き呼び出すことができるようにする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);
}