It's because of this method [Zend/Loader/Autoloader.php]:
/**
* Autoload a class
*
* @param string $class
* @return bool
*/
public static function autoload($class)
{
$self = self::getInstance();
foreach ($self->getClassAutoloaders($class) as $autoloader) {
if ($autoloader instanceof Zend_Loader_Autoloader_Interface) {
if ($autoloader->autoload($class)) {
return true;
}
} elseif (is_string($autoloader)) {
if ($autoloader($class)) {
return true;
}
} elseif (is_array($autoloader)) {
$object = array_shift($autoloader);
$method = array_shift($autoloader);
if (call_user_func(array($object, $method), $class)) {
return true;
}
}
}
return false;
}
There's no handler for lambdas. The elseif part should be combined to
something like
} else if (is_callable($autoloader)) {
return call_user_func($autoloader, $class);
}
or better yet, the callback validation should be done when adding
autoloaders since the autoload method is called often. There's no point in
testing if it's callable it every single time.
-- Mon
On Fri, Jul 3, 2009 at 4:11 PM, Markus Wolff <[email protected]>wrote:
> Hi there,
>
> I've been toying around with the new bootstapping mechanism and autoload
> capabilities in ZF 1.8. To add the icing on the cake, I'm also using PHP
> 5.3's new lambda functions.
>
> This combination does not yet work for me, though.
>
> Here's an example from my Bootstrap class:
>
> $loader = Zend_Loader_Autoloader::getInstance();
>
> $loader->pushAutoloader(function($class) use ($fileList) {
> error_log("Loading $class with fileList: " . count($fileList));
> if (!empty($fileList[$class])) {
> require_once $fileList[$class];
> }
> }, 'phpillow');
>
> $loader->pushAutoloader(function($class) {
> error_log("Loading $class");
> include APPLICATION_PATH . '/models/' . $class . '.php';
> }, 'Model');
>
> Now, when I try to invoke a class "ModelFooBar" that extends
> "phpillowDocument", I would expect those two functions to be called.
> Nothing happens, though.
>
> If I simply call spl_autoload_register instead of using
> Zend_Loader_Autoload, everything works fine:
>
> spl_autoload_register(function($class) {
> if (strpos($class, 'Model') === 0) {
> error_log("Loading $class");
> include APPLICATION_PATH . '/models/' . $class . '.php';
> }
> error_log('Tried to find class ' . $class);
> });
>
> Am I using the Autoload class wrong, or does it simply not work with
> lambda functions yet?
>
> CU
> Markus
>
>
>