* Thus wrote Ed Lazor:
> > -----Original Message-----
> > What you can do is something like this:
> >
> >
> 1> function __autoload($class_name) {
> 2> static $_stack = array();
> 3>
>
> This didn't seem to work. The stack stuff just ends up dumping the value of
> $class_name. Also, why check to see if the class exists on line #8? Isn't
> PHP calling __autoload already confirming that the class doesn't exist?
Yeah, i didn't test the code, just throwing out some ideas :) The
class_exist() call is used to ensure that even though the was
successfully included, the class was actually defined in there as
well.
>
> I'll include copies of the two scripts below. Here's information on the
> scripts that might help explain things.
>
> The first script is being saved as Test.php. It includes a class called
> Test.
>
> The second script is being saved as test2.php. This script has a class
> called ClassDependent. It depends on the Test class.
>
> I'm trying to address two situations are being addressed here. What if the
> file Test.php is missing for some reason. And, even if the file is present,
> what happens if the file / class hasn't been loaded?
>
> In my opinion, if class Test is missing, it makes sense to know up front.
> It provides a sort of checks and balances. Otherwise, the class doesn't
> show as missing until there's an attempt to load it. I can easily see
> deploying an app without realizing there's a problem until someone happens
> to use some osbure feature that depends on the missing class.
I usually get around this solution by using require_once inside my
class definitions, for all the classes it relies on:
<?php
require_once('classes/Foo/Bar.php'); // Defines FooBar
class Qaz {
function doSomething() {
$foo_bar = new FooBar();
}
}
?>
This forces a compile error and forces you ensures that classes are
defined.
> I know that I could just create a list of files belonging to the app and
> check to make sure that they are all present when starting. It seems like
> there could be a lot of overhead in maintaining something like this. It
> also seems to make sense that you'd want classes to define their own
> dependencies for portability. What do you think?
>
> All of this kind of leads into why I'd like autoload (or some other tool) to
> indicate which class ran into a problem loading another class. In the
> examples below, it helps troubleshoot things if the error message tells me
> that ClassDependent was unable to load class Test. Hehe Having the error
> message tell me which line number would also be super cool, but maybe that's
> not possible.
If you want full control of the loading of your classes, then you
might want to use a Factory Class, that manages loading of your
objects:
<?php // Factory.php
class Factory {
static private $uses = array();
static public function newObject($obj) {
if (! class_exists($obj) ) {
Factory::$uses = array(); //reset
//include class file...
//require_once($obj);
// validate/load these classes...
var_dump(Factory::$uses);
if ($some_sort_of_error ) {
throw new Exception(Factory::errorString());
}
}
return new $obj;
}
static public function uses() {
Factory::$uses = func_get_args();
}
static public function errorString() {
// obtain proper file, line, function backtrace
// with debug_backtrace..
return $message;
}
}
?>
<?php // Test.php
Factory::uses('TestClass', 'OtherClass'):
class Test { ... }
?>
Then:
require('Factory.php');
try {
$obj = Factory::newObject('Test');
}
Of course all the above probably needs a lot of work :)
Curt
--
The above comments may offend you. flame at will.
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php