我正在开发一个需要通过静态函数调用和对象方法访问的类。我发现的一件事是我正在跨多个函数复制逻辑。
简化示例:
class Configurable{
protected $configurations = array();
protected static $static_configurations = array();
public function configure($name, $value){
// ...lots of validation logic...
$this->configurations[$name] = $value;
}
public static function static_configure($name, $value){
// ...lots of validation logic (repeated)...
self::$static_configurations[$name] = $value;
}
}
我找到了解决这个问题的方法,但感觉真的很脏:
class Configurable{
protected $configurations = array();
protected static $static_configurations = array();
public function configure($name, $value){
// ...lots of validation logic...
if (isset($this)){
$this->configurations[$name] = $value;
}
else{
self::$static_configurations[$name] = $value;
}
}
}
我还需要静态函数,以便我可以在整个应用程序中设置配置。此外,这种技术的好处是我可以在两个范围内使用相同的方法名称。
这样的测试范围有问题吗?性能问题、向前兼容性问题等。它在 PHP 5.2 上对我来说都适用,而且我不需要支持 <5.
最佳答案
第二种方法的问题在于,当错误报告设置为E_STRICT
时会导致错误。例如:
Strict standards: Non-static method Foo::bar() should not be called statically in /home/yacoby/dev/php/test.php on line 10
PHP6 的一点是 E_STRICT 错误被移动到 E_ALL。换句话说,E_ALL 将涵盖所有错误,包括不允许您静态调用非静态方法。
另一种方法可能是将验证逻辑移至静态函数。这样非静态函数和静态函数就可以调用验证逻辑。
关于PHP isset($this) 并在静态和对象上下文中使用相同的对象方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2347475/