PHP类_存在-获取致命错误:无法重新声明clas?
当用户/开发人员提供的两个类不存在时,我想返回一条错误消息 core/model/Conan.phpPHP类_存在-获取致命错误:无法重新声明clas?,php,namespaces,spl,spl-autoload-register,Php,Namespaces,Spl,Spl Autoload Register,当用户/开发人员提供的两个类不存在时,我想返回一条错误消息 core/model/Conan.php namespace core\model; class Conan { var $bodyBuild = 'extremely muscular'; var $birthDate = 'before history'; var $skill = 'fighting'; public function methodConan() { r
namespace core\model;
class Conan
{
var $bodyBuild = 'extremely muscular';
var $birthDate = 'before history';
var $skill = 'fighting';
public function methodConan()
{
return 'The methodConan from namespace core\model';
}
}
local/model/Conan.php
namespace core\model;
class Conan
{
var $bodyBuild = 'extremely muscular';
var $birthDate = 'before history';
var $skill = 'fighting';
public function methodConan()
{
return 'The methodConan from namespace core\model';
}
}
名称空间本地\模型
class Conan
{
var $bodyBuild = 'very skinny';
var $birthDate = '1963';
var $skill = 'comedy';
public function methodConan()
{
return 'The methodConan from namespace local\model';
}
}
index.php
define ('WEBSITE_DOCROOT', str_replace('\\', '/', dirname(__FILE__)).'/');
include 'core/helper/BaseClassAutoloader.php';
// Autoload the 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';
}
}
我想得到“两者都不存在”
结果,我得到了这个错误
致命错误:无法在中重新声明类local\model\Conan
C:\wamp\www..\local\model\Conan.php
在线8
这真的没有道理
我下面的自动加载有什么问题吗
自动加载类
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 as $pathDirectory)
{
$iterator = new RecursiveIteratorIterator
(
new RecursiveDirectoryIterator(WEBSITE_DOCROOT.$pathDirectory), // Must use absolute path to get the files when ajax is used.
RecursiveIteratorIterator::SELF_FIRST
);
foreach ($iterator as $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 as $pathDirectory)
{
if(file_exists(WEBSITE_DOCROOT.$pathDirectory.$fileNameName))
{
include WEBSITE_DOCROOT.$pathDirectory.$fileNameName;
if($isNamespace === false) if (class_exists($class_name)) break;
}
}
}
}
尝试使用include_once,而不是第62行的include oh BaseClassAutoLoader.php。尝试使用
require_once
而不是include对于未来的谷歌用户,如果您不控制文件包含过程,比如说在框架内,并且您需要一个urget修复程序,您可以将类定义包装在一个检查中,它将防止php抛出上述错误
if (!class_exists('AwesomCLass')) {
class AwesomCLass extends ParentClass {
// Do awesome stuff here all day long
}
}
对于那些在使用类_exists时出现致命错误的人,可以使用另一种方法,我发现它很有用
$classname = 'Myclass';
if( class_exists( $classname ) ) {
echo "class exists";
} else {
echo "class not exists";
}
相反,我们可以使用如下所示
$classname = 'Myclass';
if( in_array($classname, get_declared_classes() ) ) {
echo "class exists";
} else {
echo "class not exists";
}
在
包含网站之前添加\u DOCROOT.$pathDirectory.$fileNameName代码>->var\u dump(网站\u DOCROOT.$pathDirectory.$fileNameName)
您可以看到您试图包含的内容,并尝试使用require\u once
而不是include
它似乎可以使用require\u once
。谢谢如果工作是我的答案)