Req #52907 [Opn]: "is" operator -- test whether two lvalues are references to each other

From: Date: Wed, 22 Sep 2010 15:27:38 +0000
Subject: Req #52907 [Opn]: "is" operator -- test whether two lvalues are references to each other
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-154569@lists.php.net to get a copy of this message
Edit report at http://bugs.php.net/bug.php?id=52907&edit=1 ID: 52907 User updated by: a_different_name at hotmail dot com Reported by: a_different_name at hotmail dot com Summary: "is" operator -- test whether two lvalues are references to each other Status: Open Type: Feature/Change Request Package: Variables related PHP Version: Irrelevant Block user comment: N New Comment: The second line of the test script would actually be better as $b = $a; as it would test whether ($a is $b) is broken if you simply assign one variable to another. (It should be false if changing $a won't also change $b, but my understanding is that PHP does some copy-on-write thing when assigning -- meaning that $a and $b could *appear* identical even though they're not.) Previous Comments: ------------------------------------------------------------------------ [2010-09-22 17:18:36] a_different_name at hotmail dot com Description: ------------ Currently, PHP has "==", which loosely checks for equality, and "===", which strictly checks for equality. However, for strings and booleans and such, both only test for equality -- there's no way to know (without altering the variable's contents) whether two variables are identical references unless they refer to an object. If PHP allows the creation of references, there should be some safe and built-in way of testing whether that's been done, so values don't get unexpectedly mangled. Test script: --------------- $a = 'test'; $b = "$a"; // Interpolated, so it should not be pooled or anything if PHP does that $c =& $a; // These all print if ($a == $b) print "\$a == \$b\n"; if ($b == $c) print "\$b == \$c\n"; if ($a == $c) print "\$a == \$c\n"; // These all print too, as expected if ($a === $b) print "\$a === \$b\n"; if ($b === $c) print "\$b === \$c\n"; if ($a === $c) print "\$a === \$c\n"; // I use "is" here, because other languages use it // if they don't already use /==+/ for this purpose. if ($a is $b) print "\$a is \$b\n"; // should not print if ($b is $c) print "\$b is \$c\n"; // should not print if ($a is $c) print "\$a is \$c\n"; // should run Expected result: ---------------- $a == $b $b == $c $a == $c $a === $b $b === $c $a === $c $a is $c Actual result: -------------- Parse error. (There is no "is" operator yet, and no reasonable replacement.) ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/bug.php?id=52907&edit=1

« previous php.bugs (#154569) next »