<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://www.jackxiang.com/post/5877/</link>
<title><![CDATA[[框架精髓]PSR-0 Autoloading Standard 自动加载机制的规范，及接合kohana的自动加载逻辑分析。]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[Php/Js/Shell/Go]]></category>
<pubDate>Tue, 25 Dec 2012 06:43:52 +0000</pubDate> 
<guid>http://www.jackxiang.com/post/5877/</guid> 
<description>
<![CDATA[ 
	背景：关于自动加载类文件是PHP这种脚本在程序大后为了按需要加载时所需要的一种机制，很有必要。<br/>将__autoload换成loadprint函数。但是loadprint不会像__autoload自动触发，这时spl_autoload_register()就起作用了，它告诉PHP碰到没有定义的类就执行loadprint()。 <br/>以上一行摘自：http://blog.csdn.net/panpan639944806/article/details/23192267<br/><br/>/tmp/autoload/autoload.php<br/><textarea name="code" class="php" rows="15" cols="100">
&lt;?php
&nbsp;&nbsp;&nbsp;&nbsp;define(&#039;EOL&#039;, (PHP_SAPI == &#039;cli&#039;) ? PHP_EOL : &#039;&lt;/ br&gt;&#039;);
&nbsp;&nbsp;&nbsp;&nbsp;print_r(get_included_files());
&nbsp;&nbsp;&nbsp;&nbsp;echo EOL;
&nbsp;&nbsp;&nbsp;&nbsp;print get_include_path();
&nbsp;&nbsp;&nbsp;&nbsp;echo EOL;
&nbsp;&nbsp;&nbsp;&nbsp;//set_include_path(get_include_path().PATH_SEPARATOR.&#039;/var/www/ly_php/php_spl/include/&#039;);
&nbsp;&nbsp;&nbsp;&nbsp;//set_include_path(dirname(__FILE__).&#039;/include&#039;);
&nbsp;&nbsp;&nbsp;&nbsp;//set_include_path(dirname(__FILE__).&#039;/include/&#039;);

&nbsp;&nbsp;&nbsp;&nbsp;function __autoload($className)&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$filename = &#039;./&#039;.$className.&#039;.php&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(file_exists($filename))&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;include_once $filename;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;else&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(&#039;no file&#039;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&nbsp;&nbsp;&nbsp;&nbsp;$a = new aClass();
&nbsp;&nbsp;&nbsp;&nbsp;$b = new bClass();
&nbsp;&nbsp;&nbsp;&nbsp;print_r(get_included_files());
?&gt;
</textarea><br/><br/>/tmp/autoload/aClass.php<br/><textarea name="code" class="php" rows="15" cols="100">
&lt;?php
class aClass&#123;
&nbsp;&nbsp;&nbsp;&nbsp;function aClass()&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;aClass loaded...&quot;;

&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&#125;
</textarea><br/><br/>/tmp/autoload/bClass.php<br/><textarea name="code" class="php" rows="15" cols="100">
&lt;?php
class bClass&#123;
&nbsp;&nbsp;&nbsp;&nbsp;function bClass()&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;bClass loaded...&quot;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&#125;
</textarea><br/><br/>运行一下，看一下在加载前和后引入的文件是否一样？不一样有新文件：<br/>[root@test autoload]# php autoload.php&nbsp;&nbsp; <br/>Array<br/>(<br/>&nbsp;&nbsp;&nbsp;&nbsp;[0] =&gt; /tmp/autoload/autoload.php<br/>)<br/><br/>.:/opt/2012-01-30/php-5.3.10<br/>aClass loaded...bClass loaded...Array<br/>(<br/>&nbsp;&nbsp;&nbsp;&nbsp;[0] =&gt; /tmp/autoload/autoload.php<br/>&nbsp;&nbsp;&nbsp;&nbsp;[1] =&gt; /tmp/autoload/aClass.php<br/>&nbsp;&nbsp;&nbsp;&nbsp;[2] =&gt; /tmp/autoload/bClass.php<br/>)<br/><br/>上面是一个用法，第二个是把__autoload 这个函数都给重定义了：<br/>spl_autoload_register(array(&#039;Ko&#039;, &#039;autoload&#039;));//这要就由function __autoload($className)变成了：function autoload($className)<br/>————————————————————结合框架来说这个autoload的事情—————————————————————<br/><br/>/**<br/> * Enable the Ko auto-loader.<br/> *<br/> * @see&nbsp;&nbsp;http://php.net/spl_autoload_register<br/> */<br/>spl_autoload_register(array(&#039;Ko&#039;, &#039;autoload&#039;));<br/>----于是了解到如下自动加载机制：<br/>英文原文：https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md<br/><br/>以下内容描述了符合自动载入程序互操作性所必须遵守的强制性规范。<br/><br/>强制要求<br/><br/>一个完整的命名空间 (namespace) 和类 (class) 必须使用以下结构： &#92;&lt;Vendor Name&gt;&#92;(&lt;Namespace&gt;&#92;)*&lt;Class Name&gt;<br/>每个命名空间 (namespace) 必须使用供应商名称 (“Vendor Name”)&nbsp;&nbsp;做为顶层命名空间(top-level namespace).<br/>每个命名空间 (namespace) 的子命名空间 (sub-namespace) 数量不限.<br/>程序从文件系统载入的时候，每个命名空间 (namespace) 的分隔符 (separator) 将被替换为操作系统的目录分隔符 (DIRECTORY_SEPARATOR).<br/> 在类名 (CLASS NAME) 中的下划线 ( _) 也将被替换为操作系统的目录分隔符 (DIRECTORY_SEPARATOR) , 在命名空间 (namespace) 中的下划线 (_)不做替换.<br/>从文件系统载入的合格的命名空间 (namespace) 和 类 (class) 必须以 .php 结尾.<br/>供应商名称 (vendor names), 命名空间 (namespaces)&nbsp;&nbsp;及类名 (class names) 可以使用任意大小写字母的组合.<br/>示例<br/><br/>&#92;Doctrine&#92;Common&#92;IsolatedClassLoader =&gt; /path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php<br/>&#92;Symfony&#92;Core&#92;Request =&gt; /path/to/project/lib/vendor/Symfony/Core/Request.php<br/>&#92;Zend&#92;Acl =&gt; /path/to/project/lib/vendor/Zend/Acl.php<br/>&#92;Zend&#92;Mail&#92;Message =&gt; /path/to/project/lib/vendor/Zend/Mail/Message.php<br/>在命名空间(Namespaces)和类名(Class Names)中的下划线<br/><br/>&#92;namespace&#92;package&#92;Class_Name =&gt; /path/to/project/lib/vendor/namespace/package/Class/Name.php<br/>&#92;namespace&#92;package_name&#92;Class_Name =&gt; /path/to/project/lib/vendor/namespace/package_name/Class/Name.php<br/>The standards we set here should be the lowest common denominator for painless autoloader interoperability. You can test that you are following these standards by utilizing this sample SplClassLoader implementation which is able to load PHP 5.3 classes.<br/><br/>实现示例<br/><br/>下面的示例函数演示了遵循上述规范的自动加载过程.<br/><textarea name="code" class="php" rows="15" cols="100">
&lt;?php

function autoload($className)
&#123;
&nbsp;&nbsp;&nbsp;&nbsp;$className = ltrim($className, &#039;&#92;&#92;&#039;);
&nbsp;&nbsp;&nbsp;&nbsp;$fileName&nbsp;&nbsp;= &#039;&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;$namespace = &#039;&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;if ($lastNsPos = strrpos($className, &#039;&#92;&#92;&#039;)) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$namespace = substr($className, 0, $lastNsPos);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$className = substr($className, $lastNsPos + 1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$fileName&nbsp;&nbsp;= str_replace(&#039;&#92;&#92;&#039;, DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;$fileName .= str_replace(&#039;_&#039;, DIRECTORY_SEPARATOR, $className) . &#039;.php&#039;;

&nbsp;&nbsp;&nbsp;&nbsp;require $fileName;
&#125;
</textarea><br/>SplClassLoader 实现<br/><br/>如果你的程序遵守上面的自动载入程序互操作性规范，可以使用下面的SplClassLoader实现来加载你的类 (classes) . 这也是 PHP 5.3 推荐的遵循本规范的类 (class) 加载方式.<br/>来自：http://www.dunban.com/?p=30<br/><br/>http://gist.github.com/221634<br/><br/><br/>最后参考：<br/>http://www.jb51.net/article/23956.htm<br/>http://blog.csdn.net/hguisu/article/details/7463333<br/>http://www.php.net/manual/zh/function.autoload.php<br/>http://blog.sina.com.cn/s/blog_6915bcb101017p2x.html<br/>http://www.php100.com/html/php/lei/2013/0905/5267.html<br/><br/><br/>YII框架里，一般各种框架都有这样的用法，特别是PHP5的框架：<br/>spl_autoload_register(array(&#039;Ko&#039;, &#039;autoload&#039;));<br/> bool spl_autoload_register(array(‘class’,&#039;static_function’))<br/>参数为数组，数组中第一个值为类名，第二个值为方法名，且必须为静态方法。<br/>例：<br/><textarea name="code" class="php" rows="15" cols="100">
&lt;?php

&nbsp;&nbsp;&nbsp;&nbsp;class A
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public static function autoload($class)&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;require &#039;$class.php&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;

spl_autoload_register(array(&#039;A&#039;,&#039;autoload&#039;));
[/php]
autoload这个函数一般就是用来作文件查找并包含的：
[codes=php]
&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp; * Provides auto-loading support of Ko classes, as well as transparent
&nbsp;&nbsp;&nbsp;&nbsp; * extension of classes that have a Controller / Model suffix.
&nbsp;&nbsp;&nbsp;&nbsp; *
&nbsp;&nbsp;&nbsp;&nbsp; * Class names are converted to file names by making the class name
&nbsp;&nbsp;&nbsp;&nbsp; * lowercase and converting underscores to slashes:
&nbsp;&nbsp;&nbsp;&nbsp; *
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; // Loads classes/my/class/name.php
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; Ko::autoload(&#039;My_Class_Name&#039;);
&nbsp;&nbsp;&nbsp;&nbsp; *
&nbsp;&nbsp;&nbsp;&nbsp; * @param&nbsp;&nbsp; string&nbsp;&nbsp; class name
&nbsp;&nbsp;&nbsp;&nbsp; * @return&nbsp;&nbsp;boolean
&nbsp;&nbsp;&nbsp;&nbsp; */
&nbsp;&nbsp;&nbsp;&nbsp;public static function autoload ($class)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (class_exists($class, FALSE))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return TRUE;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($class !== &#039;Controller&#039; &amp;&amp; substr($class, -10) === &#039;Controller&#039;) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$type = &#039;controllers&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$file = strtolower(substr($class, 0, -10));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; elseif ($class !== &#039;Model&#039; &amp;&amp; substr($class, -5) === &#039;Model&#039;) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$type = &#039;models&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$file = strtolower(substr($class, 0, -5));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; elseif ($class !== &#039;Service&#039; &amp;&amp; substr($class, -7) === &#039;Service&#039;) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$type = &#039;services&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$file = strtolower(substr($class, 0, -7));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; else &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$type = &#039;.&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$file = strtolower($class);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (($path = self::findFile($type, $file)) !== false) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;require_once $path;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return TRUE;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return FALSE;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;

[/php]

上面的findFile就是通过是去查找根据来自controllers还是models的文件找到打缓存后返回路径并包含起来：
[codes=php]
&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp; * Finds the path of a file by directory, filename, and extension.
&nbsp;&nbsp;&nbsp;&nbsp; * If no extension is given, the default extension will be used.
&nbsp;&nbsp;&nbsp;&nbsp; *
&nbsp;&nbsp;&nbsp;&nbsp; * When searching the &quot;config&quot; directory, an array of files
&nbsp;&nbsp;&nbsp;&nbsp; * will be returned. These files will return arrays which must be
&nbsp;&nbsp;&nbsp;&nbsp; * merged together.
&nbsp;&nbsp;&nbsp;&nbsp; *
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; // Returns an absolute path to views/template.php
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; Ko::findFile(&#039;views&#039;, &#039;template&#039;);
&nbsp;&nbsp;&nbsp;&nbsp; *
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; // Returns an absolute path to media/css/style.css
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; Ko::findFile(&#039;media&#039;, &#039;css/style&#039;, &#039;css&#039;);
&nbsp;&nbsp;&nbsp;&nbsp; *
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; // Returns an array of all the &quot;mimes&quot; configuration file
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; Ko::findFile(&#039;config&#039;, &#039;mimes&#039;);
&nbsp;&nbsp;&nbsp;&nbsp; *
&nbsp;&nbsp;&nbsp;&nbsp; * @param&nbsp;&nbsp; string&nbsp;&nbsp; directory name (views, extensions, etc.)
&nbsp;&nbsp;&nbsp;&nbsp; * @param&nbsp;&nbsp; string&nbsp;&nbsp; filename with subdirectory
&nbsp;&nbsp;&nbsp;&nbsp; * @param&nbsp;&nbsp; string&nbsp;&nbsp; extension to search for
&nbsp;&nbsp;&nbsp;&nbsp; * @return&nbsp;&nbsp;array&nbsp;&nbsp;&nbsp;&nbsp;file list from the &quot;config&quot; or &quot;messages&quot; directories
&nbsp;&nbsp;&nbsp;&nbsp; * @return&nbsp;&nbsp;string&nbsp;&nbsp; single file path
&nbsp;&nbsp;&nbsp;&nbsp; */
&nbsp;&nbsp;&nbsp;&nbsp;public static function findFile ($dir, $file, $ext = &#039;php&#039;)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$path = $dir . DIRECTORY_SEPARATOR . str_replace(&#039;_&#039;, DIRECTORY_SEPARATOR, $file) . &#039;.&#039; .$ext;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (self::$caching === TRUE and isset(self::$_files[$path])) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return self::$_files[$path];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($dir === &#039;config&#039; OR $dir === &#039;i18n&#039; OR $dir === &#039;messages&#039;) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Array of files that have been found
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$found = array();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (is_file(DATA_PATH . $path)) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// This path has a file, add it to the list
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$found[] = DATA_PATH . $path;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; else &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// The file has not been found yet
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$found = FALSE;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach (self::$_paths as $dir) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (is_file($dir . $path)) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// A path has been found
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$found = $dir . $path;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (self::$caching === TRUE) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Add the path to the cache
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self::$_files[$path] = $found;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Files have been changed
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self::$_files_changed = TRUE;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $found;
&nbsp;&nbsp;&nbsp;&nbsp;&#125; 
[/php]

====特别分析一行，关于autoload的目录,如：models目录，services目录下想建立一个目录放二期独立的项目文件：====
这里的findFile有一行值得注意：
$path = $dir . DIRECTORY_SEPARATOR . str_replace(&#039;_&#039;, DIRECTORY_SEPARATOR, $file) . &#039;.&#039; .$ext;
这个如果说在models目录，services目录下想建立一个目录放二期项目（如我们的：开放平台），那这一行就有作用了：
可以写成有下划线，前半部分就是目录models/services的下级目录名称，后面就是类名，Demo如下所示（这个对扩展太有用了）：
[codes=php]
&lt;?php
//$type = &#039;models&#039;;
//$path = self::findFile($type, $file)) !== false
$type=&quot;models&quot;;
$dir = $type;
$ext = &quot;php&quot;;
$file = &quot;open_OpenAPIModel&quot;;
echo str_replace(&#039;_&#039;, DIRECTORY_SEPARATOR, $file). &#039;.&#039; .$ext; //输出：open&#92;OpenAPIModel.php
echo &quot;&#92;n&quot;;
echo $dir . DIRECTORY_SEPARATOR . str_replace(&#039;_&#039;, DIRECTORY_SEPARATOR, $file). &#039;.&#039; .$ext;//输出：models&#92;open&#92;OpenAPIModel.php
?&gt;
</textarea><br/>输出：<br/>---------- 调试PHP ----------<br/>open&#92;OpenAPIModel.php<br/>models&#92;open&#92;OpenAPIModel.php<br/>输出完成 (耗时 0 秒) - 正常终止<br/>在实际运用中文件名里是不能有Model的字符的，通过对findFile的Debug一下得到：<br/>D:&#92;www&#92;iseeyoo&#92;trunk&#92;codes&#92;application&#92;models&#92;open&#92;adminchannellink.php<br/>class open_AdminChannelLinkModel extends Model&nbsp;&nbsp;//类名包含下划线和Model（如果是Service也一样：class OpenChannelService extends baseService，文件名：&#92;application&#92;services&#92;openchannel.php也不能包含Service字符。），这个规则是：文件命名里不能有Model。（这个得注意下）<br/>&#123;<br/><br/>&#125;<br/>//直接在Core里Debug下，得出上面的规律。<br/>public static function findFile ($dir, $file, $ext = &#039;php&#039;)<br/>&#123;<br/>&nbsp;&nbsp;if($file == &quot;open_adminchannellink&quot;)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file_put_contents(&quot;d:/wamp/www/aaa.txt&quot;,&quot;ModelfileDiR=&quot;.$dir.&quot;&#92;n&quot;,FILE_APPEND);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file_put_contents(&quot;d:/wamp/www/aaa.txt&quot;,&quot;Modelfilepath=&quot;.$path.&quot;&#92;n&quot;,FILE_APPEND);<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;打印出：<br/>&nbsp;&nbsp;ModelfilePosition=open_adminchannellink<br/>&nbsp;&nbsp;ModelfileDiR=models<br/>&nbsp;&nbsp;Modelfilepath=models&#92;open&#92;adminchannellink.php<br/><br/><br/>kohana 这个也是支持contrller直接接调用Module层的,实践OK的，理论上就是通过Autoload调用module，Service（文件类名有不同的标记）的类名（这个是有规范的上面有描述），进而拼接出大体位置，让findfile去找到这个文件：<br/>application&#92;controllers&#92;open&#92;index.php<br/><textarea name="code" class="php" rows="15" cols="100">
&nbsp;&nbsp;class Open_IndexController extends Open_BaseController
&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * default action
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public function index()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;/*//调用 用Service层，Service层调model&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;$obj = new OpenChannelService();
&nbsp;&nbsp;&nbsp;&nbsp;$obj-&gt;test();die;
&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;$openchannelModel = new open_AdminChannelLinkModel();
&nbsp;&nbsp;&nbsp;&nbsp;echo $openchannelModel-&gt;test();die;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&nbsp;&nbsp;&#125;

&nbsp;&nbsp;Service层结构：
&nbsp;&nbsp;application&#92;services&#92;openchannel.php
&nbsp;&nbsp;class OpenChannelService extends baseService
&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public function test()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;$openchannelModel = new open_AdminChannelLinkModel();
&nbsp;&nbsp;&nbsp;&nbsp;return $openchannelModel-&gt;test();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp; 
&nbsp;&nbsp;&#125;
</textarea><br/> http://domain.com/open/index/index<br/>这一看是contrller下面有一个open（经过路由配置到了open目录的），后有一个index.php的文件里有一个index函数，如果想直接获取这个uri的内容，可以通过这个函数实现，如下：<br/><textarea name="code" class="php" rows="15" cols="100">
return&nbsp;&nbsp;$this-&gt;request-&gt;forward(&quot;index&quot;, &#039;index&#039;, &#039;open&#039;, $arguments);
</textarea><br/><br/>这个forward吧，其实就相当于YII里的路由控制器访问index目录下的index控制器下面的index的action方法，路由相关知识：<br/>什么是路由：<br/>在框架里边我们通过路由获得控制器和方法，<br/>我们有了控制器的方法，就可以进一步与视图或模型进行交互，<br/>http://网址/index.php?r=控制器/方法 <br/>http://网址/index.php?r=user/cc<br/><br/>===============================================================<br/><br/><br/>一般还是有一个autoload函数来做加载的：<br/><textarea name="code" class="php" rows="15" cols="100">
&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp; * Provides auto-loading support of Ko classes, as well as transparent
&nbsp;&nbsp;&nbsp;&nbsp; * extension of classes that have a Controller / Model suffix.
&nbsp;&nbsp;&nbsp;&nbsp; *
&nbsp;&nbsp;&nbsp;&nbsp; * Class names are converted to file names by making the class name
&nbsp;&nbsp;&nbsp;&nbsp; * lowercase and converting underscores to slashes:
&nbsp;&nbsp;&nbsp;&nbsp; *
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; // Loads classes/my/class/name.php
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; Ko::autoload(&#039;My_Class_Name&#039;);
&nbsp;&nbsp;&nbsp;&nbsp; *
&nbsp;&nbsp;&nbsp;&nbsp; * @param&nbsp;&nbsp; string&nbsp;&nbsp; class name
&nbsp;&nbsp;&nbsp;&nbsp; * @return&nbsp;&nbsp;boolean
&nbsp;&nbsp;&nbsp;&nbsp; */
&nbsp;&nbsp;&nbsp;&nbsp;public static function autoload ($class)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (class_exists($class, FALSE))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return TRUE;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($class !== &#039;Controller&#039; &amp;&amp; substr($class, -10) === &#039;Controller&#039;) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$type = &#039;controllers&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$file = strtolower(substr($class, 0, -10));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; elseif ($class !== &#039;Model&#039; &amp;&amp; substr($class, -5) === &#039;Model&#039;) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$type = &#039;models&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$file = strtolower(substr($class, 0, -5));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; elseif ($class !== &#039;Service&#039; &amp;&amp; substr($class, -7) === &#039;Service&#039;) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$type = &#039;services&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$file = strtolower(substr($class, 0, -7));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; else &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$type = &#039;.&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$file = strtolower($class);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (($path = self::findFile($type, $file)) !== false) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;require_once $path;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return TRUE;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return FALSE;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
</textarea><br/><br/><br/>自动auto加载代码：<br/><textarea name="code" class="php" rows="15" cols="100">
&lt;?php
&nbsp;&nbsp;&nbsp;&nbsp;function __autoload($class_name) 
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//class directories
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$directorys = array(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#039;classes/&#039;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#039;classes/otherclasses/&#039;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#039;classes2/&#039;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#039;module1/classes/&#039;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//for each directory
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach($directorys as $directory)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//see if the file exsists
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(file_exists($directory.$class_name . &#039;.php&#039;))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;require_once($directory.$class_name . &#039;.php&#039;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//only require the class once, so quit after to save effort (if you got more, then name them something else 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&#125; 

</textarea><br/>自订义自动加载函数用SPL：<br/><textarea name="code" class="php" rows="15" cols="100">
&lt;?php
spl_autoload_register(function($classname) /* usign $app */ &#123;
&nbsp;&nbsp;# ... your logic to include classes here
&#125;);
?&gt; 

</textarea>
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post/5877/#blogcomment63825</link>
<title><![CDATA[[评论] [框架精髓]PSR-0 Autoloading Standard 自动加载机制的规范，及接合kohana的自动加载逻辑分析。]]></title> 
<author>喜悦村 &lt;sadly@phpx.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Fri, 28 Dec 2012 02:35:17 +0000</pubDate> 
<guid>http://www.jackxiang.com/post/5877/#blogcomment63825</guid> 
<description>
<![CDATA[ 
	博主不厚道啊。一字不落的转了本人博文，参考资料却只字不提。。。。
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post/5877/#blogcomment63826</link>
<title><![CDATA[[评论] [框架精髓]PSR-0 Autoloading Standard 自动加载机制的规范，及接合kohana的自动加载逻辑分析。]]></title> 
<author>root &lt;admin@yourname.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Sat, 29 Dec 2012 07:14:52 +0000</pubDate> 
<guid>http://www.jackxiang.com/post/5877/#blogcomment63826</guid> 
<description>
<![CDATA[ 
	把链接贴上来我给加上，QQ联系你吧，哈哈。
]]>
</description>
</item>
</channel>
</rss>