I am quite confused in implementing namespace in php, especially when it comes to alias - importing classes.
I have followed the tutorial from this tutorial:
- Leveraging PHP V5.3 namespaces for readable and maintainable code (by Don Denoncourt; 1 Mar 2011; for IBM Developerworks)
But I don't understand - when __autoload
is used, why I have to store the alias classes in folders, but when __autoload
is not used, the alias in namespace are just fine, like this below,
<?php
namespace barbarian;
class Conan {
var $bodyBuild = "extremely muscular";
var $birthDate = 'before history';
var $skill = 'fighting';
}
namespace obrien;
class Conan {
var $bodyBuild = "very skinny";
var $birthDate = '1963';
var $skill = 'comedy';
}
use \barbarian\Conan as mother;
$conan = new mother();
var_dump($conan);
var_dump($conan->bodyBuild);
$conan = new \obrien\Conan();
var_dump($conan);
var_dump($conan->birthDate);
?>
While this I will get error, if I don't store Conan.php
in the folder of barbarian
<?php
require_once "autoload.php";
use \barbarian\Conan as Cimmerian;
$conan = new Cimmerian();
var_dump($conan);
?>
the error message,
Warning: require(barbarian/Conan.php): failed to open stream: No such file or directory in C:\wamp\www\test\2013\php\namepsace\autoload.php on line 12
The autoload.php:
<?php
function __autoload($classname) {
$classname = ltrim($classname, '\\');
$filename = '';
$namespace = '';
if ($lastnspos = strripos($classname, '\\')) {
$namespace = substr($classname, 0, $lastnspos);
$classname = substr($classname, $lastnspos + 1);
$filename = str_replace('\\', '/', $namespace) . '/';
}
$filename .= str_replace('_', '/', $classname) . '.php';
require $filename;
}
?>
Is it a must to store alias classes in folders? Is it possible to import the classes without storing them in folders when autoload
is used?