//提示命名空间之前,不能有任何的其他语句
//一般的命名空间结构,跟php文件结构是存在映射关系的,通过命名空间名称,就能算出该类的实际存储位置,然后实例化的时候,会触发用设置的spl自动加载函数将文件引入。
# 为什么php中要使用namespace?
假设如果不使用namespace,那么每个类在一个项目中的名字就必须是固定的。因为php在new的时候不管是调用autoload还是调用已加载过的类,都存在一个类名对应的文件。所以在没有namespace的时候,我们会想各种命名规则来区分不同的类,比如project1_school1_class1_Student或者project2_school_class_Student。
引入namespace之后就可以将这个有效规避了,一个namespace就相当于对应一个文件路径,查找这个类的时候,就会去对应的文件路径查找类定义文件了。
//对于一个命名空间,只有类、接口、函数和常量会被包含在命名空间中。
// 在3.2版本中基本上不需要使用import方法,除非你没有使用命名空间定义。
##不过使用中需要注意的是,你的自定义的命名空间名称需要和你的文件夹名称相对应,不能更改。
#例子
比如说我在Application/Home 中新建一个文件夹叫Lib
Application/Home/Lib 我在这里加了一个类 Images.class
然后我想在Application/Home/controller/IndexController.class.php 中调用
Application/Home/Lib/Images.class 这个类应该如何调用呢
/// /////要看你的Images类是否使用了命名空间,如果类是Home\Lib\Images
那么就使用
$o = new\Home\Lib\Images;
如果你在前面有使用
use Home\Lib\Images
那么可以直接使用
$o= new Images;
#命名空间的使用
首先请务必严格遵守一下规则: 1.类文件都是以.class.php为后缀 2.类的命名空间地址和所在的路径地址一致 3.类名和文件名一致 我就是因为没有遵守以上规则,报出了几多莫名其妙的错误。 namespace的引用分两种情况: 1.在同一个namespace下 ********* IndexController.class.php <?php namespace Home\Controller; use Think\Controller; class IndexController extends Controller { public function index() { $Test = new Test(); $Test->sayHello(); } } *********************** Test.class.php namespace Home\Controller; class Test { public function sayHello() { echo 'namespace say hello control'; } } 2.在不同namespace下 <?php namespace Home\Extend; class TestSecond { public function sayHello() { echo 'namespace say hello second'; } } ************************* IndexController.php <?php namespace Home\Controller; use Think\Controller; class IndexController extends Controller { public function index() { $Test = new \Home\Extend\TestSecond(); $Test->sayHello(); /************ 如果使用 use Home\Extend\TestSecond ; 调用的时使用$Test= new TestSecond (); ***********/ } } |
---|