我有一个用于构建 HTML 标记的 PHP 类。每个 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);
}