在 java 有個函式是 equals
功用是可以 overloading  == 這個 operater 的意義
因為有時候兩個 object 是用不同方式產生的,但是他們代表的是相同的東西
如果直接對兩個 object 用 == 做,會回傳 false ,原因是 reference 不同
overload equals 的話就可以讓 java 用你所自訂的方法判斷到底是不是相同的東西

最近寫 PHP 寫很多...
也開始在寫 PHP 的 OOP
也遇到了需要 overload equals 的需求
PHP 裡面習慣上這種功能應該會放在 Magic Methods 裡面
像是 __construct, __destruct, __toString, __get, __set, __isset ...
我就想找有沒有 __equals 這個東西
結果找到一篇 php.net 上面的回應

http://bugs.php.net/bug.php?id=25772
[15 Apr 2004 3:29am UTC] derick@php.net
We're not going to have more magic then there already is; those things
are going to be to complicated and confusing (See the __string()) issue.


不知道來自 derick@php.net 算不算官方回應啊 @_@
只是都已經 2004 年了,當初這樣說不代表現在也是如此吧?

另外我在 php.net 上面對於 Comparing objects 裡面
看到他寫 $object1 == $object2 的實作方式是檢查裡面所有的 variable 是否相同,並且是否是同一個 instance..
真是超沒效率的方法啊
就有人說下面這程式會造成 php 當掉
ronnywang@ronny [/tmp] [16:56/W10] cat test.php
<?php
class Foo {
    public $x;
}
$a = new Foo();
$b = new Foo();
$a->x = $b;
$b->x = $a;

print_r($a == $b);
ronnywang@ronny [/tmp] [16:56/W10] php test.php
PHP Fatal error:  Nesting level too deep - recursive dependency? in /tmp/test.php on line 10

因為他會 recursive 去檢查是不是每個 variable 都一樣...
這樣子 PHP 太遜了啦...
萬一我程式寫法是

class 人類{
  public $配偶;
}
$a = new 人類();
$b = new 人類();
$a->配偶 = $b;
$b->配偶 = $a;

print_r($a == $b);

這樣子觀念完全沒有問題的程式在 PHP 就會 Fatal error 了

PHP 趕快增加  __equals 吧!


創作者介紹

Ronny's BLOG

榮尼王 發表在 痞客邦 PIXNET 留言(0) 人氣()