【问题标题】:Fatal error: Cannot declare class致命错误:无法声明类
【发布时间】:2016-11-05 06:20:03
【问题描述】:

我不明白为什么php给我一个错误

“致命错误:无法声明类 rex\builder\RexBuilder,因为 名称已在 /var/www/site2.dev/App/rex/RexBuilder.php 上使用 第 12 行"

RexBuilder 静态类,只调用1次。 我对项目进行了搜索,不再是同名的类。

    <?php

namespace rex\builder;

require_once 'Router.php';

use rex\router\Router;

error_reporting(E_ALL);
ini_set('display_errors', 1);

class RexBuilder {

    public static function collector($array) {
        $router = new Router();
        foreach ($array as $key => $val) {
            $router->get($val->getMethod(), $val->getInterfaces(), $val->getHandler());
        }
        $router->init();
    }
}
?>

调用index.php中的类

RexBuilder::collector(array(
new BuildModel('POST', '/api/v1/user/register', new \api\register\Registration()),
new BuildModel('POST', '/api/v1/user/login', new \api\login\Login())));

更多这个类没有使用

【问题讨论】:

  • /var/www/site2.dev/App/rex/RexBuilder.php 我们想要这个文件代码(完整并在第 12 行前面注释)
  • @Anant,添加完整代码
  • class RexBuilder 存在冲突(因为您似乎是第二次尝试定义它),因此请检查您的所有命名空间。您是否在index.php 中收到此错误?
  • @Anant,我不知道这是不是错误,但现在它消失了。我奠定了根目录index.php和index.html。唯一的挑战是 index.php RexBuilder,它收集了 url 的 api。在 index.html 中是通过 js 调用这些 url。我在api.php上更改了index.php的名称。现在没有错误了。
  • index.php 中没有错误。

标签: php


【解决方案1】:

问题肯定是因为您将RexBuilder.php 文件包含了两次而不是一次。

如果您通过这种方式调用文件:include('RexBuilder.php'); 或这种方式require('RexBuilder.php');,请将其更改为 include_once('RexBuilder.php');require_once('RexBuilder.php');,仅允许一次调用文件。

【讨论】:

  • 感谢您的帮助...有时我们确实会犯愚蠢的错误!
【解决方案2】:

由于use rex\router\Router; 重复类而引发错误。

当您编写 use namespace.. 时,这意味着您可以直接进入该命名空间,就像它是您当前的命名空间一样


我们看下一段代码:

我们将创建一个文件并声明它属于命名空间类\a

//file: a.php
<?php

namespace classes\a;

class A{

}

现在让我们创建另一个文件b.php(并声明它属于命名空间类\b,但这对示例没有任何意义)

namespace classes\b;

require_once "a.php";

use classes\a; //Notice that I'm using this namespace, it means I can use it directly

class A{

}

产生错误

致命错误:无法声明类 classes\b\A,因为该名称已在中使用

我们必须有可能的解决方案:

首先:去掉use标签,直接写命名空间

class A{
    function __constructor(){
        $instance = new classes\a\A();
    }
}

其次,给它起别名

use classes\a as out_a;

class A{
    function __constructor(){
        $instance = new out_a\A();
    }
}

对于您的代码,只需删除 use 或给它一个别名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-29
    • 2010-10-17
    • 2014-11-07
    • 2012-07-31
    • 2016-03-25
    • 2017-01-21
    • 1970-01-01
    相关资源
    最近更新 更多