##PHPSTART 命名空间
http://phpstart.xyz/group1/dog/talk
控制器部分代码:
~~~
class Dog{
public function __construct() {
}
function talk(){
$dog = C('Dog');
$dog->talk();
}
}
~~~
上面的控制器类名是 Dog,C('Dog')引入的文件也会定义一个 class Dog,这里就会造成class重定义错误。
解决类库与控制器类重命名冲突的办法有3个:
**一、在 xxx.class.php 文件第一行加上默认空间名字__Class**
<font color=red>请注意大小写,这里是2个下划线,理解成文件夹名就比较容易记住</font>
~~~
namespace __Class;
class xxx{
}
~~~
<font color=red>非全局空间使用全局空间的类,请带上完全限定空间名
全局空间的写缓存是:PS:putCache()
非全局空间的写缓存是:\PS:putCache()
(全局变量和函数不需要加限定空间名)</font>
**二、在 xxx.class.php 的类名加上 _class 后缀**
<font color=red>请注意大小写,这里是1个下划线,理解成文件后缀名就比较容易记住</font>
~~~
class xxx_class{
}
~~~
上面2个方法不改变类的加载规则
~~~
C('xxx');
~~~
系统会自动优先实例化名字空间的类 > 再实例化后缀形式的类 > 再实例化全局空间的类
**三、第3种方法与第1种方法一样,但可以自定义空间名字,加载的时候需要带上空间名字**
类的定义:
~~~
namespace animals;
class bird{
}
~~~
类的加载
~~~
C('animals/xxx');
~~~
* * * * *
模型与控制器的名字重复冲突也是很容易遇到的,解决冲突方法与类库的方法相似,只是默认空间名字和后缀不一样。
模型的空间名字
~~~
namespace __Model;
class xxx{
...
}
~~~
模型的后缀
~~~
class xxx_mod{
...
}
~~~
* * * * *
**控制器也可以使用命名空间**
控制器空间名字规则:使用控制器的目录(相对与程序目录)
例子:
http://phpstart.xyz/test/group2/index/dog
http://phpstart.xyz/group2/index/dog
对应文件:/test/<font color=red>group2</font>/index.php
空间名字:<font color=red>group2</font>
例子2:
http://phpstart.xyz/test/group2/class1/index/dog
http://phpstart.xyz/group2/class1/index/dog
对应文件:/test/<font color=red>group2/class1</font>/index.php
空间名字:<font color=red>group2\class1</font>
<font color=red>名字空间使用全局变量和函数是没有书写要求的,但是名字空间内不会自动搜索全局空间的类,所以要使用全局空间的类,需要带上完全限定名</font>
~~~
\PS::putCache();
~~~