OK, sorry, as I hadn't read the 'autofunc' RFC, I was not talking about the API 
described there. You're right: by introducing a second argument to 
spl_autoload_register(), you register each autoloader with the type it can be 
called for.

The API I was talking about would not modify spl_autoload_register(), but would 
check at runtime wether each autoloader is 'new-style' or 'old-style' by 
checking the number of args it declares. This way we can restrict calls to 
old-style autoloaders to 'class' resolutions only.

Both APIs are technically OK. The only potential problem I see with the 
autofunc API is that it is incompatible with the __autoload() way to declare an 
autoloader. I don't say we must keep __autoload() AND spl_autoload_register() 
but it is a BC break.

> -----Message d'origine-----
> De : sebastian.krebs.ber...@gmail.com
> [mailto:sebastian.krebs.ber...@gmail.com] De la part de Sebastian Krebs
> Envoyé : mercredi 7 novembre 2012 09:12
> À : PHP internals list
> Objet : Re: [PHP-DEV] Re: [PHP-WEBMASTER] Why isn't `spl_autoload`
> called for functions?
> 
> 2012/11/7 Laupretre François <francois.laupre...@francetv.fr>
> 
> > > De : sebastian.krebs.ber...@gmail.com
> > > > I hope you find more support on this than I had. Technically
> > > speaking,
> > > > it would be easy to extend autoloading to functions and
> constants.
> > > > It can even be done without BC breaks, combining 'old-style' and
> > > > 'new-
> > > style'
> > > > autoloaders without ambiguity (adding a second argument to the
> > > > autoload hook, and checking the number of args declared by the
> > > function).
> > > >
> > >
> > > Thats not even required, if you fixate (--> default value) the
> > > second parameter to "class" all existing loaders will behave, like
> > > they did before.
> >
> > Correct, but that's not enough to preserve BC.
> >
> > OK, giving a default value of 'class' to the second arg allows using
> a
> > 'new-style' autoloader with an 'old-style' PHP engine.
> >
> > But, now consider the opposite, using a 'new-style' PHP engine, with
> > autoloading extended to functions and constants, with one or more
> > 'old-style' autoloaders: when the engine needs to autoload a function
> > or a constant, we must not call any 'old-style' autoloader, as it
> > would take the symbol and attempt to load a class by that name. And
> > the easiest way to decide if an autoloader is a new or old-style one
> > is to check if the autoload handler func is declared with one or two
> args.
> >
> 
> // signature
> function spl_autoload_register($autoload, $type = SPL_AUTOLOAD_CLASS);
> 
> // "Old style"
> spl_autoload_register(function($classname) {
>   // foobar
> });
> 
> // "new style"
> sply_autoload_register(function($name, $type) {
>   switch ($type) {
>     // Foobar
>   }
> }, SPL_AUTOLOAD_CLASS | SPL_AUTOLOAD_FUNCTION | SPL_AUTOLOAD_CONSTANT);
> 
> Why is this "not enough"? Even if we pass the type as second argument
> to the autoloader, nothing (in behaviour) will change. You are right,
> that we must not call the first one, when it's not required, but also
> it _will_ not get called, because it is not registered to get called
> for anything except classes. Maybe I got you wrong?
> 
> 
> If you want a more "organized" autoloader, create a class for it :)
> 
> class MyAutoloader {
>   public function __invoke ($name, $type) {
>     switch ($type) {
>       case SPL_AUTOLOAD_CLASS: return $this->loadClass($name); break;
>       case SPL_AUTOLOAD_FUNCTION: return $this->loadFunction($name);
> break;
>       case SPL_AUTOLOAD_CONSTANT: return $this->loadConstant($name);
> break;
>       default: return false; break;
>     }
>   }
>   // Here load*() functions
> }
> 
> spl_autoloader_register(new MyAutoloader, SPL_AUTOLOAD_ALL);
> 
> 
> Just my thoughts
> 
> 
> >
> > François
> >
> >
> 
> 
> --
> github.com/KingCrunch

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

Reply via email to