PHP结合了静态和非静态类,而不是两个单独的类
我有一个PHP类用于构建HTML标记。每个HTML标记都成为一个新实例。我在类中需要一些实用方法来处理某些函数,比如转义属性和配置影响所有实例的某些选项。我正在声明实用程序和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
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);
$this
调用一个新实例
如果我需要添加一些函数,放置一些变量并准备调用函数,它应该使用非静态使用实例
我只使用STATIC方法直接调用函数,而不使用前面的prepare函数、set变量、计数器,或者设置真正需要使用STATIC的变量。例如,它可以用于调用GET/POST数据,或者直接调用清除缓存(例如直接从文件中删除缓存,而不使用非静态)
- 如果我只使用静态的,我不知道有多少实例在调用实例,如果你在类中调用另一个实例需要比使用非静态的更好的解决方案
使用静态方法构建项目的人无法正确分析静态方法/类/函数的调用位置。这对于未来业务的维护和开发来说将更加困难
仅当函数提供小任务、直接获取不经常更改的数据,或将小任务作为变量、虚拟数据(例如:版本、检查、计数器、检查器)用于哈希算法和类似算法时,才使用静态
将所有代码放在一个类中不是OOP。您能展示一些您不确定该做什么的代码吗?@Mr.Pallazzo示例补充道。如果实用程序特定于Foo
类,那么它们不属于Foo
类吗?这怎么不是OOP呢?静态方法应该少用。过度使用静电是一种代码气味。想象一下“static”一词被“global”替换,你应该明白为什么。每个HTML标记都会成为一个新的实例。-如果你的意思和我想的一样,那么你的函数应该返回$this
,而不是创建新实例。@AndrewR在我上面的例子中可以看到它们。毫无疑问,我需要一些静态方法。我想决定的是,是将它们包含在主类中,还是创建一个单独的纯静态类并从中扩展主类。创建一个单独的纯静态类:-)在这种情况下,如果需要的话,在其他地方使用静态代码会更容易,现在将它们分开,我认为会更好。我有它,所以非静态的扩展了静态的,所以我可以使用self::
从那里调用utils。酷-谢谢-很高兴知道。我现在做的有点简单。我会发布链接,当我有它Github。