##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();
~~~