php+namespace+autoload机制

namespace 主要作用,防止类名相同导致的加载问题。相当于 window下的 “域”

namespace 更像一个权限的功能,如果不在这个“域”里,即使require了文件,也无法new该类。

注意点:

  1、定义或声明namespace时,要放在第一行。

  2、调用函数或实例化对象是,默认调用命名空间内类的function或类文件。

  3、use就相当于一种声明,并不解析和加载。相当于 给即将要使用的namespace起别名,这样就不需要输入太长的 namespace了。

//下面是bar.php文件

<?php
namespace test;  //定义或声明一个 命名空间

class Bar
{
    public function dayin()
    {
        echo 'ffff';
    }
    
}

 

//下面是test.php文件

<?php
namespace test; //用法一  仍然需要 require 将bar.php引进。 
//相当于把当前文件,加入到test域中,这样域中文件就可以相互引用了,
require "bar.php";
$bar = new Bar();
$bar->dayin();


//用法二 ,类名带上命名空间地址
require "bar.php";
$bar = new \test\Bar();  //ok
$bar->dayin();

//用法三 ,use 引入.use主要作用是设置别名 use ** as * . 但省略as后面,相当于别名就为Bar
use test\Bar; //ok   // use test;  //不行 The use statement with non-compound name 'test' has no effect  compound复合、妥协
require "bar.php";
$bar = new Bar();  
$bar->dayin();

 

 

__autoload() 魔术方法:

  可以实现 “延迟加载”或者“用时加载”,即只有需要这个类时,才会加载进内存中,避免资源浪费。

 

当php引擎第一次使用类A,但是找不到时,会自动调用__autoload方法,并将类名“A”作 为参数传入。所以,我们需要的做的就是根据类名,找到对应的文件,并包含进来,如果我们的方法也找不到,那么php引擎就会报错。注意,这里可以只用 require,因为一旦包含进来后,php引擎再遇到类A时,将不会调用__autoload,而是直接使用内存中的类A,不会导致多次包含。

所以,使用__autoload的关键在于,如何根据类名,找到对应类定义的文件。

 

Yii框架下 设置默认自动加载函数

spl_autoload_register 注册myautoload函数为 __autoload()函数。

spl_autoload_register(array('YiiBase','myautoload'));

 

相关链接:

  http://blog.csdn.net/xxhsu/article/details/8463624   //讲namespace 和下面一个连接一起看

  http://www.cnblogs.com/yjf512/archive/2013/05/14/3077285.html  //讲namespace

  http://www.cnblogs.com/bourneli/archive/2012/09/08/2676965.html  //good 讲autoload

  http://blog.csdn.net/zhaozhi406/article/details/9325581 //Yii中autoload机制

  http://www.eeice.com/archive/design/spl_autoload_register.html  //Yii中autoload机制

posted @ 2015-04-02 17:58  zyliang  阅读(1032)  评论(0编辑  收藏  举报