0

我正在为延迟加载 SQL 查询构建某种代理模式类。

代理模式使用__call,__get__set来中继对其对象的调用,但有时如果 SQL 没有返回任何行,则没有对象。

那么我的问题是,如果我is_null()在代理类上做一个,是否有可能让类返回true呢?我在想是否有任何我可以实现的 SPL 接口,比如 Countable,它可以让类在count().

有什么建议么?

4

2 回答 2

2

可悲的是,我担心传递给 is_null 的对象返回 true 是不可能的。一些替代方案可能是:

  1. 使用 NullObjects,最近可以在 sitepoint http://www.sitepoint.com/forums/showthread.php?t=630292上找到关于这些的有趣讨论

  2. 实际上返回 null 而不是对象,尽管在您的情况下这可能是不可能的。

于 2009-10-14T10:10:46.097 回答
0

我不知道这是否有任何帮助,但通过利用 __toString 方法,您可以实现您正在寻找的东西,但请注意,这根本不是干净的代码或最佳实践,Rob 建议的解决方案实际上是更好的

您必须使用 PHP5.2 或更高版本并利用类型转换和 PHP 类模型的 __toString 魔术方法

class Dummy 
{
    private $value;

    public function __construct($val)
    {
        $this->value = $val;
    }

    public function __toString()
    {
        return $this->value;
    }
}

$dummy = new Dummy('1');
if((string)$dummy) {
    echo "__toString evaluated as true".PHP_EOL;
} else {
    echo "__toString evaluated as false".PHP_EOL;
}

$dummy2 = new Dummy('0');
if((string)$dummy2) {
    echo "__toString evaluated as true".PHP_EOL;
} else {
    echo "__toString evaluated as false".PHP_EOL;
}

这里发生的是 __toString 方法返回字符串 0 或字符串 1(注意,不要返回整数,返回字符串!)

'0' 评估为假,'1' 在 if 语句中评估为真,因此它也可能对您的情况有所帮助。

于 2009-10-14T12:14:32.540 回答