【问题标题】:use vs include as an import statement in PHP在 PHP 中使用 vs include 作为导入语句
【发布时间】:2018-01-15 13:10:55
【问题描述】:

我有 2 个简单的文件:

file1.php

<?php
namespace NM\data;
class MyClass
{
    static function myStaticFunction(){
        echo __NAMESPACE__." heheh";
    }
}
function myfunction()
{
    echo __FUNCTION__." some data";
}
const MYCONST = 1;

和file2.php:

<?php
// include 'file1.php';
use NM\data as NM;
class MyClass
{
}
function myfunction()
{
    echo __NAMESPACE__." heheh";
}
const MYCONST = 2;
echo NM\myfunction();

文档说您可以使用 use 作为命名空间的导入命令。 http://php.net/manual/en/language.namespaces.importing.php

我只用use 导入命名空间收效甚微。对于要使用的其他命名空间,我必须使用include。但如果我使用include,则use 只是一个别名。

是否可以仅使用 use 关键字导入命名空间?

【问题讨论】:

  • useinclude 是非常不同的生物; include 包含一个文件,use 关联一个命名空间,use 不包含任何文件,导入!== 包括...没有包含与使用
  • 请看php.net/manual/en/language.namespaces.importing.php#example-258。该示例使用use My\Full\Classname as Another;,但不包含任何内容。那怎么不是错误呢?它一定是从某个地方导入了一个命名空间。
  • 停止混淆导入和包含.....它们完全是一回事......use确实自动包含任何文件,它只是为类提供别名......除了use之外,还可以使用include,或者使用自动加载器来执行包含
  • 正如您自己引用的那样,use 仅适用于 命名空间。命名空间实际上只与事物的命名有关。它完全不关心从文件中加载代码。
  • 也许我应该重新表述我的困惑。 php.net/manual/en/language.namespaces.importing.php#example-‌​258 使用 use My\Full\Classname as Another; 命名空间`My\Full\Classname`从何而来? id 是否在另一个文件中声明(我不需要包含)?

标签: php


【解决方案1】:

但是如果我使用include,那么use 只是执行一个别名。

是的,这就是use 所做的一切。 use 只是命名空间的别名。不多也不少。它与从文件中实际加载任何一段代码是正交的。

【讨论】:

  • (现在重新删除评论:)是的。为类/函数使用长名称的目的是消除歧义并避免命名冲突。为长名称使用 PHP 的命名空间功能的意义在于,您可以将它们别名为短名称,因此您不必在每次引用类/函数时都输入整个长名称。所以别名是命名空间的一个相当重要的特性。它仍然没有说它会为你找到代码本身。
  • aa,所以The ability to refer to an external fully qualified name with an alias == importing。抱歉评论
  • @sanjihan 你明白了。
  • 该死的,这是一种令人困惑的说法:D 感谢您抽出宝贵的时间。
  • 那么有没有办法垂直加载那段代码?或者实际上是正交以外的任何其他角度?
【解决方案2】:

其实是有办法的。阅读 PHP 中的自动加载函数,我建议查看 PSR-4 Autoloading

在 PHP 5.3 之前没有命名空间-s,所以文件是由 include 函数加载的。那时我们有 PSR-0,它按其名称加载文件,但这会导致类名很长,如“Mage_Admin_Model_Block”。 (这被解析为位于目录“Mage/Admin/Model/Block.php”中的文件

随着 php 5.3+ 中引入的命名空间,引入了新的自动加载标准,它使用命名空间来解析包含我们要使用的类定义的文件的路径。

例如这个 use Symfony\Bundle\FrameworkBundle\Controller\Controller

被解析为:'Symfony\Bundle\FrameworkBundle\Controller\Controller.php`

所以 PHP 不知道类文件的位置,但通过使用自动加载器,它可以解析该文件所在的位置并在需要时加载它。您可以编写自己的代码来执行此操作,但我强烈建议您坚持 PSR-4 标准(PSR-0 现在已过时)

【讨论】:

  • 明确一点:自动加载早在 5.3 或命名空间之前就已经存在; PSR-4 只是指定了制作交叉兼容的自动加载器的规则,特别是涉及命名空间。
  • @deceze 是的。在 PSR-4 之前,我们有“spl_autoload_register”,之前的规范命名为 PSR-0,所以这个概念早在 php 5.3 之前就已经存在
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-27
  • 1970-01-01
  • 2012-08-05
  • 1970-01-01
相关资源
最近更新 更多