国外免费PHP云空间(免费国内php空间)

PHP 5.3中增加了PHP 空的命名空间。如果你学过C#和Java,那么命名空并不是什么新鲜事。但是,在PHP中意义重大。

国外免费PHP云空间(免费国内php空间)

PHP命名空可以解决以下两种问题:

用户写的代码和PHP内部的类/函数/常量或者第三方的类/函数/常量之间的名称冲突。

为很长的标识符名称创建别名(或简称)(通常定义为缓解第一类问题),以提高源代码的可读性。

在空之间定义

默认情况下,所有的常量、类和函数名都放在global 空 room中,就像之前PHP支持的naming 空 room一样。

名称空由关键字namespace声明。如果文件包含named 空,它必须在所有其他代码之前声明named 空。语法如下:

& lt?Php还可以在同一个文件中定义不同的命名空代码,比如:

& lt?在声明naming 空之前,php唯一合法的代码是用于定义源文件编码方法的declare语句。所有非PHP代码,包括空白字符,都不能出现在names 空之间的声明之前。

& lt?以下php代码中会出现语法错误:

& lthtml & gt& lt?phpnamespace MyProject//将“< html&gt会致命——名字空一定是程序脚本的第一条语句?& gt命名于空之间

类似于目录和文件之间的关系,PHP naming 空也允许您指定分层命名空名称。因此,naming 空之间的名称可以用分层的方式定义:

& lt?PHP namespace my project \ Sub \ Level;//在层次单名之间声明const CONNECT _ OK = 1空;类别连接{ /*…*/}函数Connect() { /*…*/ }?& gt上面的示例创建了常量MyProject\Sub\Level\CONNECT_OK、类MyProject\Sub\Level\Connection和函数MyProject\Sub\Level\CONNECT。

在命名空之间使用

PHP naming 空中的类名有三种引用方式:

非限定名,或者没有前缀的类名,比如$ a = new foo();或者foo::static method();。如果当前名称空是currentnamespace,则foo将被解析为currentnamespace\foo。如果使用foo的代码是全局的,并且不包含在任何命名的空 room中,那么foo将被解析为foo。警告:如果naming 空中的函数或常量未定义,非限定的函数名或常量名将被解析为全局函数名或常量名。

限定名或包含前缀的名称,如$ a = new subnamespace \ foo();或者subnamespace \ foo::static method();。如果当前名称空是currentnamespace,则foo将被解析为current namespace \ subnamespace \ foo。如果使用foo的代码是全局的,并且不包含在任何命名的空房间中,那么foo将被解析为subnamespace\foo。

完全限定名或包含全局前缀运算符的名称,例如$ a = new \ current namespace \ foo();或\ current namespace \ foo::static method();。在这种情况下,foo在代码中总是被解析为文字名称currentnamespace \ foo。

这里有一个使用这三种方法的例子:

File1.php文件代码

