php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Doc Bug #20842 No explanation of object comparison and copying
Submitted: 2002-12-05 16:22 UTC Modified: 2003-04-01 00:47 UTC
From: dparks at verinform dot com Assigned: jmcastagnetto (profile)
Status: Closed Package: Documentation problem
PHP Version: 4.2.3 OS: Any
Private report: No CVE-ID: None
 [2002-12-05 16:22 UTC] dparks at verinform dot com
I cannot find any explanation of object copying or comparison in the PHP manual (or in the user comments).

Even a note saying "don't expect comparison operators to work on objects" would by useful -- it would have saved me a couple of days of debugging and rewriting code.

Patches

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2002-12-05 19:11 UTC] jmcastagnetto@php.net
Can you be more precise about what comparison operations you have in mind? Remember that PHP is not OOP, it is a language that supports OOP-style coding, so there is no inherent way of checking if 2 different instances of objects are of the same class w/ the same properties, or two variables pointing to the same object instance.

The following code generates the expected result:

function bool2str($bool) {
	if ($bool === false) {
		return 'FALSE';
	} else {
		return 'TRUE';
	}
}
class Foo {

	var $flag;

	function Foo($flag=true) {
		$this->flag = $flag;
	}
}

$o = new Foo();
$p = new Foo(false);
$q = new Foo();

// this should be true
echo bool2str($o == $q)."\n";
// this should be false
echo bool2str($o != $q)."\n";
// this should be true
echo bool2str($o === $q)."\n";
// this should be false
echo bool2str($o == $p)."\n";
// this should be false
echo bool2str($o === $p)."\n";
// this should be true
echo bool2str($o != $p)."\n";
// this should be true
echo bool2str($o !== $p)."\n";



 [2002-12-05 19:53 UTC] dparks at verinform dot com
Argh!! Apparently, PHP evaluates

$this->val = val;

without error, treating val like 'val'. I can't find this documented in the manual.

The code posted near the end of the bug at http://bugs.php.net/bug.php?id=20681 (look for [28 Nov 2:02pm] moriyoshi@php.net) contains an error like this, which was not noticed by 4 people. Because of this, the code returns true for all comparisons.

The behavior you describe is what I expected. Sorry about the mixup.

It would still be nice to have an explanation about how copies (assignment) are done on objects -- is this a deep value copy? How are references handled?

Also, it would be nice if the comparison operator page explained how recursion is handled.
 [2002-12-07 06:40 UTC] goba@php.net
Jesus, it would be nice to have your examples in the documentation. I cannot add it right now, unfortunately.
 [2002-12-08 06:02 UTC] m dot ford at lmu dot ac dot uk
Re:

> Argh!! Apparently, PHP evaluates
> 
> $this->val = val;
> 
> without error, treating val like 'val'. I can't find this documented in
> the manual.

The following appears in the manual page for Constants (http://www.php.net/manual/en/language.constants.php):

http://uk.php.net/manual/en/language.constants.php

> If you use an undefined constant, PHP assumes that you
> mean the name of the constant itself. A notice will be
> issued when this happens.

Admittedly this is not very obvious, but it is there.  Perhaps an additional note somewhere in the section on strings would be appropriate, as this seems to be a fairly common error (particularly in array subscripts!).

Cheeers!
 [2002-12-08 18:32 UTC] dparks at verinform dot com
http://www.php.net/manual/en/language.constants.php says a notice should be generated. I did not get a notice. Maybe we have notice-level messages turned of on php.ini or something like that? I'll check this again when I get to work tomorrow.
 [2002-12-10 14:51 UTC] jmcastagnetto@php.net
Assigning this bug to myself so I won't forget to add examples to the docs.
 [2003-04-01 00:47 UTC] jmcastagnetto@php.net
This bug has been fixed in CVS.

In case this was a PHP problem, snapshots of the sources are packaged
every three hours; this change will be in the next snapshot. You can
grab the snapshot at http://snaps.php.net/.
 
In case this was a documentation problem, the fix will show up soon at
http://www.php.net/manual/.

In case this was a PHP.net website problem, the change will show
up on the PHP.net site and on the mirror sites in short time.
 
Thank you for the report, and for helping us make PHP better.


 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Mon Sep 09 22:01:27 2024 UTC