PHP结合了静态和非静态类与2个独立的类

时间:2012-05-04 19:32:25

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

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

3 个答案:

答案 0 :(得分:1)

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

When to use static vs instantiated classes

另外..你写道:

  

该类的接口如下:

PHP / OOP中的接口是另外的东西。接口强制程序员在类中使用某些方法。

答案 1 :(得分:1)

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

也许你可以调整一些界面风格。

答案 2 :(得分: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避免使用STATIC,而是使用$this并调用新实例。

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


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

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

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

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