Req #61265 [Opn->Csd]: __autoload should know about traits

From: Date: Wed, 23 Nov 2016 16:55:06 +0000
Subject: Req #61265 [Opn->Csd]: __autoload should know about traits
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-205578@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=61265&edit=1

 ID:                 61265
 Updated by:         cmb@php.net
 Reported by:        manchokapitancho at gmail dot com
 Summary:            __autoload should know about traits
-Status:             Open
+Status:             Closed
 Type:               Feature/Change Request
 Package:            Class/Object related
 PHP Version:        5.4.0
-Assigned To:        
+Assigned To:        cmb
 Block user comment: N
 Private report:     N

 New Comment:

This has been suggested and discussed on the internal mailing list
a while ago[1], and since it's impossible to distinguish between
classes, traits and interfaces in general, has been rejected, so
I'm closing this request.

[1] <http://marc.info/?t=142936723900002&r=1&w=2>


Previous Comments:
------------------------------------------------------------------------
[2013-06-24 17:23:43] jwalton at m3hc dot com

$extension = array(".pclass", ".pinterface", ".ptrait");
spl_autoload_register(function($classname, $type) {
  global $includepath;
  if( $type >=0 && $type <= 2 ) {
    $filename = "$includepath/".strtolower($classname).$extension[$type];
    if( is_readable($filename) ) {
      include_once($filename);
    }
  }
});

You could also use spl_autoload_extensions(".pclass,.pinterface,.ptrait") or

spl_autoload_register(function($classname, $type) {
  global $includepath;
  $filename = "$includepath/".strtolower($classname);
  if( is_readable("$filename.pclass" ) {
    include_once("$filename.pclass");
  } else if( is_readable("$filename.pinterface") ) {
    include_once("$filename.pinterface");
  } else if( is_readable("$filename.ptrait") ) {
    include_once("$filename.ptrait");
  }
});

This will make zero difference if all your files are classes (type doesn't mean anything, but
its about 20-30% more efficient when you start including interfaces and traits, because there are
now less stat calls being done on the filesystem.  This code allows for only one stat needed per
call, instead of 1-3.

------------------------------------------------------------------------
[2013-06-24 07:28:02] jwalton at m3hc dot com

Added a patch, where autoloading will pass along the type its looking for.  Should be fixed to have
constants, and a fix of err_012.phpt test should be fixed.  Quick and dirty though, and I'll
clean it up if someone wants it.

function __AUTOLOAD($typename, $type) {

}
or you can use spl as well spl_autoload_register();

$type = 0, Class
$type = 1, Interface
$type = 2, Trait

class Test extends Test2 {};  $type = 0 for loading Test2
class Test implements Test2 {}; $type = 1 for loading Test2
class Test { use Test2; }; $type = 2 for loading Test2
class_exists("A"); $type = 0 for loading A
interface_exists("A"); $type = 1 for loading A
trait_exists("A"); $type = 2 for loading A

This patch is for php-5.5.0 release.

------------------------------------------------------------------------
[2013-06-24 07:22:18] jwalton at m3hc dot com

Actually, the ambiguous ones (i.e. is_a) do not call the autoload.

------------------------------------------------------------------------
[2012-03-26 22:04:42] phristen at yahoo dot com

Ok, my point is still valid though.

Imagine I used is_a($a, "A", true) instead.

------------------------------------------------------------------------
[2012-03-26 03:42:08] phpmpan at mpan dot pl

instanceof operator does not trigget class loading:
-----------------------------------------
class X {}
function __autoload($name) {
    echo "Loading $name...\n";
}
$x = new X();
if ($x instanceof X) {
    echo 'x is X';
}
if ($x instanceof NonExistingClass) {
    echo 'blarg';
}
-----------------------------------------
The same applies to argument types.

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


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

    https://bugs.php.net/bug.php?id=61265


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


Thread (12 messages)

« previous php.bugs (#205578) next »