关于oop:PHP结合了静态和非静态类与2个独立的类

PHP combined static and non-static class vs 2 separate classes

我有一个用于构建HTML标记的PHP类。每个HTML标记都将成为新实例。我在类中需要一些实用方法来处理某些功能性的东西,比如转义属性和配置影响所有实例的某些选项。我声明实用程序和public static,在类中,我使用self::调用实用程序方法。您认为最好将所有方法都保存在一个类中,还是为实用程序创建一个单独的静态类,并让它扩展静态类(这样我仍然可以使用self::调用这些方法)?处理这种情况的最佳方法是什么?(在php 5.2及更高版本中)类的接口如下:

1
2
3
foo('div')->attr('id', 'example')->html('this is inner text')->get();

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

基础代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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);
}


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

也许有一些界面样式您可以适应。


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

何时使用静态vs实例化类

也。。你写道:

The interface for the class is like this:

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


我正在构建自己的php5-hmvc项目,其中在某些库上使用静态名称空间:

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

但想象一下你的问题:

  • 我希望在调用某些函数之前添加函数,或者避免如下情况:

    1
    2
    3
    $output = \Project\library\output->log(true, 'directory_log_of_header/');

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

所以,有问题。这个例子行不通。我将避免使用static来代替这个示例函数,使用$this并调用一个新实例。

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

我使用的静态方法只用于直接调用没有预先准备函数的函数、设置变量或计数器,或者设置真正需要使用静态的变量。例如,它可以用于调用get/post数据,或者直接调用清除缓存(例如,直接从文件中删除缓存而不使用非静态缓存)。

  • 如果我只使用static,我不知道有多少实例在调用实例,如果在类中调用另一个实例需要比实际使用non-static更好的解决方案更多的实例。

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

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