PHP中名称空间的详细描述
名称空间支持PHP的经历了一个艰难的旅程。幸运的是,PHP介绍从PHP代码5.3.the应用结构命名空间已经从PHP命名空间的引入大大提高。许多编程语言有命名空间很久以前的概念,和PHP支持的命名空间是晚一点相对于其他语言。无论如何,每一个新功能的推出都有它自己的目的。与其他语言一样,PHP主要引入名称空间来解决名称冲突的问题。
名称空间(名称空间)的概念
复制代码代码如下所示:
当在字符串中使用名称空间的名称时,不要忘记逃跑。
你可以把这个名字想象成一个抽屉,你可以放在抽屉里,铅笔,尺子,A4纸,这些都是你自己的私人物品,你的抽屉下面有某人的抽屉,其他人可以把同样的东西放在抽屉里,为了不带错东西,你决定给自己的抽屉贴上标签,这样你就可以清楚地看到它属于谁了。
以前,开发人员必须向类、函数和常量添加下划线,使自己的代码独立于代码库。这就相当于把标签放在自己的东西上,放在更大的抽屉里。虽然这也是组织代码的一种方式,但这种方式效率很低。
名称空间的到来是为了解决这个问题。我们可以在不同名称空间中声明相同的函数、类和常量,而不会引起名称冲突。
正在使用名称空间。
需要注意的一点是,我们间接使用名称空间。因为PHP 5.3,非用户定义的命名空间中的所有声明(类、函数、常量)都属于全局名称空间。
全局命名空间包含所有PHP内部定义,如回声(),(),和mysqli_connect异常类。由于全局命名空间没有独立身份的名字,它经常被用来作为一个全球性的空间(空间)。
定义命名空间
名称空间的定义必须是PHP文件的第一条语句。在定义名称空间之前允许您使用名称空间的唯一语句是声明语句。
定义名称空间很简单,只使用关键字名称空间,名称空间名称需要遵循PHP文件中其他标识符的命名规则。
下面是定义名称空间的一个示例:
复制代码代码如下所示:
Namespace MyNamespace {
类测试{
}
}
如果要定义属于全局空间的一段代码,则使用名称空间关键字,但名称空间的名称后面没有后面的关键字:
复制代码代码如下所示:
命名空间{
类测试{
}
}
我们甚至可以在一个文件中定义多个名称空间,如下所示:
复制代码代码如下所示:
< PHP
Namespace MyNamespace {
}
Namespace MySecondNamespace {
}
命名空间{
}
我们也可以在不同的文件中扩展一个名称空间,并且文件包含的文件将自动合并它们。因此,限制大量的名称空间在同一个文件中定义是一个很好的编程实践,就像我们通常为每个类单独定义一个单独的文件一样。
复制代码代码如下所示:
需要注意的是,包含名称空间代码块的{是可选的,可以使用或不使用。事实上,只要我们坚持在文件中只命名一个名称空间,就可以省略{这一点,这也使我们的代码看起来更简洁。
subnamespace
命名空间可以遵循特定的水平,正如我们在我们的计算机上的文件系统目录。空间的主要项目是特别有用的。例如,你的项目需要访问数据库。您可能希望将所有数据库相关的代码,比如数据库异常处理,放在同一个子目录中。
为了保持灵活性,把空间的子目录是非常明智的。这会让你的代码结构更清晰,并使它自动跟随psr-0标准更容易。
PHP使用反斜杠作为分隔符的命名空间,有趣的是,PHP甚至考虑使用一个笑脸:)作为一个命名空间分离器。
subnamespace定义实例:
复制代码代码如下所示:
< PHP
命名空间如何数据库
类连接{
}
您可以使用许多空间的可能:
复制代码代码如下所示:
< PHP
命名空间如何博客认证处理社会;
类推特{
}
需要注意的一点是,PHP不支持命名空间的嵌套定义。下面的代码将导致一个致命错误:名称空间声明不能嵌套。
复制代码代码如下所示:
< PHP
命名空间如何{
命名空间数据库{
类连接{ }
}
}
从命名空间调用代码
如果你要实例化一个类,调用一个函数,或在不同的命名空间的不断使用,你需要使用一个反斜杠。他们可以从三个角度解析:
1。无限定名
2。定义的名字
三.fully qualified names
不合格名称(不合格名称)
这是类的名称、函数或常量,但它不包含任何命名的引用。如果名称空间对您还不熟悉,那么这就是您熟悉的角度。
复制代码代码如下所示:
< PHP
Namespace MyProject;
类{
静态函数static_method()
{
echo'hello,世界!;
}
}
立志 / /不合格的名字,你现在在命名空间(如何 MyClass)
MyClass:static_method();
已定义的名称(限定名称)
这是我们如何使用空间的例子如下:
复制代码代码如下所示:
< PHP
Namespace MyProject;
require'myproject / / PHP的数据库连接;
实例化一个 / /合格的名字,从如何子命名空间的类
连接=新数据库连接();
完全限定名(完全限定名)
名称和不合格的早期使用的是相对于当前的命名空间。上述两种方式只能用于访问当前命名空间和更深的subnamespace。
如果你想访问一个层次,高于此前的命名空间,你需要使用一个完全合格的名称-一个绝对路径而不是相对路径。这可以归因于在命名空间前反斜杠。使用完全定义的名字可以让PHP知道这电话开始从全球的空间而不是命名空间是目前在地方,例子如下:
复制代码代码如下所示:
< PHP
命名空间如何数据库;
require'myproject / /输入PHP文件访问;
访问如何知道输入 / /努力
这一次它将因为/我们使用完全限定名,注意第一个反斜杠
$输入=新 如何知道输入();
对于PHP的内部函数,我们不需要使用完全限定的名称。在当前的命名空间中,PHP将通过调用不存在不合格名称的类或函数来搜索全局空间。
考虑到这个规则,我们可以重写PHP的内部函数如下:
复制代码代码如下所示:
< PHP
Namespace MyProject;
var_dump($查询); / /超载
var_dump($查询); / /内部
我们希望访问全局异常类。
以下将不会工作,因为MyProject 数据库命名空间和类名称不合格/不类称为例外,没有退路的全局空间
抛出异常('query /失败!);
我们使用一个 / /相反,单一的反斜杠表示我们想解决从全球的空间
把新例外('ailed!);
功能var_dump(){
echo'overloaded全球var_dump()!
}
动态调用
PHP是一种动态的语言,与此功能的PHP也可以用来调用命名空间。这基本上是相同的实例化一个变量类,包含变量的文件。在字符串中,命名空间分隔符()使用的PHP也是一个元字符,所以它必须逃跑。
复制代码代码如下所示:
< PHP
命名空间中的其他项目;
project_name美元= 'myproject;
package_name美元= 'database;
class_name美元=连接;
变量文件
需要strtolower($ project_name。package_name美元。' / '。美元。class_name PHP);
变量名称空间中变量类的名称。请注意如何正确使用反斜杠转义
fully_qualified_name = project_name美元美元。package_name美元。class_name美元。;
连接=新fully_qualified_name美元(美元);
namespace关键字
关键字名称空间不仅可以用来定义名称空间,还可以用来显示当前的名称空间,此时它与类中的自关键字相当。
复制代码代码如下所示:
< PHP
Namespace MyProject;
函数运行()
{
echo'running命名空间中!;
}
要如何运行 / /解决
(运行);
解决如何运行 / /明确
命名空间();
__namespace__常数
正如自关键词不能代表当前类的名称、命名空间的关键字不能用来表示当前的命名空间的名称,__namespace__关键字是用来解决这个问题。
复制代码代码如下所示:
< PHP
命名空间如何数据库;
/ / 'myproject 数据库
回声__namespace__;
此关键字非常有用,用于判断当前代码是否以名称空间开头,也可以用于调试代码。
进口或别名
在PHP中,命名空间也支持进口,而进口也被称为别名,类,接口,和命名空间可以进口(别明)。进口是一个非常有用的命名空间中的函数和基本。它允许我们使用外部代码包不用担心名称冲突的使用。关键词的使用可以实现导入功能,您还可以使用关键字在进口时指定一个别名。
复制代码代码如下所示:
使用{姓名}为类、接口或命名空间optional_custom_alias } {
一个完全合格的名称可以通过无限制的别名所取代,因此我们不需要使用完全限定名,当我们每次使用以达到简化代码的目的。进口应该在命名空间级别最高的或全球的空间,并在功能范围的导入功能使用一个非法的语法。
复制代码代码如下所示:
< PHP
命名空间中的其他项目;
这是如何数据库命名空间 /连接类中
require'myproject / / PHP的数据库连接;
如果我们想要访问如何 /数据库连接,必须使用完全限定名为我们在一个不同的名称空间
为连接=新 如何数据库连接();
连接类导入(它与接口的工作方式完全相同)
如何使用 连接数据库;
这也起作用了!在连接类别名的PHP不会发现其他项目连接类
连接=新连接();
该如何数据库 / /导入命名空间
如何使用数据库;
连接=新数据库连接()
我们可以通过使用别名简化上述代码:
复制代码代码如下所示:
< PHP
命名空间中的其他项目;
require'myproject / / PHP的数据库连接;
如何使用 myconnection数据库连接;
连接=新myconnection(美元);
如何使用数据库的名称;
连接名称美元新的连接();
总结
名称空间用于避免定义冲突,并为代码引入更灵活和有组织的方式。要注意的一点是,我们不必使用名称空间;它是面向对象的工作方式。但是,如果使用名称空间,我们的代码可能会达到一个新的水平,而媒体看起来会更高。