Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP类_存在-获取致命错误:无法重新声明clas?_Php_Namespaces_Spl_Spl Autoload Register - Fatal编程技术网

PHP类_存在-获取致命错误:无法重新声明clas?

PHP类_存在-获取致命错误:无法重新声明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

当用户/开发人员提供的两个类不存在时,我想返回一条错误消息

core/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';
    }
}
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
。谢谢如果工作是我的答案)