PHP combined static and non-static class vs 2 separate classes
我有一个用于构建HTML标记的PHP类。每个HTML标记都将成为新实例。我在类中需要一些实用方法来处理某些功能性的东西,比如转义属性和配置影响所有实例的某些选项。我声明实用程序和
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来代替这个示例函数,使用
如果我需要添加一些函数,放置一些变量,并准备调用函数,它应该使用
我使用的静态方法只用于直接调用没有预先准备函数的函数、设置变量或计数器,或者设置真正需要使用静态的变量。例如,它可以用于调用get/post数据,或者直接调用清除缓存(例如,直接从文件中删除缓存而不使用非静态缓存)。
如果我只使用static,我不知道有多少实例在调用实例,如果在类中调用另一个实例需要比实际使用
non-static 更好的解决方案更多的实例。使用静态方法构建项目的人,您无法正确分析静态方法/类/函数的调用位置。这对于未来业务的维护和开发将更加困难。
仅当函数提供小任务、直接获取不经常更改的数据、或将小任务作为变量时才使用static,对于哈希算法和类似算法,使用虚拟数据(例如:版本、检查、计数器、检查程序)。