Hi,
I think objects comparison in PHP5 has problems.
Here is small sample code,
<?php
class Foo {
var $v = 1;
}
class Boo {
var $v = 1;
}
$a = new Foo;
$b = new Foo;
$c = new Boo;
$d = new Foo;
$d->v = 2;
$e = $a;
// value comparison
echo $a == $b ? "same," : "not same,";
echo $a == $c ? "same," : "not same,";
echo $a == $d ? "same," : "not same,";
echo $a == $e ? "same" : "not same";
echo "\n";
// value and type comparison
echo $a === $b ? "same," : "not same,";
echo $a === $c ? "same," : "not same,";
echo $a === $d ? "same," : "not same,";
echo $a === $e ? "same" : "not same";
?>
The output from PHP4 and PHP5(ze1_compat on/off) is,
PHP 4.3.6 :
same,not same,not same,same
same,not same,not same,same
PHP 5.0.0RC2 zend.ze1_compatibility_mode=off :
same,not same,not same,same
(Notice: Object of class [Foo|Boo] could not be converted to integer)
not same,not same,not same,same
PHP 5.0.0RC2 zend.ze1_compatibility_mode=on :
same,same,not same,same
not same,not same,not same,not same
The problem and question are,
- the different class is recognised as same in PHP5 (ze1_compat=on).
- the same object is recognised as different in PHP5 (ze1_compat=on).
- Why integer casting of object was implicitly applied in PHP5
(ze1_compat=off) ?
--
Rui Hirokawa <rui_hirokawa@ybb.ne.jp
Did you check HEAD? I fixed something to do with the comparison. if it
still doesn't work please let me know.
Andi
At 04:43 PM 5/9/2004 +0900, Rui Hirokawa wrote:
Hi,
I think objects comparison in PHP5 has problems.
Here is small sample code,<?php
class Foo {
var $v = 1;
}
class Boo {
var $v = 1;
}
$a = new Foo;
$b = new Foo;
$c = new Boo;
$d = new Foo;
$d->v = 2;
$e = $a;// value comparison
echo $a == $b ? "same," : "not same,";
echo $a == $c ? "same," : "not same,";
echo $a == $d ? "same," : "not same,";
echo $a == $e ? "same" : "not same";
echo "\n";
// value and type comparison
echo $a === $b ? "same," : "not same,";
echo $a === $c ? "same," : "not same,";
echo $a === $d ? "same," : "not same,";
echo $a === $e ? "same" : "not same";
?>The output from PHP4 and PHP5(ze1_compat on/off) is,
PHP 4.3.6 :
same,not same,not same,same
same,not same,not same,samePHP 5.0.0RC2 zend.ze1_compatibility_mode=off :
same,not same,not same,same
(Notice: Object of class [Foo|Boo] could not be converted to integer)
not same,not same,not same,samePHP 5.0.0RC2 zend.ze1_compatibility_mode=on :
same,same,not same,same
not same,not same,not same,not sameThe problem and question are,
- the different class is recognised as same in PHP5 (ze1_compat=on).
- the same object is recognised as different in PHP5 (ze1_compat=on).
- Why integer casting of object was implicitly applied in PHP5
(ze1_compat=off) ?--
Rui Hirokawa <rui_hirokawa@ybb.ne.jp
I performed the same test with HEAD (PHP 5.0.0RC3-dev (build: May 9
2004 10:16:50)).
There are no E_NOTICE
message now, but, the problems are still existing with
RC2,
PHP 4.3.6
same,not same,not same,same
same,not same,not same,same
PHP 5.0.0-CVS 2004/5/9 (ze1_compatibility_mode = Off)
same,not same,not same,same
not same,not same,not same,same
PHP 5.0.0-CVS 2004/5/9 (ze1_compatibility_mode = On)
same,same,not same,same
not same,not same,not same,not same
Rui
On Sun, 09 May 2004 19:17:35 +0300
Andi Gutmans andi@zend.com wrote:
Did you check HEAD? I fixed something to do with the comparison. if it
still doesn't work please let me know.Andi
At 04:43 PM 5/9/2004 +0900, Rui Hirokawa wrote:
Hi,
I think objects comparison in PHP5 has problems.
Here is small sample code,<?php
class Foo {
var $v = 1;
}
class Boo {
var $v = 1;
}
$a = new Foo;
$b = new Foo;
$c = new Boo;
$d = new Foo;
$d->v = 2;
$e = $a;// value comparison
echo $a == $b ? "same," : "not same,";
echo $a == $c ? "same," : "not same,";
echo $a == $d ? "same," : "not same,";
echo $a == $e ? "same" : "not same";
echo "\n";
// value and type comparison
echo $a === $b ? "same," : "not same,";
echo $a === $c ? "same," : "not same,";
echo $a === $d ? "same," : "not same,";
echo $a === $e ? "same" : "not same";
?>The output from PHP4 and PHP5(ze1_compat on/off) is,
PHP 4.3.6 :
same,not same,not same,same
same,not same,not same,samePHP 5.0.0RC2 zend.ze1_compatibility_mode=off :
same,not same,not same,same
(Notice: Object of class [Foo|Boo] could not be converted to integer)
not same,not same,not same,samePHP 5.0.0RC2 zend.ze1_compatibility_mode=on :
same,same,not same,same
not same,not same,not same,not sameThe problem and question are,
- the different class is recognised as same in PHP5 (ze1_compat=on).
- the same object is recognised as different in PHP5 (ze1_compat=on).
- Why integer casting of object was implicitly applied in PHP5
(ze1_compat=off) ?
--
Rui Hirokawa <rui_hirokawa@ybb.ne.jp
Hello Rui,
Monday, May 10, 2004, 1:24:33 AM, you wrote:
I performed the same test with HEAD (PHP 5.0.0RC3-dev (build: May 9
2004 10:16:50)).
There are no
E_NOTICE
message now, but, the problems are still existing with
RC2,
PHP 4.3.6
same,not same,not same,same
same,not same,not same,same
As long as we don't change this all is fine (because of BC).
PHP 5.0.0-CVS 2004/5/9 (ze1_compatibility_mode = Off)
same,not same,not same,same
not same,not same,not same,same
The only think i am unsure is the first reult. But it makes
pretty much sense the way it is now. It should compare all
member variables and return equality if they are all equal.
AFAIK it does so. The only difference to 4.3 then is the 5th
result:
class Foo {
var $v = 1;
}
$a = new Foo;
$b = new Foo;
echo $a === $b ? "same," : "not same,";
In this example $a will be Object Id #1 and $b will become
Object Id #2. Now tell me how those two could be identical?
Every other resut than 'different' is simply bullshit.
PHP 5.0.0-CVS 2004/5/9 (ze1_compatibility_mode = On)
same,same,not same,same
not same,not same,not same,not same
This should be the same as with 4.3. Since it obviously
is not it must be fixed or the compatibility mode only
provides weak compatibility and this will become a known
issue.
marcus