Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[PHP-DEV] Nesting level too deep - recursive dependency?

1 view
Skip to first unread message

Francisco M. Marzoa Alonso

unread,
Oct 18, 2004, 11:37:58 AM10/18/04
to
This code:

<?php

class TestClass {
public $myself;

function __construct () {
$this->myself = $this;
}
}

$TestObj = new TestClass ();

if ( $TestObj->myself == $TestObj ) {
echo "They are same.\n";
}

?>

Gives me a "Fatal error: Nesting level too deep - recursive dependency?"
on line #13: if ( $TestObj->myself == ...)

Could this be a PHP bug or I'm doing something wrong?

FYI:

PHP Version 5.0.2
PHP API 20031224
PHP Extension 20040412
Zend Extension 220040412
Server API Apache 2.0 Handler

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Andi Gutmans

unread,
Oct 18, 2004, 9:20:53 PM10/18/04
to
Are you using zend.zend1_compatibility_mode on?

Andi

Greg Beaver

unread,
Oct 18, 2004, 11:21:15 PM10/18/04
to
Andi Gutmans wrote:
> Are you using zend.zend1_compatibility_mode on?
>
> Andi

The same apparent bug exists on my windows xp system, independent of the
sapi, with zend1_compatibility off. It was also in the 5.0.0 release,
so is not an introduction since then.

Greg

Benj Carson

unread,
Oct 19, 2004, 1:13:18 AM10/19/04
to
If you use '===' it works as expected. I don't know if the fact that '=='
doesn't work is a bug or not, however.


Benj Carson


On October 18, 2004 09:39 am, Francisco M. Marzoa Alonso wrote:
> This code:
>
> <?php
>
> class TestClass {
> public $myself;
>
> function __construct () {
> $this->myself = $this;
> }
> }
>
> $TestObj = new TestClass ();
>
> if ( $TestObj->myself == $TestObj ) {
> echo "They are same.\n";
> }
>
> ?>
>
> Gives me a "Fatal error: Nesting level too deep - recursive dependency?"
> on line #13: if ( $TestObj->myself == ...)
>
> Could this be a PHP bug or I'm doing something wrong?
>
> FYI:
>
> PHP Version 5.0.2
> PHP API 20031224
> PHP Extension 20040412
> Zend Extension 220040412
> Server API Apache 2.0 Handler

--

Jevon Wright

unread,
Oct 19, 2004, 2:32:11 AM10/19/04
to
I first stumbled upon this problem in one of the RCs for PHP 5, but at the
time I thought I was at fault...

Consider the documentation at
http://www.php.net/manual/en/language.oop5.object-comparison.php : the
documentation is a little vague, but it does say "Two object instances are
equal if they have the same attributes and values, and are instances of the
same class." Thus explaining the recursive loop...

Maybe write a big flashing note in the documentation instead about this
trap?

Jevon

Greg Beaver

unread,
Oct 19, 2004, 10:12:29 AM10/19/04
to
Jevon Wright wrote:
> I first stumbled upon this problem in one of the RCs for PHP 5, but at the
> time I thought I was at fault...
>
> Consider the documentation at
> http://www.php.net/manual/en/language.oop5.object-comparison.php : the
> documentation is a little vague, but it does say "Two object instances are
> equal if they have the same attributes and values, and are instances of the
> same class." Thus explaining the recursive loop...
>
> Maybe write a big flashing note in the documentation instead about this
> trap?

Better, if two values satisfy ===, they are clearly ==. I would imagine
it would not be expensive to simply do a === check before doing the ==
check in the engine?

Greg

Andi Gutmans

unread,
Oct 19, 2004, 1:45:15 PM10/19/04
to
The reason is that == compares the elements as opposed to === which
compares the object handles.
We get infinite recursion comparing these two because the object points at
itself.
I'm not sure if there's a good way of solving that.
Do you really want == ordoes === do the job for you?

Andi

At 05:39 PM 10/18/2004 +0200, Francisco M. Marzoa Alonso wrote:
>This code:
>
><?php
>
>class TestClass {
> public $myself;
>
> function __construct () {
> $this->myself = $this;
> }
>}
>
>$TestObj = new TestClass ();
>
>if ( $TestObj->myself == $TestObj ) {
> echo "They are same.\n";
>}
>
>?>
>
>Gives me a "Fatal error: Nesting level too deep - recursive dependency?"
>on line #13: if ( $TestObj->myself == ...)
>
>Could this be a PHP bug or I'm doing something wrong?
>
>FYI:
>
>PHP Version 5.0.2
>PHP API 20031224
>PHP Extension 20040412
>Zend Extension 220040412
>Server API Apache 2.0 Handler
>

Andi Gutmans

unread,
Oct 19, 2004, 1:47:12 PM10/19/04
to
At 10:10 AM 10/19/2004 -0400, Greg Beaver wrote:
>Jevon Wright wrote:
>>I first stumbled upon this problem in one of the RCs for PHP 5, but at the
>>time I thought I was at fault...
>>Consider the documentation at
>>http://www.php.net/manual/en/language.oop5.object-comparison.php : the
>>documentation is a little vague, but it does say "Two object instances are
>>equal if they have the same attributes and values, and are instances of the
>>same class." Thus explaining the recursive loop...
>>Maybe write a big flashing note in the documentation instead about this
>>trap?
>
>Better, if two values satisfy ===, they are clearly ==. I would imagine
>it would not be expensive to simply do a === check before doing the ==
>check in the engine?

That might actually be a good idea. It would definitely solve some
headaches and be faster.
Does anyone object to me doing this?

Andi

Jevon Wright

unread,
Oct 19, 2004, 6:45:20 PM10/19/04
to
That's a really elegant solution... I'm up for trying that out. Remember to
do != too :)

Jevon

Andi Gutmans

unread,
Oct 20, 2004, 2:04:42 PM10/20/04
to
Fixed in CVS.

At 05:39 PM 10/18/2004 +0200, Francisco M. Marzoa Alonso wrote:
>This code:
>
><?php
>
>class TestClass {
> public $myself;
>
> function __construct () {
> $this->myself = $this;
> }
>}
>
>$TestObj = new TestClass ();
>
>if ( $TestObj->myself == $TestObj ) {
> echo "They are same.\n";
>}
>
>?>
>
>Gives me a "Fatal error: Nesting level too deep - recursive dependency?"
>on line #13: if ( $TestObj->myself == ...)
>
>Could this be a PHP bug or I'm doing something wrong?
>
>FYI:
>
>PHP Version 5.0.2
>PHP API 20031224
>PHP Extension 20040412
>Zend Extension 220040412
>Server API Apache 2.0 Handler
>

0 new messages