命名空间和包含脚本问题

时间:2018-07-09 00:14:17

标签: php

我们有以下php脚本MySpace/Scaffold.php

#!/usr/bin/env php
<?php
namespace Playground\MySpace;  // <-- IT FAILS HERE
…
?>

并将其包含在其他脚本中,

require_once("MySpace/Scaffold.php");

失败并

  

PHP致命错误:命名空间声明语句必须非常   第一个语句或脚本中的任何声明调用之后   ... /第3行上的PHP / playground / src / MySpace / Scaffold.php

我浏览了php.net上的官方文档,但找不到解释。

当我用#! shebang删除第一行时,它开始正确包含它。

为什么PHP自首次打开<?php标记以来就不对语句进行计数? 为什么还要打扰上面的非PHP内容呢?

namespace Playground\MySpace;是php代码中的第一条语句时,为什么PHP解释器(7.2.7,Zend Engine v3.2.0)失败并出现上述错误?

2 个答案:

答案 0 :(得分:0)

如您所见here,该sheebang命令是在从命令行中执行脚本时使用的。

  

在Unix系统上,特殊的#! (或“ shebang”)第一行应添加到PHP脚本中,以便系统可以自动判断哪个程序应运行该脚本。

因为从服务器上执行php并不是必需的,所以实际上并不会分析此命令,并且会在结果文件中打印此文本(就像第一个开始标记之前的所有HTML文本一样)。 (您可以在IDE中检查一下,该行可能显示为纯文本) 因为PHP已经输出了某些内容,所以他抱怨设置名称空间。

答案 1 :(得分:0)

在PHP manual的命名空间部分中缺少以下声明:

  

此外,任何非PHP代码都不能在名称空间声明之前,包括多余的空格:

     

示例#2声明一个名称空间

<html>
<?php
namespace MyProject; // fatal error - namespace must be the first statement in the 
script
?>

此外,与任何其他PHP构造不同,可以在多个文件中定义相同的名称空间,从而允许在文件系统中拆分名称空间的内容。

就是这样。只是不支持的功能。

给您带来的不便,我们深表歉意。只是习惯了不同风格的文档。