& lt?phpnamespace Foo \ Bar \ subnamespace;const FOO = 1;函数foo () {} classfoo {file2.php文件代码

& lt?phpnamespace Foo \ Bar包含“file 1 . PHP”;const FOO = 2;Function foo() {}class foo{注意,您可以使用完全限定名访问任何全局类、函数或常量,例如\strlen()或\Exception或\INI_ALL。

named 空之间对全局类、函数和常数的内部访问:

& lt?phpnamespace Foo函数strlen(){ } const INI _ ALL = 3;类异常{ } $ a = \ strlen(‘ hi ‘);//调用全局函数strlen $ b = \ INI _ ALL//访问全局常量INI _ ALL $ c = new \ Exception(‘ error ‘);//实例化全局类异常?& gt命名空和动态语言特性

PHP命名空的实现受其语言本身的动态特性影响。因此,如果您想将下面的代码转换成命名的空房间,请动态访问这些元素。

Example1.php文件代码:

& lt?PHP ClassName {必须使用完全限定名(包括命名空之间带有前缀的类名)。注意,在动态类名、函数名或常量名中,限定名和完全限定名没有区别,所以前面的反斜杠是不必要的。

动态访问命名空之间的元素

& lt?phpnamespace namespacenameClass classname{namespace关键字和__NAMESPACE__常量

PHP支持两种抽象方法来访问当前name 空中的内部元素,__NAMESPACE__ magic constant和NAMESPACE关键字。

常量__NAMESPACE__的值是包含当前名称空之间的名称的字符串。不包含在任何命名的空中的全局代码包含空字符串。

__NAMESPACE__示例,naming 空中的代码

& lt?phpnamespace MyProject回显““”、__命名空间_ _、“”;//输出“MyProject”?& gt__NAMESPACE__示例,全局代码

& lt?常量php __NAMESPACE__在动态创建名称时非常有用,例如:

使用__NAMESPACE__动态创建名称。

& lt?phpnamespace MyProjectget($ class name){关键字namespace可用于显式访问当前名称空或子名称空中的元素。它相当于类中的self运算符。

命名空间运算符,命名空中的代码

& lt?phpnamespace MyProject把布拉\布拉当成我的;//参见“使用名称空间:导入/别名”blah \ mine();//调用函数blah\blah\mine()命名空间\ blah \ mine();//调用函数my project \ blah \ mine()namespace \ func();//调用函数my project \ func()namespace \ sub \ func();//调用函数my project \ sub \ func()namespace \ cname::method();//调用my project \ cname $ a = new namespace \ sub \ cname()类的静态方法“method”;//实例化my project \ sub \ cname $ b = namespace \ CONSTANT类的对象;//将常量MyProject\CONSTANT的值赋给$b?& gt命名空间运算符,全局代码

& lt?phpnamespace \ func();//调用函数func()namespace \ sub \ func();//调用函数sub \ func()namespace \ cname::method();//调用类cname$a = new namespace\sub\cname()的静态方法“method”;//实例化sub\cname$b = namespace\CONSTANT类的对象;//将常量constant的值赋给$b?& gtName 空:别名/导入

PHP命名空中使用别名或导入有两种方式:对类名使用别名或对命名空名使用别名。注意PHP不支持导入函数或常量。

在PHP中,别名是通过操作符来实现的。以下是使用所有三种可能的导入方法的示例:

1.使用use运算符导入/使用别名。

& lt?phpnamespace foo使用我的全名作为另一个名称;//下面的示例与use My \ Full \ ns name as ns name use My \ Full \ ns name相同;//使用\ArrayObject导入全局类;$obj =新命名空间\另一个;//实例化foo\Another对象$ obj = new Another//实例化My\Full\Classname对象ns name \ subns \ func();//调用函数my \ full \ ns name \ sub ns \ func $ a = newarrayobject(array(1));//实例化ArrayObject对象//如果不使用\ArrayObject,实例化一个foo\ArrayObject对象?& gt2.一行包含多个use语句。

& lt?phpuse My \ Full \ class name as Another,My \ Full \ NSname$ obj = new Another//实例化My\Full\Classname对象ns name \ subns \ func();//调用函数My\Full\NSname\subns\func?& gt导入是在编译时执行的,但动态类名、函数名或常量名不是。

3.导入和动态名称

& lt?phpuse My \ Full \ class name as Another,My \ Full \ NSname$ obj = new Another//实例化一个My\Full\Classname对象$ a = ‘ Another$ obj = new $ a;//物化另一个对象?& gt另外,导入操作只影响非限定名和限定名。完全限定名是确定性的,因此不受导入的影响。

4.导入和完全限定的名称

& lt?phpuse My \ Full \ class name as Another,My \ Full \ NSname$ obj = new Another//实例化My \ Full \ class name $ obj = new \ Another类的对象;//实例化类Another $ obj = new Another \ thing的对象;//实例化My \ Full \ class name \ thing $ obj = new \ other \ thing类的对象;//实例化类other\thing的对象?& gtName 空: backup全局函数/常量

在一个命名室空中,当PHP遇到不合格的类、函数或常量名时,会使用不同的优先级策略来解析名称。类总是解析为当前命名空中的名称。因此,当访问系统内部的类名或不包括在命名空间空中的类名时,必须使用完全限定名,例如:

1.访问命名空间空中的全局类

& lt?phpnamespace A \ B \ C;类异常扩展\Exception {}$a =新异常(‘ hi ‘);// $a是类A \ B \ C \ Exception $ B = new \ Exception(‘ hi ‘)的对象;// $b是类异常$c = new ArrayObject的对象;//致命错误,找不到\B\C\ArrayObject类?& gt对于函数和常数,如果函数或常数在当前命名的空房间中不存在,PHP将使用全局空房间中的函数或常数。

2.将备份全局函数/常量命名为空

& lt?phpnamespace A \ B \ C;const E _ ERROR = 45函数strlen($str){ global 空

如果没有定义命名空,那么所有的类和函数都是在global 空中定义的,就像PHP引入命名空概念之前一样。名称前面的前缀\表示该名称在全局空文件室中,即使该名称在其他命名的空文件室中。

使用global 空描述。

& lt?phpnamespace A \ B \ C;/*此函数是A \ B \ C \ fopen */function fopen(){ naming空之间的顺序

自从命名空室以来,最容易出错的就是在使用一个类的时候,这个类的搜索路径是什么。

& lt?phpnamespace A;用B\D,C\E作为F;//函数调用foo();//首先尝试在names 空之间调用“a”中定义的函数foo()。名称解析遵循以下规则:

对完全限定的函数、类和常数的调用在编译时被解析。例如,new \A\B解析为A\B类。

的所有非限定名和限定名(非完全限定名)在编译时根据当前的导入规则进行转换。例如,如果命名空中的A\B\C作为C导入,那么对C\D\e()的调用将转换为A\B\C\D\e()。

在naming 空房间内,所有未根据导入规则转换的限定名称前面都将加上当前的naming 空房间名称。例如,如果在naming 空之间的A\B内部调用C\D\e(),那么C\D\e()将被转换为A\B\C\D\e()。

非限定类名在编译时根据当前的导入规则进行转换(短导入名被全名替换)。例如,如果named 空之间的\B\C作为C导入,则new C()转换为new A\B\C()。

在name 空(例如A\B)中,对非限定名称的函数调用在运行时被解析。例如,对函数foo()的调用解析如下:

在当前命名的空中查找名为A\B\foo()的函数

尝试在global空中找到并调用函数foo()。

对naming 空(例如,A\B)内的非限定名或限定名类(不完全限定名)的调用在运行时被解析。下面是调用new C()和new D\E()的解析过程:解析new C():解析new D\E():为了引用全局命名空中的全局类,必须使用全限定名new \C()。

在类名前面加上当前名称空成为:A\B\D\E,然后找到该类。

尝试自动加载类A\B\D\E。

在当前命名空间空中查找A\B\C类。

尝试自动加载A类。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

作者:美站资讯,如若转载,请注明出处:https://www.meizw.com/n/266910.html

发表回复

登录后才能评论