首先看2个php文件,如下:
// 2.php
<?php
namespace two\t2;
function main(){
echo 'namespace:two\t2, function: main';
}
class T{
public function tmain(){
echo 'namespace two\t2, class:T, function: tmain';
}
}
# 1.php
<?php
namespace one;
require '2.php';
use two\t2 as t2;
function main(){
echo 'this namespace one main function';
}
echo t2\main();
echo main();
$t = new t2\T();
$t -> tmain();
php的namespace
和python的import
作用是一样的,目的都是把不同文件中的变量的、方法、类等区别开,否则很容易引起混乱。
python中的impor比较容易理解,php由于历史设计遗留导致namespace
在php5.3中才加入进来,所以写起来有些别扭(用反斜杠:\
区分)。
看刚才的两个文件:其中2.php
的namespace
是two\t2
,也就是说如果引用2.php
文件后,要想用其中的方法、变量、类等需要加上这个namespace
:two\t2
,namespace后命名的定义不区分大小写,习惯上是以驼峰命名规则,例如:
use GuzzleHttp\Client as RQ;
use QL\QueryList as PQ;
use think\Db as DB;
在示例文件1.php
中,想要用2.php
中的方法,需要加上这个namespace
,但是,由于2.php
中namespace
比较长(two\t2
),我们用as
关键字做一个别名t2
,相当于用t2
替代了two\t2
,这样每次写t2
就可以了,看1.php
中的echo t2\main()
,是用t2.php
文件中的main方法,这样就能和1.php
中的main
方法区分开了。同理使用2.php
中的类也是一样,加上as
后的别名就可以了。
和python对比一下:
在python中import abc as a
,接着就能用abc.py
中的东西了,例如:
a.get() #方法
a.name #变量
在php中需要先require 2.php
,然后use abc as a
,这里的abc
就是2.php
中的namespace
了,剩下的使用和python则大同小异,python是用.
区分,php则是用\
。
每个编程语言都会有不同的引用文件方法,对比python,php,golang,ruby,javascript,java,c#等会发现,python设计真的很简洁,甚至nodejs的namespace就是致敬(抄袭)的python。