Хочу уточнить, как работают операции == и ===. Вопрос такой. Прежде чем начать перебирать содержимое сравниваемых объектов, проверяют ли эти операции то, являются ли сравниваемые объекты ссылками на один и тот же объект? В случае отрицательного ответа, такой еще вопрос. Есть ли в PHP операция проверки того, являются ли два объекта ссылками на один и тот же объект?
А проверить? PHP: <? class a { var $v = 1; } class b { var $v = 1; } $a = new a(); $a2 = new a(); $b = new b(); $b2 = new b(); var_dump($a == $a2); var_dump($a == $b); var_dump($b == $b2);
Запустил такой тест: HTML: <?php $count=40; $i1=$i2=$i3=0; for($i1=0;$i1<$count;$i1++) //Задаем несколько измерений, for($i2=0;$i2<$count;$i2++) //что бы проверить, как их количество for($i3=0;$i3<$count;$i3++) //влияет на скорость сравнения $a[$i1][$i2][$i3]="$i1-$i2-$i3"; for($i1=0;$i1<$count;$i1++) $b[$i1]=&$a[$i1]; //Создаем массив ссылок $t1=microtime(1); for($i1=0;$i1<$count;$i1++) for($i2=0;$i2<$count;$i2++) $b[$i1]===$b[$i2]; //Сравниваем разные ссылки $t2=microtime(1)-$t1; echo"time 1: $t2\n"; //Выводим затраченное время 1 $t1=microtime(1); for($i1=0;$i1<$count;$i1++) for($i2=0;$i2<$count;$i2++) $b[$i2]===$b[$i2]; //Сравниваем одинаковые ссылки $t2=microtime(1)-$t1; echo"time 2: $t2\n"; //Выводим затраченное время 2 Суть теста в том, что сравниваются элементы массива $b, являющиеся, в свою очередь, ссылками на другие массивы. Первый раз сравниваем каждый элемент с каждым, второй раз - каждый элемент с самим собой. Вот результат теста: Код (Text): для операции == : time 1: 0.03262996673584 time 2: 1.4667098522186 для операции === : time 1: 0.021275043487549 time 2: 0.74690508842468 Он говорит о том, что операции сравнения не позволяют сэкономить время на сравнении объекта с самим собой и для достижения соответствующей экономии нужно исхитряться и придумывать что-то свое. Альтернативных функций сравнения, на сколько я понимаю, в PHP нет.
Не сразу понял намека, но завернув ссылку на массив в объект получил не плохой результат Код (Text): time 1: 0.0055010318756104 time 2: 0.0036649703979492 Интересно, какие еще операции можно ускорить таким способом?
Ну просто операции сравнения объектов специфичны, о чем и написано в документации. И в общем ясно почему- передача объекта по ссылке - это стандартное поведение, так что и сравнение это должно учитывать. А сравнение других типов... ну там ссылки не часто бывают, весьма специфичная задача/тест... возможно никто не парился. Хотя, конечно же, можно было бы оптимизировать это дело.