PHP5.3新功能名称空间规则解析和高级功能
这里我们介绍了PHP名称空间和命名空间关键字的用法。在本文中,我们将介绍使用命令的用法以及PHP如何解析名称空间名称。
为了比较起见,我定义了两个几乎相同的代码块,只有命名空间名称不同。
< PHP
应用程序库1
命名空间程序 lib1;
const myconst = 'app lib1 myconst;
函数myFunction(){
返回__function__;
}
类{
静态函数WhoAmI(){
返回__method__;
}
}
>
lib2.php
< PHP
应用程序库2
命名空间程序在图书馆编目;
const myconst = 'app myconst在图书馆编目;
函数myFunction(){
返回__function__;
}
类{
静态函数WhoAmI(){
返回__method__;
}
}
>
在开始之前,您必须了解几个与PHP名称空间相关的术语。
完全限定名(完全限定名)
任何PHP代码可以参考的完全限定名,这是一个标识符开头的命名空间的反斜杠,如程序 lib1 myconst,APP在图书馆编目 myFunction(),等等。
完全限定名是没有歧义的,反斜杠在开始作用的文件路径是相似的,这表示全球根的空间,如果我们实现了不同MyFunction全球空间中的(),你可以使用 MyFunction(在图书馆编目。PHP)从lib1.php或调用它。
完全限定名称对于一次性初始化函数调用或对象非常有用,但是当您在没有实际价值时产生大量的调用时,我们将在下面的讨论中看到,PHP提供了其他选项来减轻命名空间键入的困难。
限定名称(限定名称)
至少有一个为命名空间分隔标识符,如lib1 myFunction()。
不合格名称(不合格名称)
一个标识符没有命名空间的分隔符,如myFunction()。
在同一名称空间中工作
仔细考虑下面的代码:
myapp1.php
Even if we include lib1.php and lib2.php at the same time, MYCONST, MyFunction and MyClass identifiers can only be referenced in lib1.php, which is because myapp1.php's code is in the same AppLib1 namespace.
实施结果:
lib1程序 myconst
应用程序 lib1 MyFunction
应用程序 lib1 MyClass::whoami
命名空间导入
可以使用使用操作符导入名称空间,例如:
myapp2.php
< PHP
使用应用程序在图书馆编目;
require_once('lib1。php);
require_once('lib2。php);
头('content-type:文本/平原);
回声在图书馆编目 myconst。;
回声在图书馆编目 myFunction()。;
回声在图书馆编目 MyClass()::WhoAmI。;
>
你可以定义任意数量的使用报表,或使用逗号分成单独的命名空间,在这个例子中我们导入程序在图书馆编目的命名空间,但我们仍然不能直接引用myconst,MyFunction和MyClass,因为代码仍然在我们的全球空间,但如果我们将在图书馆编目前缀,他们成为一个合格的名字,PHP搜索将导入的命名空间,直到比赛。
实施结果:
在图书馆编目程序 myconst
在图书馆编目程序 MyFunction
在图书馆编目程序 MyClass::whoami
命名空间别名
命名空间别名可能是最有用的概念,而别名允许我们使用较短的名称来引用一个长名称空间。
myapp3.php
< PHP
使用应用程序 lib1 L;
使用应用程序 MyClass作为对象在图书馆编目;
头('content-type:文本/平原);
require_once('lib1。php);
require_once('lib2。php);
回声我 myconst。;
回声我 myFunction()。;
回声我 MyClass()::WhoAmI。;
回波目标::WhoAmI()。;
>
第一次使用语句定义了应用程序 lib1我任何我合格的名字会在编译时转换成应用程序 lib1,所以我们可以参考我 myconst我 MyFunction不是完全限定名称。
二使用语句定义obj为MyClass类APP 在图书馆编目命名空间别名。这种方法只适用于类,不能用于常量和函数。现在我们可以使用新的Obj()或运行静态方法和上面一样。
实施结果:
lib1程序 myconst
应用程序 lib1 MyFunction
应用程序 lib1 MyClass::whoami
在图书馆编目程序 MyClass::whoami
PHP命名解析规则
使用以下名称空间规则解析PHP标识符名称。有关详细信息,请参阅PHP用户手册:
1。在编译时调用完全限定函数、类或常量。
2。不合格名称和限定名称是根据导入规则进行翻译的,例如,如果导入了C C到C,调用C(e)将被翻译成一个;
3、在PHP命名空间中,所有的限定名称都没有按照导入规则进行转换。例如,如果您在名称空间A中调用C。
4、不受限制的类名根据当前导入规则进行转换,导入的短名称由全名替换。例如,如果C类被导入到名称空间中的x中,则新的x()将被转换为新的。
5、在名称空间中,在运行时解析非有限函数调用。例如,如果myFunction()是在命名空间 B调用PHP函数,首先寻找 MyFunction(B)。如果没有找到,那么它将寻找 myFunction()在全球空间。
6、调用不受限制或受限的类名在运行时解析。例如,如果我们在名称空间A中调用新的C(),PHP将寻找类C。
命名空间高级特性
让我们来看一下PHP名称空间的一些高级特性。
__namespace__常数
__namespace__是PHP字符串总是返回当前命名空间的名称,这是在全球空间空字符串。
这个值在调试中非常有用,它也可以动态生成一个完全限定类名,例如:
(whoami); / /输出::whoami >程序 lib1 MyClass:
namespace关键字
namespace关键字可以用来明确提到在当前命名空间或subnamespace项目,这相当于在类的自我空间:
(whoami); / /输出::whoami >程序 lib1 MyClass:
自动加载命名空间类
PHP 5中最省时省力的特性是自动加载的,在全局(非命名空间)PHP代码中,可以编写标准的自动加载功能:
在PHP 5.3中,您可以创建命名空间类的实例。在这种情况下,命名空间和类名传递给__autoload功能。例如,class_name美元价值可能是程序 lib1 myclass.you可以把所有的PHP类文件相同的文件夹下,从字符串中提取的命名空间,但会导致文件名冲突。
此外,您的类文件层次结构将根据命名空间的结构进行重组。例如,MyClass.php的文件可以创建在/类/应用/ lib1文件夹。
/ / /类APP lib1 / myclass.php
根文件夹中的文件使用以下代码:
myapp.php
(whoami); / /自动加载功能__autoload(合班)将命名空间完整的文件 / /路径$ { class= 'classes (str_replace。美元类。、/、.php);require_once(合班);} >
解释:
1个别名。APP lib1 MyClass类型为MC;
2。新的MC()转化为新的应用程序 lib1 MyClass()在编译时;
3。字符串的应用程序 lib1 MyClass传递到__autoload功能,在所有命名空间使用文件路径倾斜替换反斜杠,然后修改字符串,和类程序 lib1 myclass.php文件会自动加载。
总结
这里介绍了PHP名称空间的使用。我希望您对PHP名称空间有了新的了解,希望您能在新项目中真正使用名称空间。