<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>I&#039;m Donkey &#187; CodeIgniter</title>
	<atom:link href="http://imdonkey.com/blog/archives/tag/codeigniter/feed" rel="self" type="application/rss+xml" />
	<link>http://imdonkey.com/blog</link>
	<description></description>
	<lastBuildDate>Thu, 26 Aug 2010 02:14:19 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>让CodeIgniter自动加载所有自定义类</title>
		<link>http://imdonkey.com/blog/archives/142</link>
		<comments>http://imdonkey.com/blog/archives/142#comments</comments>
		<pubDate>Sat, 30 Jan 2010 17:59:43 +0000</pubDate>
		<dc:creator>luoxi</dc:creator>
				<category><![CDATA[坨坨胡同儿]]></category>
		<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://imdonkey.com/blog/?p=142</guid>
		<description><![CDATA[此文主要是提出一种让CodeIgniter自动加载所有自定义类的办法，即lazyloading。（只适用于没有带参数的构造函数的类）

先举个例子，如果我在一个controller中想调用某自定义的library，一般来讲需要两步：
1.  $this->load->library("mylib");
2.  $this->mylib->myfunction();

虽然第一步不是每次都要调用，但至少要在使用前初始化一次。当需要的library比较多时，假如再加上需要的model类，那就有点烦人了。所以，我们要做的就是去掉第一步，不管在controller，library还是model中，让codeigniter自动load需要的类，这样我们就能更专注于业务逻辑，而不用考虑载入的问题。<p class='read-more'><a href='http://imdonkey.com/blog/archives/142'>阅读全文 »</a></p>]]></description>
			<content:encoded><![CDATA[<p>此文主要是提出一种让CodeIgniter自动加载所有自定义类的办法，即lazyloading。（只适用于没有带参数的构造函数的类）</p>
<p>先举个例子，如果我在一个controller中想调用某自定义的library，一般来讲需要两步：<br />
1.  $this-&gt;load-&gt;library(&#8220;mylib&#8221;);<br />
2.  $this-&gt;mylib-&gt;myfunction();</p>
<p>虽然第一步不是每次都要调用，但至少要在使用前初始化一次。当需要的library比较多时，假如再加上需要的model类，那就有点烦人了。所以，我们要做的就是去掉第一步，不管在controller，library还是model中，让codeigniter自动load需要的类，这样我们就能更专注于业务逻辑，而不用考虑载入的问题。</p>
<p>大家都知道，php5中预定义了__get()方法来获取属性，这个方法不是默认存在的，需要我们手工添加到类里面去。我们就利用这个方法来实现自动加载，首先需要在system/library/Controller和Model两个codeigniter文件中加上__get()方法，代码如下：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #7F0055; font-weight: bold;">function</span> __get <span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #7F0055;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span> <span style="color: #000000;">==</span> <span style="color: #0000ff;">&quot;config&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #7F0055;">return</span><span style="color: #000000;">;</span>
	<span style="color: #000088;">$var</span> <span style="color: #000000;">=&amp;</span>wxMagicGet<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span><span style="color: #000000;">;</span>
	<span style="color: #7F0055;">return</span> <span style="color: #000088;">$var</span><span style="color: #000000;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>而wxMagicGet方法可以定义在一个你自己的helper文件中，代码如下：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #7F0055; font-weight: bold;">function</span> <span style="color: #000000;">&amp;</span>wxMagicGet<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #7F0055;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span> <span style="color: #000000;">==</span> <span style="color: #0000ff;">&quot;db&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$CI</span> <span style="color: #000000;">=</span> <span style="color: #000000;">&amp;</span>get_instance<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #000000;">;</span>
		<span style="color: #000088;">$CI</span><span style="color: #000000;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #000000;">-&gt;</span><span style="color: #004000;">database</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #000000;">;</span>
		<span style="color: #7F0055;">return</span> <span style="color: #000088;">$CI</span><span style="color: #000000;">-&gt;</span><span style="color: #000088;">$name</span><span style="color: #000000;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #7F0055;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000000;">!</span>wxGetLoadingInfo<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #000000;">,</span> <span style="color: #000088;">$type</span><span style="color: #000000;">,</span> <span style="color: #000088;">$mpath</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #7F0055;">return</span> <span style="color: #7F0055; font-weight: bold;">null</span><span style="color: #000000;">;</span>
&nbsp;
	<span style="color: #000088;">$CI</span> <span style="color: #000000;">=</span> <span style="color: #000000;">&amp;</span>get_instance<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #000000;">;</span>
	<span style="color: #7F0055;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$type</span> <span style="color: #000000;">==</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$CI</span><span style="color: #000000;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #000000;">-&gt;</span><span style="color: #004000;">library</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$mpath</span><span style="color: #000000;">.</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span><span style="color: #000000;">;</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #7F0055;">else</span> <span style="color: #7F0055;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$type</span> <span style="color: #000000;">==</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$CI</span><span style="color: #000000;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #000000;">-&gt;</span><span style="color: #004000;">model</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$mpath</span><span style="color: #000000;">.</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span><span style="color: #000000;">;</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #7F0055;">else</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #7F0055;">return</span> <span style="color: #7F0055; font-weight: bold;">null</span><span style="color: #000000;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #7F0055;">return</span> <span style="color: #000088;">$CI</span><span style="color: #000000;">-&gt;</span><span style="color: #000088;">$name</span><span style="color: #000000;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #7F0055; font-weight: bold;">function</span> wxGetLoadingInfo<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #000000;">,</span> <span style="color: #000000;">&amp;</span><span style="color: #000088;">$type</span><span style="color: #000000;">,</span> <span style="color: #000000;">&amp;</span><span style="color: #000088;">$mpath</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	static <span style="color: #000088;">$pathmap</span> <span style="color: #000000;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #000000;">;</span>
	<span style="color: #000088;">$filename</span> <span style="color: #000000;">=</span> <span style="color: #000088;">$name</span><span style="color: #000000;">;</span>
	<span style="color: #7F0055;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">strripos</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #000000;">,</span> <span style="color: #0000ff;">&quot;.php&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000;">===</span> <span style="color: #7F0055; font-weight: bold;">FALSE</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$filename</span> <span style="color: #000000;">.=</span> <span style="color: #0000ff;">&quot;.php&quot;</span><span style="color: #000000;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #7F0055;">return</span> _find_where<span style="color: #009900;">&#40;</span><span style="color: #000088;">$filename</span><span style="color: #000000;">,</span> <span style="color: #000088;">$type</span><span style="color: #000000;">,</span> <span style="color: #000088;">$mpath</span><span style="color: #009900;">&#41;</span><span style="color: #000000;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #7F0055; font-weight: bold;">function</span> _find_where<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #000000;">,</span> <span style="color: #000000;">&amp;</span><span style="color: #000088;">$type</span><span style="color: #000000;">,</span> <span style="color: #000000;">&amp;</span><span style="color: #000088;">$mpath</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">//find in app model</span>
	<span style="color: #000088;">$type</span> <span style="color: #000000;">=</span> <span style="color: #cc66cc;">2</span><span style="color: #000000;">;</span>
	<span style="color: #7F0055;">if</span> <span style="color: #009900;">&#40;</span>_find_where_path<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #000000;">,</span> APPPATH<span style="color: #000000;">.</span><span style="color: #0000ff;">&quot;models/&quot;</span><span style="color: #000000;">,</span> <span style="color: #000088;">$mpath</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$mpath</span> <span style="color: #000000;">=</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$mpath</span><span style="color: #000000;">,</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span>APPPATH<span style="color: #000000;">.</span><span style="color: #0000ff;">&quot;models/&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #000000;">;</span>
		<span style="color: #7F0055;">return</span> <span style="color: #7F0055; font-weight: bold;">true</span><span style="color: #000000;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//find in app library</span>
	<span style="color: #000088;">$type</span> <span style="color: #000000;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #000000;">;</span>
	<span style="color: #7F0055;">if</span> <span style="color: #009900;">&#40;</span>_find_where_path<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #000000;">,</span> APPPATH<span style="color: #000000;">.</span><span style="color: #0000ff;">&quot;libraries/&quot;</span><span style="color: #000000;">,</span> <span style="color: #000088;">$mpath</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$mpath</span> <span style="color: #000000;">=</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$mpath</span><span style="color: #000000;">,</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span>APPPATH<span style="color: #000000;">.</span><span style="color: #0000ff;">&quot;libraries/&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #000000;">;</span>
		<span style="color: #7F0055;">return</span> <span style="color: #7F0055; font-weight: bold;">true</span><span style="color: #000000;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//find in base library</span>
	<span style="color: #000088;">$type</span> <span style="color: #000000;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #000000;">;</span>
	<span style="color: #7F0055;">if</span> <span style="color: #009900;">&#40;</span>_find_where_path<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #000000;">,</span> BASEPATH<span style="color: #000000;">.</span><span style="color: #0000ff;">&quot;libraries/&quot;</span><span style="color: #000000;">,</span> <span style="color: #000088;">$mpath</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$mpath</span> <span style="color: #000000;">=</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$mpath</span><span style="color: #000000;">,</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span>BASEPATH<span style="color: #000000;">.</span><span style="color: #0000ff;">&quot;libraries/&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #000000;">;</span>
		<span style="color: #7F0055;">return</span> <span style="color: #7F0055; font-weight: bold;">true</span><span style="color: #000000;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #7F0055;">return</span> <span style="color: #7F0055; font-weight: bold;">false</span><span style="color: #000000;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #7F0055; font-weight: bold;">function</span> _find_where_path<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #000000;">,</span> <span style="color: #000088;">$path</span><span style="color: #000000;">,</span> <span style="color: #000000;">&amp;</span><span style="color: #000088;">$mpath</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #7F0055;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$path</span> <span style="color: #000000;">.</span> <span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$mpath</span> <span style="color: #000000;">=</span> <span style="color: #000088;">$path</span><span style="color: #000000;">;</span>
		<span style="color: #7F0055;">return</span> <span style="color: #7F0055; font-weight: bold;">true</span><span style="color: #000000;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #7F0055;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$path</span> <span style="color: #000000;">.</span> <span style="color: #990000;">ucfirst</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$name1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$mpath</span> <span style="color: #000000;">=</span> <span style="color: #000088;">$path</span><span style="color: #000000;">;</span>
		<span style="color: #7F0055;">return</span> <span style="color: #7F0055; font-weight: bold;">true</span><span style="color: #000000;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #7F0055;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$path</span> <span style="color: #000000;">.</span> <span style="color: #990000;">strtoupper</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$mpath</span> <span style="color: #000000;">=</span> <span style="color: #000088;">$path</span><span style="color: #000000;">;</span>
		<span style="color: #7F0055;">return</span> <span style="color: #7F0055; font-weight: bold;">true</span><span style="color: #000000;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//更深入的查找所有子目录</span>
	<span style="color: #000088;">$found</span> <span style="color: #000000;">=</span> <span style="color: #7F0055; font-weight: bold;">false</span><span style="color: #000000;">;</span>
	<span style="color: #7F0055;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$handle</span> <span style="color: #000000;">=</span> <span style="color: #000000;">@</span><span style="color: #990000;">opendir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$path</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #7F0055;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #7F0055; font-weight: bold;">false</span> <span style="color: #000000;">!==</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span> <span style="color: #000000;">=</span> <span style="color: #990000;">readdir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$handle</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #7F0055;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span> <span style="color: #000000;">!=</span> <span style="color: #0000ff;">&quot;.&quot;</span> <span style="color: #000000;">&amp;&amp;</span> <span style="color: #000088;">$file</span> <span style="color: #000000;">!=</span> <span style="color: #0000ff;">&quot;..&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000088;">$child</span> <span style="color: #000000;">=</span> <span style="color: #000088;">$path</span><span style="color: #000000;">.</span><span style="color: #000088;">$file</span><span style="color: #000000;">;</span>
				<span style="color: #7F0055;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">is_dir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$child</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
					<span style="color: #7F0055;">if</span> <span style="color: #009900;">&#40;</span>_find_where_path<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #000000;">,</span> <span style="color: #000088;">$child</span> <span style="color: #000000;">.</span> <span style="color: #0000ff;">&quot;/&quot;</span><span style="color: #000000;">,</span> <span style="color: #000088;">$mpath</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
						<span style="color: #000088;">$found</span> <span style="color: #000000;">=</span> <span style="color: #7F0055; font-weight: bold;">true</span><span style="color: #000000;">;</span>
						<span style="color: #7F0055;">break</span><span style="color: #000000;">;</span>
					<span style="color: #009900;">&#125;</span>
				<span style="color: #009900;">&#125;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #990000;">closedir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$handle</span><span style="color: #009900;">&#41;</span><span style="color: #000000;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #7F0055;">return</span> <span style="color: #000088;">$found</span><span style="color: #000000;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>好，一个自动查找并加载的helper就写好了，记得将这个helper放到application/config/autoload.php文件中，这样codeigniter在每次运行时会自动初始化它。</p>
<p>以后我们开发时不管在哪都可以直接调用需要的类，不需要先load了。：）<br />
Controller里直接写：$this-&gt;classname-&gt;function(xxx)就行，<br />
Library里需要先初始化codeigniter资源，如：$this-&gt;obj = &amp;get_instance();<br />
之后也可直接写：$this-&gt;obj-&gt;classname-&gt;function(xxx)</p>
<p>关于codeigniter的框架结构及初始化程序流程，可以参考下面两篇文章：<br />
<a href="http://www.pqshow.com/program/php/200909/10208.html">codeigniter是如何实现mvc模式以及单一入口<br />
</a><a href="http://blog.csdn.net/yuhaibao324/archive/2009/12/20/5037818.aspx">codeIgniter之优缺点</a></p>
<p>codeigniter手册请查看官方网站：<a href="http://codeigniter.org.cn/user_guide/index.html">http://codeigniter.org.cn/user_guide/index.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://imdonkey.com/blog/archives/142/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
