我应该在 php 中的什么地方使用 'use'?
Where should I use 'use' in php?
我知道 php use
大部分时间都在使用(没有双关语意),以缩短命名空间 class 名称以供使用。我的问题如下:我有一个项目可能会使用大约 300-400 classes。所有这些 classes 都有命名空间,并放在它们各自的目录中,因此注册的自动加载可以在确实需要时包含它们,从而防止在不一定需要时加载一堆文件的开销.
现在我想用use
来缩短一些class的名字,这样我写代码可能会更快。我的问题如下:
我应该把 use
放在哪里来缩短这些东西?
是不是应该直接放在脚本文件里面定义需要缩短的classes?
我可以创建一个单独的文件来定义所有 use
命令吗?
我更喜欢第二个选项,我唯一不知道的是,如果我这样做,是否会 php 加载我作为参数提供的所有文件以供使用?
例如,如果我这样做:
use My\Class\Path\Class as Class;
use My\Class\Path\Class2 as Class2;
将立即包含两个对象 Class
和 Class2
的定义的两个文件,还是仅当我稍后在代码中编写类似 new Class()
的内容时才包含。
- Could I create a separate file where I define all of my
use
commands?
你不能拥有这个 (docs):
Note: Importing rules are per file basis, meaning included files will
NOT inherit the parent file's importing rules.
解开你的疑惑:)
为了说明第二点,这是一个文件的内容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 脚本!如果脚本 defines/declares classes/functions 将只有 declared/defined。但是当包含在脚本中的是全局代码(而不是在函数中)时,那么它在很大程度上取决于您包含它的位置,包含的 code/script 将如何工作。 (见上面的例子)
使用这种方式(以下示例:)以获取更多说明访问 (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"
?>
我知道 php use
大部分时间都在使用(没有双关语意),以缩短命名空间 class 名称以供使用。我的问题如下:我有一个项目可能会使用大约 300-400 classes。所有这些 classes 都有命名空间,并放在它们各自的目录中,因此注册的自动加载可以在确实需要时包含它们,从而防止在不一定需要时加载一堆文件的开销.
现在我想用use
来缩短一些class的名字,这样我写代码可能会更快。我的问题如下:
我应该把 use
放在哪里来缩短这些东西?
是不是应该直接放在脚本文件里面定义需要缩短的classes?
我可以创建一个单独的文件来定义所有
use
命令吗?
我更喜欢第二个选项,我唯一不知道的是,如果我这样做,是否会 php 加载我作为参数提供的所有文件以供使用?
例如,如果我这样做:
use My\Class\Path\Class as Class;
use My\Class\Path\Class2 as Class2;
将立即包含两个对象 Class
和 Class2
的定义的两个文件,还是仅当我稍后在代码中编写类似 new Class()
的内容时才包含。
- Could I create a separate file where I define all of my
use
commands?
你不能拥有这个 (docs):
Note: Importing rules are per file basis, meaning included files will NOT inherit the parent file's importing rules.
解开你的疑惑:)
为了说明第二点,这是一个文件的内容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 脚本!如果脚本 defines/declares classes/functions 将只有 declared/defined。但是当包含在脚本中的是全局代码(而不是在函数中)时,那么它在很大程度上取决于您包含它的位置,包含的 code/script 将如何工作。 (见上面的例子)
使用这种方式(以下示例:)以获取更多说明访问 (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"
?>