php - 静态/非静态方法问题

标签 php oop

我正在研究一个简单的 ORM 解决方案,但遇到了一个棘手的情况。理想情况下,我希望能够根据调用方式在静态上下文和对象上下文中使用方法。我不确定这是否可行,但我的意思是:

假设一个 User 模型想要静态调用 where(),这目前工作正常,例如:

$user = User::where('id = ?', 3);

现在,我还支持关系,例如用户可以有消息。建立这种关系后,我只需在用户模型中存储一个消息模型的空白副本并设置一个外键。例如:

$user -> messages = new Message();
$user -> messages -> foreign_key = 'user_id';

现在,理想情况下,我希望能够调用:

$user -> messages -> where('unread = ?', 1);

在非静态上下文中并在此上下文中使用 $this -> foreign_key 以便仅提取外键与用户 ID 匹配的消息。这种类型的上下文切换在 PHP 中是否可行?任何从静态上下文中引用 $this 都会抛出一个错误,因为它是一个静态方法并且不应该依赖 $this(出于显而易见的原因,当从静态上下文中调用时,$this 将不存在)

有什么聪明的方法可以解决这个问题吗?我尝试重载该方法以具有两个不同的原型(prototype),有和没有 static 关键字,但这引发了重新声明错误。

最佳答案

经过大量尝试后,我找到了一种方法,可以在不出现 @drew010 提到的 Strict Standards 错误的情况下实现这一点。我不喜欢它,感觉很糟糕,但它确实有效,所以我还是要发布它。

基本上,我们的想法是让您想要访问的方法成为privatestatic。然后定义 __call()__callStatic() 魔术方法,以便它们调用私有(private)静态方法。现在您可能会认为“这并没有解决问题,我仍然停留在静态上下文中”——您确实是这样,但是对于一个小的添加,您可以将 $this 附加到传递给的参数中__call() 中的实际方法并将其作为该方法的最后一个参数获取。因此,您不是在对象上下文中引用 $this,而是引用第三个参数来获取对您自己的实例的引用。

我可能没有很好地解释这个,看看this code :

<?php

class test_class {

    private $instanceProperty = 'value';

    private static function where ($arg1, $arg2, $obj = NULL) {
        if (isset($obj)) {
            echo "I'm in an object context ($arg1, $arg2): I can access the instance variable: $obj->instanceProperty<br>\n";
        } else {
            echo "I'm in a static context ($arg1, $arg2)<br>\n";
        }
    }

    public function __call ($method, $args) {
        $method = "self::$method";
        if (is_callable($method)) {
            $args[] = $this;
            return call_user_func_array($method, $args);
        }
    }

    public static function __callStatic ($method, $args) {
        $method = "self::$method";
        if (is_callable($method)) {
            return call_user_func_array($method, $args);
        }
    }

}

test_class::where('unread = ?', 1);

$obj = new test_class();
$obj->where('unread = ?', 2);

关于php - 静态/非静态方法问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11216043/

相关文章:

php - 按列值对 mySQL 结果进行排序

php - 为什么 $thousands_sep 不能删除逗号?

javascript - C3JS加载函数和点值

c++ - 大小未知的数组作为类成员,用于在运行时制作数组对象(对象创建时间)

javascript - 在 javascript 中记录对象时如何强制 toString

PHP 和 MySQL OOP - 为什么我没有得到返回结果?

php - 更新/删除多个选中的数据

php - 当数据库连接/未连接时,如何使用 MySQL/PHP 显示不同的图像?

c# - 是否可以使派生类的字段也被派生?

java - Java 中的标记图表示