PHP结合了静态和非静态类,而不是两个单独的类

PHP结合了静态和非静态类,而不是两个单独的类,php,oop,design-patterns,static-methods,static-members,Php,Oop,Design Patterns,Static Methods,Static Members,我有一个PHP类用于构建HTML标记。每个HTML标记都成为一个新实例。我在类中需要一些实用方法来处理某些函数,比如转义属性和配置影响所有实例的某些选项。我正在声明实用程序和publicstatic,并在类中使用self::调用实用程序方法。您认为最好将所有方法都保留在一个类中,还是为实用程序创建一个单独的静态类,并让主类扩展静态类(这样我仍然可以使用self::调用方法)?处理这种情况的最佳方法是什么?(在PHP 5.2及以上版本中)该类的接口如下所示: foo('div')->attr

我有一个PHP类用于构建HTML标记。每个HTML标记都成为一个新实例。我在类中需要一些实用方法来处理某些函数,比如转义属性和配置影响所有实例的某些选项。我正在声明实用程序和
publicstatic
,并在类中使用
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('div')->attr('id', 'example')->html('this is inner text')->get();

foo('img')->attr(array('src' => 'example.png', 'alt' => 'example'))->get();

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

听起来您在构建类似于LINQ to XML类的东西:或者


也许有一些界面风格你可以适应

我正在构建自己的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
调用一个新实例

如果我需要添加一些函数,放置一些变量并准备调用函数,它应该使用
非静态
使用实例


我只使用STATIC方法直接调用函数,而不使用前面的prepare函数、set变量、计数器,或者设置真正需要使用STATIC的变量。例如,它可以用于调用GET/POST数据,或者直接调用清除缓存(例如直接从文件中删除缓存,而不使用非静态)

  • 如果我只使用静态的,我不知道有多少实例在调用实例,如果你在类中调用另一个实例需要比使用非静态的更好的解决方案

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

    仅当函数提供小任务、直接获取不经常更改的数据,或将小任务作为变量、虚拟数据(例如:版本、检查、计数器、检查器)用于哈希算法和类似算法时,才使用静态


将所有代码放在一个类中不是OOP。您能展示一些您不确定该做什么的代码吗?@Mr.Pallazzo示例补充道。如果实用程序特定于
Foo
类,那么它们不属于
Foo
类吗?这怎么不是OOP呢?静态方法应该少用。过度使用静电是一种代码气味。想象一下“static”一词被“global”替换,你应该明白为什么。每个HTML标记都会成为一个新的实例。-如果你的意思和我想的一样,那么你的函数应该返回
$this
,而不是创建新实例。@AndrewR在我上面的例子中可以看到它们。毫无疑问,我需要一些静态方法。我想决定的是,是将它们包含在主类中,还是创建一个单独的纯静态类并从中扩展主类。创建一个单独的纯静态类:-)在这种情况下,如果需要的话,在其他地方使用静态代码会更容易,现在将它们分开,我认为会更好。我有它,所以非静态的扩展了静态的,所以我可以使用
self::
从那里调用utils。酷-谢谢-很高兴知道。我现在做的有点简单。我会发布链接,当我有它Github。