【问题标题】:Don't understand php namespace, how can I call function from another class?不懂 php 命名空间,如何调用另一个类的函数?
【发布时间】:2016-11-22 17:22:47
【问题描述】:

我正在尝试为 php 使用 Azure 存储,设置步骤是包含命名空间,包含 composer autoload 然后使用 azure 类,所以我有以下内容。但是再往下,我使用类 Microgrid 并且由于命名空间而找不到它,它位于不同的目录中。如何使用不属于该命名空间的其他类?另外,指定命名空间路径的正确方法是什么?它位于与此页面相关的不同目录中,我使用的不是根目录,我应该从根目录开始吗?

namespace MicrosoftAzure\Storage;
use \MicrosoftAzure\Storage\Common\ServicesBuilder;
use \MicrosoftAzure\Storage\Blob\Models\CreateContainerOptions;
use \MicrosoftAzure\Storage\Blob\Models\PublicAccessType;
use \MicrosoftAzure\Storage\Common\ServiceException;

require_once '/var/www/html/vendor/autoload.php';


$action = MicroGrid::GetParameter('action');

【问题讨论】:

  • use \namespace\where\microgrid\located\MicroGrid; ?
  • 如果你的类没有命名空间,你可以试试这个:$action = \MicroGrid::GetParameter('action');
  • 当你声明命名空间是从根还是相对的?

标签: php namespaces


【解决方案1】:

类名被认为是相对于当前命名空间的,除非它们以 \

开头

这意味着在MicrosoftAzure\Storage 命名空间内,您可以使用类的相对命名空间。

如果你想从不同的命名空间调用一个类,你应该为它调用完全限定的名称,比如

$action = \MicrosoftAzure\WhereEver\MicroGrid::GetParameter('action');

或使用具有完全限定名称的名称空间或唯一类

use \MicrosoftAzure\WhereEver;

use \MicrosoftAzure\WhereEver\MicroGrid;

然后:

$action = MicroGrid::GetParameter('action');

已编辑以使其清晰

命名空间允许我们避免命名冲突和长别名 避免命名冲突引起的名称。

一个简单的例子取决于你的自动加载器我创建一个新项目并在位于根目录的 index.php 中制作这个自动加载器

function __autoload($className){
    //if it's a full name with windows style slashes correct the path
    $file_name = str_replace('\\', '/', $className);
    require_once("vender/src/".$file_name.".php");
}

当我调用$date = new \App\Utility\Date(); 时,自动加载器将需要这个文件:

verdor/src/App/Utility/Date.php

Date.php 中我使用了这个命名空间命名空间App\Utility;

【讨论】:

  • 好吧,我不明白首先应该如何声明命名空间,我的天蓝色库在 ../vendor/MSAzure/Storage 中,而微网格在 ../include/classes 中,应该我从根目录声明命名空间,我怎么能回去,所以我可以使用我的微电网类?
【解决方案2】:

PHP提供开箱即用的类自动加载器。

PHP 有很多自动加载器,最常见的自动加载器标准是PSR-4,被许多框架和应用程序使用。

如果你不使用自动加载器,你应该在使用之前要求每个类文件(和递归依赖项)。

Azure 使用 Composer Autoloader 和 PSR-4。

您应该在您的项目中使用 Composer Autoloader,然后从正确的命名空间导入您的类(您没有在示例代码中导入它)

【讨论】:

  • 我用的是composer,忘了包含那行,导入是什么意思?
  • use Some\Class\Namespace\ClassName 是一个导入语句。您没有在任何地方导入 MicroGrid 类
  • 我也没有在 azure php sdk 上找到任何名为 MicroGrid 的文件。你确定这是类名吗?
  • Microgrid 是一个不相关的类,它是使用自动加载器包含的。它也在不同的目录中,我想这是我的问题的一部分.. azure 库在 ../vendor/MSAzure/Storage 中,而 microgrid 在 ../include/classes 中,我应该从根目录声明命名空间吗?所以它就像 ../html/vendor/MSAzure 我可以使用 ../html/include/microgrid?
  • 然后你应该在文件顶部使用 PHP 的 require('path/to/your/class.php); 手动加载你的 MicroGrid 类。
【解决方案3】:

命名空间基本上将您的类组合在一起。您可以通过显式使用它来使用命名空间之外的东西,例如

namespace App;

use Illuminate\Database\Eloquent\Model;

在这种情况下,我在名为“App”的命名空间中“分组”这个类和其他类,但我想使用 Eloquent 提供的“模型”(Eloquent 类的命名空间为“Illuminate\Database\Eloquent”)在这堂课中。

如果“微电网”不是您当前命名空间的一部分,您需要在“使用”语句中显式添加其命名空间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 2017-10-24
    • 2019-06-02
    • 2012-08-22
    • 2011-03-22
    • 2021-01-06
    相关资源
    最近更新 更多