namespaces - PHP class_exists - getting Fatal error: Cannot redeclare clas instead? -
namespaces - PHP class_exists - getting Fatal error: Cannot redeclare clas instead? -
i want homecoming an error message when two classes provided user/ developer don't exist.
core/model/conan.php,
namespace core\model; class conan { var $bodybuild = 'extremely muscular'; var $birthdate = 'before history'; var $skill = 'fighting'; public function methodconan() { homecoming 'the methodconan namespace core\model'; } }
local/model/conan.php,
namespace local\model;
class conan { var $bodybuild = 'very skinny'; var $birthdate = '1963'; var $skill = 'comedy'; public function methodconan() { homecoming 'the methodconan namespace local\model'; } }
index.php,
define ('website_docroot', str_replace('\\', '/', dirname(__file__)).'/'); include 'core/helper/baseclassautoloader.php'; // autoload core & local classes. $autoloader = new baseclassautoloader([ 'local/model/', 'core/model/' ]); if (class_exists('\foo\model\conan')) { echo 'from local'; } else { if(class_exists('\boo\model\conan')) { echo 'from core'; } else { echo 'both don\'t exist'; } }
i suppose 'both don\'t exist'
result, error instead,
fatal error: cannot redeclare class local\model\conan in c:\wamp\www...\local\model\conan.php on line 8
it doesn't create sense!
is wrong autoload below??
autoload class,
class baseclassautoloader { public function __construct($directory) { $this->directory = $directory; spl_autoload_register(array($this,'getclass')); } private function getclass($class_name) { if(is_array($this->directory)): $maindirectories = $this->directory; else: $maindirectories = array($this->directory); endif; $subdirectories = []; $namespace = "\\"; $isnamespace = false; $parts = explode($namespace, $class_name); if(strpos($class_name, $namespace) !== false) { $isnamespace = true; } $filenamename = end($parts).'.php'; foreach($maindirectories $pathdirectory) { $iterator = new recursiveiteratoriterator ( new recursivedirectoryiterator(website_docroot.$pathdirectory), // must utilize absolute path files when ajax used. recursiveiteratoriterator::self_first ); foreach ($iterator $fileobject) { if ($fileobject->isdir()) { $pathnamereplace = str_replace('\\', '/', $fileobject->getpathname()); $array = explode("/",$pathnamereplace); $folder = end($array); if($folder === '.' || $folder === '..') {continue;} $subdirectories[] = preg_replace('~.*?(?=core|local)~i', '', str_replace('\\', '/', $fileobject->getpathname())) .'/'; } } } $merged_directories = array_merge($maindirectories,$subdirectories); foreach($merged_directories $pathdirectory) { if(file_exists(website_docroot.$pathdirectory.$filenamename)) { include website_docroot.$pathdirectory.$filenamename; if($isnamespace === false) if (class_exists($class_name)) break; } } } }
try using require_once
instead of include
php namespaces spl spl-autoload-register
Comments
Post a Comment