Heim > Backend-Entwicklung > PHP-Tutorial > PHP命名空间

PHP命名空间

WBOY
Freigeben: 2016-06-06 20:43:40
Original
895 Leute haben es durchsucht

假设有function.php文件:

<code class="lang-php"> function  one(){
       echo '1111111111111111<br>';
   }
</code>
Nach dem Login kopieren
Nach dem Login kopieren

然后有index.php

<code class="lang-php">namespace Mynamesapce;
   include'function.php';

one();
\one();
\Mynamesapce\one();
</code>
Nach dem Login kopieren
Nach dem Login kopieren

会发现输出
1111111111111111
1111111111111111

Fatal error: Call to undefined function Mynamesapce\one() in C:\xampp\htdocs\phpstrom\0823\index.php on line 15
首先,one()与\one()是等效的
但是调用\Mynamesapce\one();出现错误就说明include的文件不属于当前的命名空间,而是直接属于全局命名空间。
按理说include的作用与把代码直接放在这里应该是一样的吧(直接展开),但是怎么会不属于当前的命名空间呢?
也就说等价于这个写法

<code class="lang-php">namespace Mynamesapce;

function  one(){


    echo '1111111111111111<br>';
}
\Mynamesapce\one();
</code>
Nach dem Login kopieren
Nach dem Login kopieren

别说转牛角尖,我只是奇怪而已,,
one();方法相当于相对路径,当前的命名空间没有,就会到父空间去寻找,而指定了命名空间的就相当于绝对路径,只在绝对路径下寻找。

这种“相对寻找”的方式,只针对函数,而不针对类和变量。

<code class="lang-php">namespace Mynamesapce;

include 'function.php';

function  one(){


    echo 'AAAAAAAAAAAAA<br>';
}
one();
</code>
Nach dem Login kopieren
Nach dem Login kopieren

输出的是AAAAAAAAAAAAA

回复内容:

假设有function.php文件:

<code class="lang-php"> function  one(){
       echo '1111111111111111<br>';
   }
</code>
Nach dem Login kopieren
Nach dem Login kopieren

然后有index.php

<code class="lang-php">namespace Mynamesapce;
   include'function.php';

one();
\one();
\Mynamesapce\one();
</code>
Nach dem Login kopieren
Nach dem Login kopieren

会发现输出
1111111111111111
1111111111111111

Fatal error: Call to undefined function Mynamesapce\one() in C:\xampp\htdocs\phpstrom\0823\index.php on line 15
首先,one()与\one()是等效的
但是调用\Mynamesapce\one();出现错误就说明include的文件不属于当前的命名空间,而是直接属于全局命名空间。
按理说include的作用与把代码直接放在这里应该是一样的吧(直接展开),但是怎么会不属于当前的命名空间呢?
也就说等价于这个写法

<code class="lang-php">namespace Mynamesapce;

function  one(){


    echo '1111111111111111<br>';
}
\Mynamesapce\one();
</code>
Nach dem Login kopieren
Nach dem Login kopieren

别说转牛角尖,我只是奇怪而已,,
one();方法相当于相对路径,当前的命名空间没有,就会到父空间去寻找,而指定了命名空间的就相当于绝对路径,只在绝对路径下寻找。

这种“相对寻找”的方式,只针对函数,而不针对类和变量。

<code class="lang-php">namespace Mynamesapce;

include 'function.php';

function  one(){


    echo 'AAAAAAAAAAAAA<br>';
}
one();
</code>
Nach dem Login kopieren
Nach dem Login kopieren

输出的是AAAAAAAAAAAAA

首先include并不像你说的那样原地展开,你include的function.php里没有指定命名空间,即它的命名空间是全局空间,这就能解释你的疑问了

另外看php关于命名空间名称解析规则的第5点,找函数才会去全局空间找,找类不会

在命名空间内部(例如A\B),对非限定名称的函数调用是在运行时解析的。例如对函数 foo() 的调用是这样解析的:
1. 在当前命名空间中查找名为 A\B\foo() 的函数
2. 尝试查找并调用 全局(global) 空间中的函数 foo()。

所以调用one()时,会先在当前命名空间查找Mynamesapce\one(),找不到则找全局的one(),等价于\one(),因为当前命名空间并没有Mynamesapce\one()函数

Verwandte Etiketten:
php
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage