Home  >  Article  >  Backend Development  >  Complete mastery of php namespaces

Complete mastery of php namespaces

小云云
小云云Original
2018-03-06 13:38:181385browse

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 encoding declare statement. 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.

Define sub-namespaces

Defining multiple namespaces in the same file

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.

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.

Classes can be referenced in three ways:

  1. An unqualified name, or a class name without a prefix, such as $a=new foo(); or foo::staticmethod();. If the current namespace is currentnamespace, foo will be resolved to currentnamespace\foo. If the code using foo is global and does not contain code in any namespace, foo will be resolved as foo. 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.

  2. Qualified name, or name including a prefix, such as $a = new subnamespace\foo(); or subnamespace\foo:: staticmethod();. If the current namespace is currentnamespace, then foo will be resolved to currentnamespace\subnamespace\foo. If the code using foo is global and does not contain code in any namespace, foo will be resolved as subnamespace\foo.

  3. 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 name currentnamespace\foo in the code.

Note that to access any global class, function or constant, you can use a fully qualified name, such as \strlen() or \Exception or \INI_ALL.

Note: The relative path of the file contained in the child file contained by the parent file is for the parent file directory, not the child file directory.

PHP supports two abstract methods of accessing elements within the current namespace, __NAMESPACE__magic constants and namespace keywords.

__NAMESPACE__ can represent a string, and the others are the same as namesapce.

Use the use operator to import/use aliases

Import/use aliases through the use operator, one line contains multiple use statements

Imports and dynamic names

The import operation is performed during compilation, but the dynamic class name, function name or constant name is not.

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.

Use global space description

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.

Name resolution follows the following rules:

  1. 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.

  2. 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().

  3. 在命名空间内部,所有的没有根据导入规则转换的限定名称均会在其前面加上当前的命名空间名称。例如,在命名空间 A\B 内部调用 C\D\e(),则 C\D\e() 会被转换为 A\B\C\D\e() 。

  4. 非限定类名根据当前的导入规则在编译时转换(用全名代替短的导入名称)。例如,如果命名空间 A\B\C 导入为C,则 new C() 被转换为 new A\B\C() 。

  5. 在命名空间内部(例如A\B),对非限定名称的函数调用是在运行时解析的。例如对函数 foo() 的调用是这样解析的:

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

    2. 尝试查找并调用 全局(global) 空间中的函数 foo()。

  6. 在命名空间(例如A\B)内部对非限定名称或限定名称类(非完全限定名称)的调用是在运行时解析的。下面是调用 new C() 及 new D\E() 的解析过程: new C()的解析:

    new D\E()的解析:

    为了引用全局命名空间中的全局类,必须使用完全限定名称 new \C()。

    1. 在类名称前面加上当前命名空间名称变成:A\B\D\E,然后查找该类。

    2. 尝试自动装载类 A\B\D\E。

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

    4. 尝试自动装载类A\B\C。

相关推荐:

PHP命名空间详细使用方法

PHP命名空间、性状与生成器详解

实例详解PHP命名空间用法

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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn