【问题标题】:Fatal error: Namespace declaration statement has to be the very first statement in the script in致命错误:命名空间声明语句必须是脚本中的第一个语句
【发布时间】:2014-02-21 08:59:06
【问题描述】:

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

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

我已经尝试过包含、需要,但它仍然不起作用。

【问题讨论】:

  • 该文件已损坏(最后一次提交损坏了它,可能不是故意的)。提交错误报告。
  • 库根本不工作,setSizeLimit 坏了,setImageSize 也被忽略了,只是不要使用它。
  • @user2536244 请立即尝试。这是我的库。另外检查我的answer,如果有任何问题,请立即告诉我。正如乔恩所说,最后一次提交破坏了它。
  • 将编码更改为 iso-8859-1

标签: php image-upload


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • “任何地方都没有空间”是什么意思?
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      确保您的 php 标签前没有没有空格

      // whitespace
      <?php
          namespace HelloWorld
      ?>
      

      在你的 php 标签开始前删除空格

      <?php
          namespace HelloWorld
      ?>
      

      【讨论】:

      • 谢谢:这就是解决方案
      • 完美:你节省了我的时间。
      • 这是完美的解决方案。
      • 又好又容易!谢谢
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

                    <?php
        

        【讨论】:

          【解决方案7】:

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

          【讨论】:

          • 这正是我的问题和解决方案。谢谢!
          • 这是我遇到的问题。 BOM 算作 PHP 标记之前的空格。使用 Vim,set nobomb | wq 将删除 BOM。
          【解决方案8】:

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

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

          删除空格解决了我的错误

          【讨论】:

          • 我在我的代码中遇到了同样的问题
          • 这样的错误让我想知道在stackoverflow之前的早期编程一定是什么样子
          • 绝对传奇。这只是救了我。那些卑鄙的空间!
          • 还要检查您的 IDE 是否创建了 UTF-8 文件(没有 BOM)UTF-8 BOM。例如,在 phpStorm Settings / Editor / File Encodings -> Create UTF-8 files: with NO BOM
          【解决方案9】:

          我刚刚发现了一种引发此异常的简单方法;让您的文本编辑器默认保存为 UTF-8。除非您可以强制它忽略字节顺序标记,这可能并不容易甚至不可能,取决于您的编辑器,您将在开头的

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

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

          【讨论】:

            【解决方案10】:

            这一切都与namespace 声明有关。根据http://php.net/manual/en/language.namespaces.definition.php 所有namespace 声明必须放在文件的最顶部&lt;?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

            【讨论】:

              【解决方案11】:

              当我开始时我以这种方式修复它并不重要 utf8 只是这样在编辑器的第一行中打开&lt;?php 在我的情况下是崇高文本和命名空间在第二行中写入

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

              1 &lt;?php 命名空间 mynamespace; // 我从第 1 行开始 &lt;?php 它 WORK

              【讨论】:

                【解决方案12】:

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

                <?php
                namespace App\Controller;
                

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

                【讨论】:

                • 仔细看。。我的在
                【解决方案13】:

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

                【讨论】:

                • 非常感谢,帮我找到了 sollutin。 +1
                • 我猜字节顺序标记 (BOM) 可能是罪魁祸首。一些编辑器默认使用它保存 UTF-8 文档,然后它往往会破坏脚本。见en.wikipedia.org/wiki/Byte_order_mark
                • 谁会猜到,+1
                【解决方案14】:

                命名空间声明 123456789101112

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

                【讨论】:

                • 您可能想解释一下您的解决方案为何有效以及如何运作。
                【解决方案15】:

                如果您使用的是 IDE,则必须从第一行开始编写代码。 例如我使用 aptana studio3

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

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

                【讨论】:

                  【解决方案16】:

                  库根本不工作,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
                  

                  编辑:大小似乎以字节为单位,即使错误显示为千字节。

                  【讨论】:

                  • 图书馆工作 100%。只是有一些错别字要修正。我添加了一些我没有密切关注的代码。实际上我昨晚正在研究它,从头开始重写它,增加更多功能,已经完成了 50%..
                  • -&gt;setImageSize(array("height"=&gt;200, "width"=&gt;200)) 不起作用,将这些通知扔到第 229 行
                  【解决方案17】:

                  如果你想使用这个库,那么在 ImageUploader.php 中你应该在命名空间声明之后移动 BulletProofException 定义。 将此问题的拉取请求提交到 lib repo :)

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

                  namespace {
                      class BulletProofException extends Exception{}
                  }
                  
                  namespace BulletProof {
                  
                      class ImageUploader
                      { ... }
                  }
                  

                  【讨论】:

                  • 如果我这样做:Fatal error: Class 'BulletProof\Exception' not found in
                  • 好的,将BulletProofException 包装到命名空间中:` namespace { class BulletProofException extends Exception{} } namespace BulletProof { ...class....} `
                  【解决方案18】:

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

                  1. 您的虚拟主机是否会在 PHP 代码之前将一些代码插入您的页面?
                  2. 文档开头是否有 UTF-8 字节顺序标记?

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

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

                  这里没有declare关键字,所以这可能是开发者版本的PHP漏掉的源代码中的一个bug,因为他没有把命名空间放在第一位:

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

                  【讨论】:

                  • 该死的,BOM!每次都能吸引我。
                  【解决方案19】:

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

                  <?php
                  class BulletProofException extends Exception{}
                  
                  namespace BulletProof;
                  

                  您可以尝试将命名空间移到类定义之上。

                  【讨论】:

                  • 没有。命名空间不能删除,否则不起作用
                  • 我不会这么说@Alez。仅将命名空间定义移动到文件顶部;-)
                  【解决方案20】:

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

                  class BulletProofException extends Exception{}
                  

                  或将其移到行下

                  namespace BulletProof;
                  

                  【讨论】:

                    【解决方案21】:

                    来源有误。如果可以,请查看其来源。是这样的

                    <?php
                        class BulletProofException extends Exception{}
                    
                        namespace BulletProof;
                        ....
                    

                    这太疯狂了。就个人而言,我会说代码有据可查,而且很优雅,但是作者错过了一个简单的点;他在类中声明了命名空间。无论何时使用命名空间都应该是第一条语句。

                    可惜我不在 Github;否则可以拉一个请求:(

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2015-09-10
                      • 2017-03-05
                      • 2015-11-22
                      • 2020-09-03
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多