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机制
2、解构技能,找出实现80%效果的那20%
3、不要一心二用
4、练习练习再练习!然后获得即时反馈
5、坚持,不要在低谷期放弃