ID:               49618
 User updated by:  jost dot boekemeier at googlemail dot com
 Reported By:      jost dot boekemeier at googlemail dot com
 Status:           Bogus
 Bug Type:         SPL related
 Operating System: Any
 PHP Version:      5.2.11
 New Comment:

Right. In particular: 

<?php // pjb library
function autoload_pjb($x) {echo "pjb "; return false;}
spl_autoload_register("autoload_pjb");
if(function_exists("__autoload")) spl_autoload_register("__autoload");
?>
<?php // joomla library
function __autoload($x) {echo "joomla "; return false;}
?>

<?php // application
require("pjb.php");
require("joomla.php");
@new Foo();
?>

Please see the link posted with the bug report for all the details.


However, I think neither the user nor joomla nor I have to invent
strange 
workarounds for bugs in the php implementation. Any new introduced PHP
feature 
must be compatible with earlier PHP features, unless the earlier
features have been 
deprecated and a clear migration path exists.

The old __autoload is neither deprecated nor is spl_autoload_register
compatible with 
it. Whoever wrote it and the comment "....This is because
spl_autoload_register() will 
effectively replace the engine cache fo the __autoload function by
either 
spl_autoload()  or spl_autoload_call(). "  wrote a bug.


> Thus, calling spl_autoload_register() replaces __autoload()

If spl_autoload_register is intended to replace the old __autoload
machinery, the old 
__autoload should have been deprecated and a clear migration path
should have 
been given to those using it.


Previous Comments:
------------------------------------------------------------------------

[2009-09-23 07:23:07] sjo...@php.net

So the problem occurs with:

include('spl_autoload_register.php'); // uses spl_autoload_register
include('autoload.php'); // defines __autoload

------------------------------------------------------------------------

[2009-09-22 17:39:32] jost dot boekemeier at googlemail dot com

> if (function_exists("__autoload")) spl_autoload_register("__
autoload")

Doesn't work. In line 7 __autoload is not yet defined.

Note that every line in the given example comes from a separate
include()d php 
library.

This is a link-time problem which only php can resolve: it must save a
legacy 
__autoload handler before creating the spl_autoload stack and call the
legacy 
autoload after all other registered spl_autoload hooks.

------------------------------------------------------------------------

[2009-09-22 17:26:38] sjo...@php.net

If two or more of the libraries use __autoload, it won't work, and
there is nothing anybody can do about it.

If all of the libraries use spl_autoload_register, it works as it
should.

If one of the libraries uses __autoload and others use
spl_autoload_register, it is the task of the library that uses
spl_autoload_register to register __autoload as well, like this:

if (function_exists("__autoload")) spl_autoload_register("__autoload");

------------------------------------------------------------------------

[2009-09-22 09:26:02] jost dot boekemeier at googlemail dot com

My code doesn't use __autoload.

My code uses spl_autoloload.

I have received a bug report because my code has destroyed an existing
library.


By issuing this bug report I have asked you to stop this, by either:

* deprecating __autoload altogether

* fix spl_autoload to honor an existing __autoload or

* let library authors check for an existing (or upcoming) __autoload so
that their 
library doesn't destroy existing code

With the current behaviour I have no other choice but to not use
spl_autoload at all, 
since I don't know whether the user will or will not include a library
which uses 
__autoload later on.

------------------------------------------------------------------------

[2009-09-22 09:11:12] sjo...@php.net

Thank you for your report.

I do not think the behavior you describe is a bug. The documentation is
clear about this:
"If your code has an existing __autoload function then this function
must be explicitly registered on the __autoload stack. This is because
spl_autoload_register() will effectively replace the engine cache for
the __autoload function by either spl_autoload() or
spl_autoload_call()."

Thus, calling spl_autoload_register() replaces __autoload().

------------------------------------------------------------------------

The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
    http://bugs.php.net/49618

-- 
Edit this bug report at http://bugs.php.net/?id=49618&edit=1

Reply via email to