2012-02-19 132 views
3

我正在使用PHP版本5.2.5。 我想能够比较我自己的类与int。与int类比较

abstract class A { 

private $value; 

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

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

} 

class B extends A { } 

,但我希望能够用我的阶级是这样的:

$inst = new B(20); 
if($inst==20) { 
    //... 
} 

我可怎么办呢?

+0

可能的重复[比较操作符在PHP中重载](http://stackoverflow.com/questions/3111668/comparison-operator-overloading-in-php) – 2012-02-19 16:53:03

回答

3

您可以在班级中使用magic __toString()方法。

class A 
{ 
    private $value; 

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

} 

$inst = new A(20); 
if((string) $inst==20) { 
    //... 
} 

技术上,__toString()必须返回一个字符串,而不是一个整数,但是PHP宽松的打字会使用标准的弱类型比较规则

+0

在PHP 5.2.12中不适用于我。当我返回一个int时,它说'方法A :: __ toString()必须返回一个字符串值'。当我强制转换返回值为字符串时,比较不起作用(不知道为什么)。另外,值得注意的是,在5.2 – 2012-02-19 16:59:47

+1

之前的版本中,这显然不起作用。它不起作用。 PHP不能执行间接转换。你需要'20'成为字符串,或者'$ inst'成为这样的字符串: '((string)$ inst == 20)'或'$ inst ==(string)20' – 2012-02-19 17:02:34

+0

对不起,是!您需要明确强制转换为__toString()方法和比较中的字符串。代码示例正确编辑 – 2012-02-19 17:12:34

1

这就是所谓的运算符重载作出比较。 是的,你可以做到。但是,你需要使用PECL包 (摘自描述如下:

运算符重载为:+, - ,*,/,%,< <,>>,|,&,^,〜 ,!,+​​+, - , + =, - =,* =,/ =,%=,< < =,>> =,。=,| =,& =,^ =, - =, ==,!=,===,!==,<,并< =运营商。