PHP isset($this) 并在静态和对象上下文中使用相同的对象方法

标签 php oop static scope isset

我正在开发一个需要通过静态函数调用和对象方法访问的类。我发现的一件事是我正在跨多个函数复制逻辑。

简化示例:

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/

相关文章:

c# - 使缓存访问方法静态化

c# - 为什么静态类被认为是 “classes” 和 “reference types” ?

c++ - 静态指针 C++ 用法

php - MySQL 中带有外键的分层数据

php - QueryBuilder/Doctrine Select 加入 groupby

php - 具有 Jquery 自动完成功能的多个标签

javascript - 查看来自 ajax 请求的 pdf 报告

c# - Override Sealed 是有效的,但为什么在 C# 中不使用 Virtual Sealed?

c - C 中的 i++ 和++i 之间有性能差异吗?

c++ - 在派生类中使用基类 Copy CTOR