致命错误:命名空间声明语句必须是脚本中的第一个语句

问题描述 投票:25回答:21

我正在尝试使用它为我的网站创建一个图像表单上传,我使用它的原因是因为它比自己做所有事情更安全(但如果有人可以指出另一个工作脚本,我将不胜感激)

simon-eQ / ImageUploader

Fatal error: Namespace declaration statement has to be the very first statement in the script in C:\xampp\htdocs\project\lib\ImageUploader.php on line 4

看一下源代码:

<br />
<b>Fatal error</b>:  Namespace declaration statement has to be the very first statement in the script in <b>C:\xampp\htdocs\project\lib\ImageUploader.php</b> on line <b>4</b><br />

我尝试过包含,需要它仍然无法正常工作。

php image-upload
21个回答
48
投票

有时这个问题是因为控制器的PHP开始标记面临相同问题的空间刚刚删除了空格:

<?php 
namespace App\Http\Controllers\Auth;

删除空格解决了我的错误


2
投票

编辑ImageUploader.php - 删除行(导致BulletProofException不在任何地方使用)

class BulletProofException extends Exception{}

或者将它移到线下

namespace BulletProof;

2
投票

如果你看这个文件,Namespace不是第一个语句。

<?php
class BulletProofException extends Exception{}

namespace BulletProof;

您可以尝试在类定义上移动命名空间。


2
投票

如果你想使用这个lib然后在ImageUploader.php中你应该在命名空间声明后移动BulletProofException定义。将此问题的pull-request提交给lib repo :)

编辑:在文件头部进行一些更改:

namespace {
    class BulletProofException extends Exception{}
}

namespace BulletProof {

    class ImageUploader
    { ... }
}

1
投票

声明的命名空间123456789101112

<?php
    namespace app\controllers;

    use yii\web\Controller;
    use app\models\users;
    class UserController extends Controller {
        public function actionIndex() {
            echo "working on .....";
        }    
    }

1
投票

我用这种方式解决这个问题当我开始无关紧要utf8就这样打开<?php在编辑器的第一行我的案例是sublime文本和命名空间writte在第二行

2 <?php命名空间mynamespace; //你应该把你的命名空间写在你打开php的地方这里应该在第3行我在这里犯错误因为我从第2行开始打开<?php

1 <?php namespace mynamespace; //我从第1行<?php开始工作


1
投票

这都是关于namespace宣言。根据http://php.net/manual/en/language.namespaces.definition.php,所有namespace声明必须在<?php打开php标签后放在文件的最顶部。这意味着在编写文件上的任何代码之前,如果该文件需要包含在namespace中,那么在编写任何代码之前必须首先声明namespace。像这样:

<?php
namespace App\Suport\Facades;

class AuthUser {
  // methods and more codes
}

但是declare关键字可以放在namespace声明之前,所以这仍然有效:

<?php
declare(maxTries = 3);

namespace App\Suport\Facades;

class AuthUser {
  // methods and more codes
}

所有其他的东西必须放在namespace关键字之后。有关更多信息,请阅读http://php.net/manual/en/language.namespaces.definition.php


1
投票

我刚刚发现了一种提出这种异常的简单方法;让您的文本编辑器默认保存为UTF-8。除非您可以强制它省略字节顺序标记,这可能不容易甚至不可能,取决于您的编辑器,您将在开头<前面有一个“字符”,它将被隐藏在视图之外。

幸运的是,当我想到这种可能性时,我将我的编辑器(UltraEdit)切换为十六进制模式,它隐藏了任何内容,甚至没有隐藏字节顺序标记。编写了多年处理字节顺序标记的代码后,我立即认出了它。

将文件另存为ANSI / ASCII,并接受默认的1252 ANSI Latin-1代码页,问题解决了!


1
投票

通过从另一个控制器复制控制器代码我也遇到了同样的问题,然后通过删除php标签之前的空格来解决问题

            <?php

