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

时间:2014-01-29 13:52:08

标签: php image-upload

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

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 />

我尝试过包含,要求,但仍然无效。

21 个答案:

答案 0 :(得分:47)

有时这个问题是因为控制器的PHP开始标记中存在空间 面对同样的问题只是删除了空格:

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

删除空格解决了我的错误

答案 1 :(得分:13)

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

  1. 你的网络托管可以在PHP代码之前将一些代码插入你的页面吗?
  2. 文档开头是否有UTF-8字节顺序标记?
  3. 另一方面,它也可能是ImageUploader中的一个错误...... main PHP file将命名空间放在类定义之后,我在PHP文档中没有看到它,它说它应该是第一个PHP代码。来自this page

      

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

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

    <?php
    class BulletProofException extends Exception{}
    
    namespace BulletProof;
    /**
     * BulletProof ImageUploder:
    ...
    

答案 2 :(得分:11)

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

<?php
namespace App\Controller;

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

答案 3 :(得分:10)

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

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

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

答案 4 :(得分:7)

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

后,问题就消失了

答案 5 :(得分:3)

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

答案 6 :(得分: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。

答案 7 :(得分:2)

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

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

namespace {
    class BulletProofException extends Exception{}
}

namespace BulletProof {

    class ImageUploader
    { ... }
}

答案 8 :(得分:2)

确保您的php标记前没有无空格

// whitespace
<?php
    namespace HelloWorld
?>

在您的php标签开始之前删除空白

<?php
    namespace HelloWorld
?>

答案 9 :(得分:2)

如果您查看此文件,则Namespace不是第一个语句。

<?php
class BulletProofException extends Exception{}

namespace BulletProof;

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

答案 10 :(得分:2)

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

class BulletProofException extends Exception{}

或在线下移动

namespace BulletProof;

答案 11 :(得分:2)

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

<?php
    class BulletProofException extends Exception{}

    namespace BulletProof;
    ....

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

太糟糕了我不在Github;本来可以提出一个要求:(

答案 12 :(得分:1)

命名空间声明 123456789101112

<?php
    namespace app\controllers;

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

答案 13 :(得分:1)

当我开始时这样修复它并不重要utf8只是这样在我的case sublime文本的编辑器的第一行打开<?php而在第二行中的命名空间写入

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

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

答案 14 :(得分:1)

关于namespace声明的全部内容。根据{{​​3}},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
}

所有其他内容必须 AFTER namespace关键字。有关详细信息,请阅读http://php.net/manual/en/language.namespaces.definition.php

答案 15 :(得分:1)

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

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

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

答案 16 :(得分:1)

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

SELECT 
    Name,
    Date,
    ,Identifier
    MAX(CASE WHEN Row_nnum = 1 THEN Text END)  ||
    MAX(CASE WHEN Row_nnum = 2  THEN ', ' || Text ELSE '' END) ||
    MAX(CASE WHEN Row_nnum = 3  THEN ', ' || Text ELSE '' END) ||
    MAX(CASE WHEN Row_nnum = 4  THEN ', ' || Text ELSE '' END) ||
    MAX(CASE WHEN Row_nnum = 5  THEN ', ' || Text ELSE '' END) ||
    MAX(CASE WHEN Row_nnum = 6  THEN ', ' || Text ELSE '' END) ||
    MAX(CASE WHEN Row_nnum = 7  THEN ', ' || Text ELSE '' END),
    SUM(val)
FROM TABLE 
GROUP BY 1,2,3;

答案 17 :(得分:0)

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

答案 18 :(得分:0)

如果您使用的是同一编辑器,有时<?php之后的空格是可见的,在我的情况下,我使用的是TextWrapper。由于TextWrapper中的文件类型配置(在您的情况下为其他编辑器),您可能看不到该空间。在计算机中使用其他编辑器,您将看到它。然后将它们删除-之后可以正常使用。

答案 19 :(得分:0)

文档开头的UTF-8字节顺序标记
^这对我来说解决了这个问题。我用十六进制编辑器打开了已解决的文件,并在文件开头删除了BOM。

答案 20 :(得分:-1)

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