我应该在php中使用'use'?

时间:2017-03-10 14:26:47

标签: php namespaces autoload

据我所知,php use大部分时间都是使用(没有双关语),以缩短命名空间的类名以供使用。我的问题如下:我有一个项目,可能使用大约300-400个班级。所有这些类都是命名空间,并放在它们各自的目录中,因此注册的自动加载可以在它们确实需要时包含它们,从而防止加载一堆文件的开销,当它们不一定需要时。

现在我想使用use来缩短某些类名,因此我可以更快地编写代码。我的问题如下:

我应该在哪里放use来缩短这些内容?

  1. 我应该将它们直接放在需要缩短类的脚本文件中吗?

  2. 我可以创建一个单独的文件来定义所有use命令吗?

  3. 我更喜欢第二个选项,我唯一不知道的是,如果我这样做,不会php加载我作为参数使用的所有文件吗?

    例如,如果我这样做:

    use My\Class\Path\Class as Class;
    use My\Class\Path\Class2 as Class2;
    

    将立即包含两个对象ClassClass2的定义的两个文件,或者仅当我稍后在代码中写入类似new Class()的内容时。

3 个答案:

答案 0 :(得分:1)

  
      
  1. 我可以创建一个单独的文件来定义所有use命令吗?
  2.   

你不能这样(docs):

  

注意:导入规则是基于每个文件的,意味着包含文件   不继承父文件的导入规则。

清除了你的怀疑:)

答案 1 :(得分:1)

要明确第二点,这是一个文件namespacetest.php的内容:

 namespace x {
    class a {}
 }
 namespace y {
    use x\a;
    class b extends a {}
 }
 namespace {//global namespace
    use y\b as a;
    new a();
 }

您可以知道将每个命名空间块放在一个单独的文件中,它的工作方式相同。

关于include的一些事情:

假设我们有一个文件inctest.php,其中包含<?php $var=123; ?>

如果我们以这种方式包含它:

function yxz(){
   include 'inctest.php';
}

我们在名为$var的函数中创建一个局部变量。

如果我们这样做

function xyz(){}
include 'inctest.php';

我们在php中创建了一个名为$var的全局变量。

在最低级include只需合并php脚本!如果脚本定义/声明类/函数,那么将只声明/定义。但是当包含的脚本是全局代码(不在函数中)时,它很大程度上取决于您包含它的位置,包含的代码/脚本将如何工作。 (见上面的例子)

答案 2 :(得分:0)

使用这种方式(下面的示例:)获取更多说明访问(http://php.net/manual/en/language.namespaces.faq.php#language.namespaces.faq.innamespace

<?php
namespace foo;
use blah\blah as foo;

$a = new name(); // instantiates "foo\name" class
foo::name(); // calls static method "name" in class "blah\blah"
?>