1

我有一个用于构建 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);
}
4

3 回答 3

1

本主题为您提供了一些关于如何、何时以及何时不使用静态类的好信息:

何时使用静态类与实例化类

另外..你写道:

类的接口是这样的:

PHP / OOP 中的接口是另一回事。接口迫使程序员在类中使用某些方法。

于 2012-05-04T19:46:12.750 回答
1

听起来您正在构建类似于 LINQ to XML 类的东西: http: //broadcast.oreilly.com/2010/10/understanding-c-simple-linq-to.html#example_1http://phphaml.sourceforge 。网/

也许那里有一些你可以适应的界面风格。

于 2012-05-04T23:35:54.413 回答
0

我正在构建自己的 PHP5 HMVC 项目,其中在使用带有命名空间的 STATIC 的某些库上使用:

\Project\library\output::set_header_status(100);

但是想象一下你的问题:

  • 我想在调用某些函数之前添加函数,或者避免:

    $output = \Project\library\output->log(true, 'directory_log_of_header/');
    
    \Project\library\output::set_header_status(100);
    

所以,出现了问题。这个例子不起作用。而不是这个示例函数,我将使用 STATIC 来避免这种情况,并使用$this和调用一个新实例。

如果我需要添加一些函数,放置一些变量并准备调用函数它应该使用non-static使用实例。


我使用 STATIC 方法仅用于直接调用函数,而无需先前的准备函数、设置变量或用于计数器,或设置真正需要使用静态的变量。例如,它可以用于调用 GET/POST 数据或直接调用 CLEARING CACHE(例如直接从文件中删除缓存而不是非静态的)。

  • 如果我只使用静态,我不知道有多少实例正在调用实例,如果你在课堂上需要调用另一个实例而不是更好的解决方案真正使用non-static.

    使用 STATIC 方法构建项目的人无法正确分析调用静态方法/类/函数的位置。这对于未来业务的维护和开发将更加困难。

    仅当函数提供小任务时才使用 STATIC,直接抓取不经常更改的数据,或将小任务用作变量、虚拟数据(例如:版本、检查、计数器、检查器),用于 HASH 算法等。

于 2013-04-12T10:41:38.207 回答