0
投票

就我而言,该文件是使用UTF-8-BOM编码创建的。我必须将其保存为UTF-8编码,然后一切正常。


0
投票

如果你使用相同的编辑器,有时<?php之后的空间可见,在我的情况下,我使用的是TextWrapper。由于TextWrapper中的文件类型配置(在您的情况下是其他编辑器),您可能看不到空格。在您的机器中使用不同的编辑器,您将看到它。然后删除它们 - 之后完美地工作。


13
投票

This thread似乎在讨论相同的问题 - 听起来这个错误通常是由于在遇到命名空间语句之前将一些数据发送出服务器而引起的。

  1. 你的网站托管可以在PHP代码之前将一些代码插入你的页面吗?
  2. 文档开头是否有UTF-8字节顺序标记?

另一方面,它也可能是ImageUploader中的一个错误...... main PHP file将命名空间放在类定义之后,我在PHP文档中没有看到,它说它应该是第一个PHP代码。来自this page

使用namespace关键字声明命名空间。包含命名空间的文件必须在任何其他代码之前在文件顶部声明命名空间 - 有一个例外:declare关键字。

这里没有声明关键字,所以也许这是源代码中的一个错误,由开发人员的PHP版本滑落,因为他没有先放置命名空间:

<?php
class BulletProofException extends Exception{}

namespace BulletProof;
/**
 * BulletProof ImageUploder:
...

0
投票

UTF-8 Byte Order Mark at the beginning of the document
^THIS for me solved the issue. I opened the inolved file with an HEX editor and removed the BOM at the start of the file.

-1
投票

耗尽驱动器空间后,我收到了相同的错误消息。当我意识到php文件被破坏时,我复制了内容并创建了一个新文件(我使用Sublime Text进行编辑),它解决了我的问题


11
投票

我也遇到过这个问题。在php文件中,我编写了以下代码,其中在php开始标记之前有一些空格

<?php
namespace App\Controller;

当我删除那个空间时,它解决了。


10
投票

如果您使用IDE,则必须在第一行启动代码。示例我使用aptana studio3

//line1<?php
//line2  your code
//line3  your code
....
....

希望它有所帮助。这解决了我的问题。


7
投票

您必须将文件编码更改为ANSI。我使用Notepad ++编码UTF-8并遇到了同样的问题。将文件编码更改为ANSI后问题消失了!


4
投票

档案|在我遇到它的两种情况下,删除PhpStorm中的BOM修复了这个问题。


4
投票

确保在php标记之前没有空格

// whitespace
<?php
    namespace HelloWorld
?>

在php标记启动之前删除空白区域

<?php
    namespace HelloWorld
?>

3
投票

该库根本不工作,setSizeLimit被破坏,setImageSize被忽略了,只是不要使用它。

$result = $newUpload
                ->setFileTypes(array("jpg", "gif", "png", "jpeg"))
                ->setSizeLimit(array("min"=>100, "max"=>100000))
                ->setImageSize(array("height"=>200, "width"=>200))
                ->uploadTo('ads/')
                ->save($_FILES['newad_image']);
                $page.=$result;

给出这个:

Notice: Undefined offset: 1 in C:\xampp\htdocs\project\lib\ImageUploader.php on line 229

Notice: Undefined offset: 0 in C:\xampp\htdocs\project\lib\ImageUploader.php on line 229

编辑:大小似乎是字节,即使错误说Kilobytes。


2
投票

它的来源有一个错误。如果可能,请查看其来源。它读起来像这样

<?php
    class BulletProofException extends Exception{}

    namespace BulletProof;
    ....

那太疯狂了。就个人而言,我会说代码记录良好,优雅,但作者错过了一个简单的观点;他在类中声明了命名空间。每当使用时,名称空间应该是第一个语句。

太糟糕了我不在Github;可能已经提出了一个请求:(

© www.soinside.com 2019 - 2024. All rights reserved.