Doc #61422 [Opn->Ver]: Clarify when autoloading is triggered

[email protected]
Newsgroups php.doc.bugs
Message-ID <[email protected]>
Edit report at https://bugs.php.net/bug.php?id=61422&edit=1

 ID:                 61422
 Updated by:         [email protected]
 Reported by:        danko at very dot lv
-Summary:            Lack of autoload on type hinting breaks class_alias
+Summary:            Clarify when autoloading is triggered
-Status:             Open
+Status:             Verified
 Type:               Documentation Problem
-Package:            SPL related
+Package:            *General Issues
 Operating System:   Linux
 PHP Version:        5.4.0
 Block user comment: N
 Private report:     N

 New Comment:

This has nothing to do with class_exist(), but is rather because
type declarations of free standing functions never trigger
autoloading[1].

[1] <https://3v4l.org/NuX6K>


Previous Comments:
------------------------------------------------------------------------
[2012-05-01 13:51:10] danko at very dot lv

It hit me that:

- The behaviour is consistent with instanceof

- Calling autoload in instanceof is unacceptable (for obvious reasons), no bug here.

- The case with instanceof is much worse, since instead of raising an error instanceof returns a WRONG RESULT and it is the CORRECT BEHAVIOUR.

- This is hardly obvious and is bound to lead to some beautiful glitches.

I therefore propose that a warning is placed on the page for __autoload / spl_autoload_register and/or class_alias (if it is, indeed, the only thing this problem would break).

------------------------------------------------------------------------
[2012-03-16 21:10:16] danko at very dot lv

Sorry, what I meant in the last example is
	// Create a Demo object using "Y",
	// and pass that to function expecting "X"

------------------------------------------------------------------------
[2012-03-16 21:06:27] danko at very dot lv

Description:
------------
I found #39003 which implies that autoload *was* called for type hinting previously and called for removal of this "unnecessary" feature.

I beg to differ. Our framework depends on using class_alias to provide a dynamic modular structure, and one real class may have multiple aliases depending on situation, and these aliases are currently added when needed. Therefore, if an object is creating using alias X (or no alias at all) and is passed to a function expecting the same class under alias Y (and no object was created using that alias) a completely invalid fatal error is raised (see a simplified demo below).

I would also like to point out, that if after calling autoload it turns out that it was not, in fact, an alias, the call will fatally fail anyway, so a really useless autoload will be only called once. I don't see any "resource consumption" problem here.

Test script:
---------------
<?

	class Demo { }
	
	// An "autoload" handler creating an alias for the same class
	spl_autoload_register(function ($class) {
		class_alias('Demo', $class);
	});
	
	// Create a Demo object using "A"
	// and pass that to function expecting "A"
	function success(A $test) {
		echo "Success ".get_class($test)."\n";
	}
	success(new A());
	
	// Create a Demo object using "B",
	// then create another Demo object using "C"
	// and pass that to function expecting "B"
	function also(B $test) {
		echo "Success ".get_class($test)."\n";
	}
	new B();
	also(new C());
	
	// Create a Demo object using "X",
	// and pass that to function expecting "B"
	function fail(X $test) {
		echo "Success ".get_class($test)."\n";
	}
	
	fail(new Y());
	
	// Note that all of these names refer to the same class,
	// and all objects are of the same class



Expected result:
----------------
Success Demo
Success Demo
Success Demo

Actual result:
--------------
Success Demo
Success Demo
PHP Catchable fatal error:  Argument 1 passed to fail() must be an instance of X, instance of Demo given


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



--
Edit this bug report at https://bugs.php.net/bug.php?id=61422&edit=1
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.