Reply to Re: classes: strange behavior

Your name:

Reply:


Posted by Chung Leong on 05/07/06 05:39

Paul Czubilinski wrote:
> Hello,
>
> I have a problem with code like this (PHP 5.1.4):
>
> fila A.php:
> =======
>
> include(B.php);
> class document extends obj {
> .........
> }
>
> file B.php:
> =======
>
> $GLOBALS['x']->new we();
>
> function __autoload($class_name) {
> ...here is the code to load classes...
> }
>
> file C.php
> =======
>
> class we extends obj {
>
> private $document;
>
> function __construct() {
> $this->document = new document();
> }
>
> }
>
>
> The problem is that after loading A.php into browser, PHP cannot find
> document class which is defined in the A.php file! The problem is even
> more strange - if document class doesnt extends obj class than
> everything is ok.
>
> (The problem exact is that __autoload special function is called when
> in file C.php constructor of class we try to make the document object
> (all other classes like obj has been already loaded).
>
> Do you have any idea what is wrong with that?

There are limits to PHP's ability to resolve class cross-dependency. I
think you might have bumped into one. I can't quite figure out the load
order of the classes in your example, but I suspect the problem has
something to do with class autoloading. When a class is defined outside
any runtime directives (such as a function), PHP tries to resolve a
class at compile time as well as runtime. Consider the following:

class A extends B {
}

class B {
}

When PHP first encounter A at compile time, there is no way for it to
resolve the class, as it hasn't seen B yet. So it quietly skips over
it, moving on to the definition of B. When PHP runs the code in global
scope, it'll try to resolve A again. This time, B is defined, so
everything is okay.

The situation changes when the definitions are inside a function:

function dingo() {

class A extends B {
}

class B {
}

}

As the function might never be called, PHP cannot resolve either class
at compile time. Both A and B have to be resolved at runtime. Because A
is declared before B, PHP will try to resolve it first--and fail.

[Back to original message]


Удаленная работа для программистов  •  Как заработать на Google AdSense  •  England, UK  •  статьи на английском  •  PHP MySQL CMS Apache Oscommerce  •  Online Business Knowledge Base  •  DVD MP3 AVI MP4 players codecs conversion help
Home  •  Search  •  Site Map  •  Set as Homepage  •  Add to Favourites

Copyright © 2005-2006 Powered by Custom PHP Programming

Сайт изготовлен в Студии Валентина Петручека
изготовление и поддержка веб-сайтов, разработка программного обеспечения, поисковая оптимизация