【问题标题】:PHP combined static and non-static class vs 2 separate classesPHP 组合静态和非静态类与 2 个单独的类
【发布时间】:2012-05-04 19:32:25
【问题描述】:

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

【问题讨论】:

  • 将所有代码放在一个类中不是 OOP。你能展示一些你不知道该怎么做的代码吗?
  • @Mr.Pallazzo 添加了示例。如果实用程序特定于Foo 类,那么它们不属于Foo 类吗?那怎么不是 OOP?
  • 静态方法只能谨慎使用。过度使用静态是代码异味。想象一下“静态”这个词被“全局”取代了,你应该明白为什么。
  • 每个 HTML 标记都成为新实例。 - 如果您的意思是我认为的意思,您的函数应该返回 $this,而不是创建新实例。跨度>
  • @AndrewR 他们是——看我上面的例子。

标签: php oop design-patterns static-methods static-members


【解决方案1】:

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

When to use static vs instantiated classes

还有……你写道:

类的接口是这样的:

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

【讨论】:

  • 毫无疑问我需要一些静态方法。我要决定是将它们包含在主类中还是创建一个纯静态的单独类并从中扩展主类更好。
  • 创建一个单独的纯静态类 :-) 在这种情况下,如果需要,可以更轻松地在其他地方使用该静态代码
  • 现在把他们分开了,是的,我认为它会更好。我有它,所以非静态的扩展了静态的,这样我就可以使用self:: 从那里调用实用程序。
【解决方案2】:

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

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

【讨论】:

  • 酷 - 谢谢 - 很高兴知道。我正在做的事情有点简单。当我有它的时候,我会在 Github 上发布链接。
【解决方案3】:

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

\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 using instance。


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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-01-17
    • 2012-04-13
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多