Namespace is used to resolve name conflicts between user-written code and PHP internal classes/functions/constants or third-party classes/functions/constants. Create an alias (or short) name for a very long identifier name to improve source code readability.
Although any legal PHP code can be included in a namespace, only the following types of code are affected by the namespace: classes (including abstract classes and traits), interfaces, functions, and constants.
If a file contains a namespace, it must declare the namespace before all other code except one:declareKeyword, used to define the source file encodingdeclarestatement. Code, including whitespace, cannot appear before a namespace declaration.
Different from other PHP language features, the same namespace can be defined in multiple files, which allows the contents of the same namespace to be divided and stored in different files.
Copy after login
Copy after login
It is not recommended to use this syntax to define multiple namespaces in a single file. It is recommended to use the following curly bracket form of syntax.
Copy after login
In actual programming practice, it is highly discouraged to define multiple namespaces in the same file. This method is mainly used to combine multiple PHP scripts in the same file.
To combine the code in the global non-namespace with the code in the namespace, you can only use the syntax in the form of braces. Global code must be enclosed in curly braces with an unnamed namespace statement.
An unqualified name, or a class name without a prefix, such as$a=new foo();orfoo::staticmethod();. If the current namespace iscurrentnamespace, foo will be resolved tocurrentnamespace\foo. If the code using foo is global and does not contain code in any namespace, foo will be resolved asfoo. Warning:If a function or constant in the namespace is undefined, the unqualified function name or constant name will be resolved to a global function name or constant name.
Qualified name, or name including a prefix, such as$a = new subnamespace\foo();orsubnamespace\foo:: staticmethod();. If the current namespace iscurrentnamespace, then foo will be resolved tocurrentnamespace\subnamespace\foo. If the code using foo is global and does not contain code in any namespace, foo will be resolved assubnamespace\foo.
Fully qualified name, or a name that includes a global prefix operator, for example,$a = new \currentnamespace\foo();or\ currentnamespace\foo::staticmethod();. In this case, foo is always resolved to the literal namecurrentnamespace\fooin the code.
Note that to access any global class, function or constant, you can use a fully qualified name, such as\strlen()or\Exceptionor\INI_ALL.
PHP supports two abstract methods of accessing elements within the current namespace,__NAMESPACE__
magic constants andnamespacekeywords.
__NAMESPACE__
can represent a string, and the others are the same as namesapce.
Use the use operator to import/use aliases
Copy after login
Import/use aliases through the use operator, one line contains multiple use statements
Copy after login
Imports and dynamic names
The import operation is performed during compilation, but the dynamic class name, function name or constant name is not.
Copy after login
Importing and fully qualified names
Import operations only affect unqualified and qualified names. Fully qualified names are not affected by imports because they are deterministic.
Copy after login
Copy after login
In a namespace, when PHP encounters an unqualified class, function, or constant name, it uses a different priority strategy to resolve the name . Class names always resolve to names in the current namespace. Therefore when accessing a class name that is internal to the system or not contained in a namespace, you must use the fully qualified name. For functions and constants, if the function or constant does not exist in the current namespace, PHP will fall back to using the function or constant in the global space.
Copy after login
Copy after login
Calls to functions, classes, and constants with fully qualified names are resolved at compile time. For example new \A\B resolves to class A\B.
All unqualified names and qualified names (non-fully qualified names) are converted at compile time according to the current import rules. For example, if namespace A\B\C is imported as C, then calls to C\D\e() are translated to A\B\C\D\e().
在命名空间内部,所有的没有根据导入规则转换的限定名称均会在其前面加上当前的命名空间名称。例如,在命名空间 A\B 内部调用 C\D\e(),则 C\D\e() 会被转换为 A\B\C\D\e() 。
非限定类名根据当前的导入规则在编译时转换(用全名代替短的导入名称)。例如,如果命名空间 A\B\C 导入为C,则 new C() 被转换为 new A\B\C() 。
在命名空间内部(例如A\B),对非限定名称的函数调用是在运行时解析的。例如对函数 foo() 的调用是这样解析的:
在当前命名空间中查找名为 A\B\foo() 的函数
尝试查找并调用 全局(global) 空间中的函数 foo()。
在命名空间(例如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\B\C。
相关推荐:
The above is the detailed content of Complete mastery of php namespaces. For more information, please follow other related articles on the PHP Chinese website!