【问题标题】:Using namespaces in PHP在 PHP 中使用命名空间
【发布时间】:2013-09-20 06:43:32
【问题描述】:

我正在编写使用 Guzzle 框架的 AWS 文档。我必须在这里处理名称空间,但我无法让它工作。我浏览了文档和示例,了解到我们可以为使用命名空间的项目提供包。

我继续尝试了一个简单的示例,但没有成功。这是示例:这是index.php

     use My\Full\Classname as Another;  //Also tried use My\Full\Classname
     $obj = new Another;                //with  $obj = new Classname;    
     echo $obj->add();

我在这样的目录结构中有Classname.php My->Full->Classname.php:

     <?php
        class Classname{
        public static function add(){
                return 2+2;
            }
         }
     ?>

我正在尝试调用index.php 中的函数,但出现错误:

Fatal error: Class 'Another' not found in C:\wamp\www\guzzleEx\index.php on line 19

这是我实例化 Classname 对象$obj = new Another; 的行

我犯了什么错误?是否有任何需要更新的INI 或任何其他配置问题?我怎样才能使代码工作?如果你对 Classname.php 使用普通的include,它就可以正常工作。

【问题讨论】:

  • 您仍然需要包含(或自动加载)类文件。 use 所做的只是将命名空间类名别名为裸类名。
  • 显示注册的自动加载器,并在Classname定义文件的第一行包含namespace My\Full;
  • 什么是注册的自动加载器?我只是按照here 的例子
  • 你知道你必须在每个你想使用该类的地方包含类代码吗?可以通过include "path/File_With_Class.php" 手动操作,也可以使用自动加载功能自动包含。
  • 好吧,我弄错了命名空间会自动加载类,因为我在文档中经历的示例没有任何包含语句(猜想他们假设类是自动加载的),但这让我很困惑。我我正在尝试将 AWS api 中的 guzzle 框架与我面临的问题的应用程序集成。

标签: php class namespaces guzzle


【解决方案1】:

命名空间需要显式声明,它们不是来自某个目录结构。

因此,如果您的 class Classname 前面没有显示 namespace My\Full; 的行,那么您的类不在任何命名空间中,而是在根命名空间中。

因此,您不能将其用作\My\Full\Classname,而是直接用作\Classname 甚至Classname

【讨论】:

  • 我试过这个namespace My\Full; use My\Full\Classname; $obj = new Classname; echo $obj-&gt;add(); 但仍然是同样的错误! :P 我是否还需要更改目录结构,即将classname 文件与index 处于同一级别
  • 如果不包含该类,则在任何地方都找不到。
  • 好的,我的实际问题是我正在尝试使用为 AWS api 提供支持的Guzzle,我想将它用于iterators(这是我的问题)。所以这里没有包含文件中的语句。那么,他们使用自动加载吗?我从 GITHUB 下载了它,但是所有迭代器类都出现相同的错误。请提出正确的方法。我需要正确的方向。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-08
  • 2016-01-05
  • 2015-03-15
  • 1970-01-01
  • 1970-01-01
  • 2012-05-19
  • 2017-07-18
相关资源
最近更新 更多