【问题标题】:How do you escape namespace string你如何转义命名空间字符串
【发布时间】:2019-07-24 09:00:56
【问题描述】:

php 中命名空间的新手并试图调用一个虚拟类。下面是代码

include "App/Controllers/Home.php";
// This code works but I commented it out to try it the otherway
//$home = new \App\Controllers\Home();

$namespace = "\App\Controllers\\";
$home = new  $namespace . Home();
$home->index();

显示错误

致命错误:未捕获的错误:在 C:\xampp\htdocs\namespace\index.php:16 中找不到类 '\App\Controllers\' 堆栈跟踪:#0 {main} 在 C:\xampp\htdocs 中抛出\namespace\index.php 第 16 行

我相信我没有正确地转义命名空间,你能帮忙吗?

【问题讨论】:

  • 您在哪里需要该课程?另外,您为什么将 $namespace 声明为要在下一行使用的 var?
  • 我需要通过加载器加载类,我需要稍后将命名空间作为变量或常量添加到加载器......所以尝试一下。
  • 为什么不先声明命名空间namespace \App\Controllers;,然后再声明$home = new Home;?或者您可以一次性完成所有操作(使用单引号意味着您不必转义反斜杠)$class = '\App\Controllers\Home\'; $home = new $class();
  • 不是真的关于转义......注意错误消息是怎么说的,“找不到类 '\App\Controllers\'” - 根本没有提到Home?那是因为Operator Precedence - new 是最高的,所以你写的基本上相当于(new $namespace) . (Home()),那当然不是你想要的。
  • 我更新了整个东西,如果你能再次看到会很高兴。

标签: php namespaces


【解决方案1】:

根据 misorude 的建议,您可以尝试:

$namespace = "\\App\Controllers\\";
$classname = $namespace . 'Home';
$home = new  $classname();
$home->index();

【讨论】:

    【解决方案2】:

    您应该更喜欢对命名空间使用单引号 - 使用双引号可能会产生一些令人惊讶的效果,因为如果某些序列包含在双引号中,则它们具有 special meaning。对于单引号,您只需要关心尾随 \,因为 \' 将作为转义的 ' 工作,并且不会被解释为字符串的结尾:

    $namespace = 'App\Controllers\\';
    

    但这是不寻常的情况,通常你使用的是 FQN,所以没有这样的问题:

    $className = 'App\Controllers\Home';
    $home = new $className();
    

    或者只使用::class - 这更像是 IDE 和 SCA:

    $className = \App\Controllers\Home::class;
    $home = new $className();
    

    【讨论】:

      猜你喜欢
      • 2018-07-22
      • 2013-04-01
      • 2010-09-19
      • 2010-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-10
      相关资源
      最近更新 更多