【问题标题】:Namespace conflict when using 3rd party api in class在课堂上使用 3rd 方 api 时的命名空间冲突
【发布时间】:2019-10-04 19:12:44
【问题描述】:

发生了一些奇怪的事情。我是 php 编程的新手。 我正在尝试使用 FirePHP,但我的问题实际上与该工具没有直接关系。

您将在下面看到的函数fb 是FirePHP 的一部分。我的入口点是Main.php。第一个fb 调用执行时没有任何问题,但第二个调用(参见ExperController.php)在调用Main.php 中的$ec->exper(); 时触发,会导致致命错误:

致命错误:未捕获的错误:第 12 行的 path-to-wp-directory\wp-content\mu-plugins\typerocket\app\Controllers\ExperController.php 中找不到类 'App\Controllers\FirePHP'

为什么运行时引擎在该命名空间 (App\Controllers) 下寻找 FirePHP 类?为什么在第一次fb 通话中这不是一个问题? FirePHP 文件中根本没有定义任何命名空间。我最后一个但至关重要的问题是,如何在不接触 3rd 方文件的情况下解决这个问题? This answer 不是我的案例的解决方案,因为我没有在我的代码中引用/调用提到的类!

注意:通过自动加载器(由 composer 提供)包含 FirePHP。

Main.php:

<?php

fb('Hello World!', FirePHP::INFO);

$req = new \TypeRocket\Http\Request();
$res = new \TypeRocket\Http\Response();
$ec = new \App\Controllers\ExperController($req, $res);
$ec->exper();

ExperController.php

<?php

namespace App\Controllers;


use TypeRocket\Controllers\Controller;

class ExperController extends Controller
{

    public function exper() {
        fb('Hello World!', FirePHP::INFO);
    }

}

【问题讨论】:

  • PHP 在您在ExperController.php 开头定义的当前命名空间下寻找FirePHP。因此,您需要帮助 PHP,并且需要从其他命名空间定义要使用的类。您需要为FirePHP 添加另一个使用行,例如use TypeRocket\Controllers\Controller;。我建议使用一些 PHP IDE 来帮助您参考并告诉您是否缺少一些参考。如果您还没有使用,请遵循 @user122293 的建议并使用 composer。 :)
  • 但如前所述,FirePHP 没有在其文件/类中定义任何命名空间

标签: php namespaces


【解决方案1】:

您是否使用任何依赖管理器,例如作曲家? 当您以某种方式从 main 调用它时,php 可以看到 FirePHP 类在哪里,并且一切正常,但是当您尝试在另一个文件夹中的类中访问它时,您必须定义该类在控制器中的位置,就像您如何定义控制器在哪里一样你扩展的类:

use TypeRocket\Controllers\Controller;

所以将 FirePHP 类添加到您的控制器中,然后一切都会好起来的。

use Path\To\Class\FirePHP;

如果你做了所有的事情但仍然没有工作,你可以尝试转储自动加载;

composer dump-autoload

【讨论】:

  • 谢谢,因为 FirePHP 没有定义命名空间,只需输入“use \FirePHP;”成功了……尽管我需要知道在内部那些第 3 方文件中使用了哪些类并且我需要这样明确的“使用”调用,这很烦人。我猜这就是 php 的工作方式-.-
猜你喜欢
  • 2014-02-19
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
  • 2013-01-26
  • 2010-11-15
  • 2012-12-18
相关资源
最近更新 更多