2012-02-19 171 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包 (摘自描述如下:

運算符重載爲:+, - ,*,/,%,< <,>>,|,&,^,〜 ,!,+​​+, - , + =, - =,* =,/ =,%=,< < =,>> =,。=,| =,& =,^ =, - =, ==,!=,===,!==,<,並< =運營商。