<?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/"
	>

<channel>
	<title>OH！Myleoliu Blog</title>
	<atom:link href="http://www.myleoliu.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.myleoliu.com</link>
	<description></description>
	<pubDate>Mon, 29 Dec 2008 06:21:14 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>CakePHP资料翻译(1)：使用requestAction创建可复用的Elements</title>
		<link>http://www.myleoliu.com/archives/10.html</link>
		<comments>http://www.myleoliu.com/archives/10.html#comments</comments>
		<pubDate>Mon, 29 Dec 2008 05:07:08 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[cakephp]]></category>

		<category><![CDATA[翻译]]></category>

		<guid isPermaLink="false">http://www.myleoliu.com/?p=10</guid>
		<description><![CDATA[原文地址：Creating Reusable Elements with requestAction
原文作者：gwoo
翻译：myleoliu

这是一个使用requestAction()创建可复用elements的简单教程. 本例提供CakePHP1.1/1.2示例代码.让我们先从一个简单的controller开始:

Controller Code:

&#60;?php&#160;
class&#160;PostsController&#160;extends&#160;AppController&#160;{
&#160;&#160;&#160;&#160;var&#160;$name&#160;=&#160;&#8216;Posts&#8217;;
&#160;&#160;&#160;&#160;function&#160;index()&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$posts&#160;=&#160;$this-&#62;Post-&#62;findAll();
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(isset($this-&#62;params['requested']))&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;$posts;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$this-&#62;set(&#8216;posts&#8217;,&#160;$posts);
&#160;&#160;&#160;&#160;}
}
?&#62;




首先，我们创建一个Posts controller并给它添加一个默认动作(index action)，然后我们就能通过index action取得所有posts。如果requestAction()向index action发送请求,那么(index action)将直接返回posts结果集,否则(index action)就把posts发送给view。


接下来,我们来创建一个使用requestAction()的可复用element。创建文件/app/elements/posts.thtml并添加如下代码:

View Template:

$posts&#160;=&#160;$this-&#62;requestAction(&#8217;posts/index&#8217;);
foreach($posts&#160;as&#160;$post):
&#160;&#160;&#160;&#160;echo&#160;$post['Post']['title'];
endforeach;




现在，我们可以将这个element包含进layout，view模板或者其他element中进行复用了。

View Template:

&#60;?php&#160;echo&#160;$this-&#62;renderElement(&#8216;posts&#8217;);?&#62;





以上代码适用于cakephp1.1.如果你想使用CakePHP1.2,请参照下面的代码。

Controller Code:

&#60;?php&#160;
class&#160;PostsController&#160;extends&#160;AppController&#160;{
&#160;&#160;&#160;&#160;var&#160;$name&#160;=&#160;&#8216;Posts&#8217;;
&#160;&#160;&#160;&#160;function&#160;index()&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$posts&#160;=&#160;$this-&#62;paginate();
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(isset($this-&#62;params['requested']))&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;$posts;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$this-&#62;set(&#8216;posts&#8217;,&#160;$posts);
&#160;&#160;&#160;&#160;}
}
?&#62;




注意，我们在index action中改用了paginate()方法。在view中,我们可以设置paginate的相关参数来控制它的返回内容。

View Template:

$posts&#160;=&#160;$this-&#62;requestAction(&#8217;posts/index/sort:created/direction:desc/limit:10&#8242;);
foreach($posts&#160;as&#160;$post):
&#160;&#160;&#160;&#160;echo&#160;$post['Post']['title'];
endforeach;




我们现在可以只返回最新的10条信息了。哇哦，我们在没有改变或创建任何action的条件下创建了一个显示最新post的element。


现在我们来调用这个element并将它缓存一个小时。创建文件/app/elements/latest_posts.ctp:

View Template:

&#60;?php&#160;echo&#160;$this-&#62;element(&#8216;latest_posts&#8217;,&#160;array(&#8216;cache&#8217;=&#62;&#8216;+1&#160;hour&#8217;);?&#62;





我们仍然可以在其他View文件中使用这个element。


requestAction()方法还有很多其他的用途。但如果你想为网站创建可复用得element，那么本教程所讲述的方法是一个不错的选择。
]]></description>
			<content:encoded><![CDATA[<p>原文地址：<a title="Creating Reusable Elements with requestAction" href="http://bakery.cakephp.org/articles/view/creating-reusable-elements-with-requestaction" target="_blank">Creating Reusable Elements with requestAction</a><br />
原文作者：<a href="http://bakery.cakephp.org/profiles/view/gwoo" target="_blank">gwoo</a><br />
翻译：<a title="OH! Myleoliu blog!" href="http://www.myleoliu.com" target="_blank">myleoliu</a></p>
<p>
这是一个使用requestAction()创建可复用elements的简单教程. 本例提供CakePHP1.1/1.2示例代码.让我们先从一个简单的controller开始:
</p>
<p><h4>Controller Code:</h4>
<p><code><span style="color: #000000"><br />
<span style="color: #0000BB">&lt;?php&nbsp;<br />
<br /></span><span style="color: #007700">class&nbsp;</span><span style="color: #0000BB">PostsController&nbsp;</span><span style="color: #007700">extends&nbsp;</span><span style="color: #0000BB">AppController&nbsp;</span><span style="color: #007700">{<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;</span><span style="color: #0000BB">$name&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">&#8216;Posts&#8217;</span><span style="color: #007700">;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;</span><span style="color: #0000BB">index</span><span style="color: #007700">()&nbsp;{<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$posts&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">Post</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">findAll</span><span style="color: #007700">();<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(isset(</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">params</span><span style="color: #007700">[</span><span style="color: #DD0000">'requested'</span><span style="color: #007700">]))&nbsp;{<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">$posts</span><span style="color: #007700">;<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">set</span><span style="color: #007700">(</span><span style="color: #DD0000">&#8216;posts&#8217;</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$posts</span><span style="color: #007700">);<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />}<br />
<br /></span><span style="color: #0000BB">?&gt;</span><br />
</span><br />
</code>
</p>
<p>
首先，我们创建一个Posts controller并给它添加一个默认动作(index action)，然后我们就能通过index action取得所有posts。如果requestAction()向index action发送请求,那么(index action)将直接返回posts结果集,否则(index action)就把posts发送给view。
</p>
<p>
接下来,我们来创建一个使用requestAction()的可复用element。创建文件/app/elements/posts.thtml并添加如下代码:
</p>
<p><h4>View Template:</h4>
<p><code><span style="color: #000000"></p>
<p>$posts&nbsp;=&nbsp;$this-&gt;requestAction(&#8217;posts/index&#8217;);<br />
<br />foreach($posts&nbsp;as&nbsp;$post):<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$post['Post']['title'];<br />
<br />endforeach;<br />
<br /></span><br />
</code>
</p>
<p>
现在，我们可以将这个element包含进layout，view模板或者其他element中进行复用了。
</p>
<p><h4>View Template:</h4>
<p><code><span style="color: #000000"></p>
<p><span style="color: #0000BB">&lt;?php&nbsp;</span><span style="color: #007700">echo&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">renderElement</span><span style="color: #007700">(</span><span style="color: #DD0000">&#8216;posts&#8217;</span><span style="color: #007700">);</span><span style="color: #0000BB">?&gt;<br />
<br /></span><br />
</span><br />
</code>
</p>
<p>
以上代码适用于cakephp1.1.如果你想使用CakePHP1.2,请参照下面的代码。
</p>
<p><h4>Controller Code:</h4>
<p><code><span style="color: #000000"><br />
<span style="color: #0000BB">&lt;?php&nbsp;<br />
<br /></span><span style="color: #007700">class&nbsp;</span><span style="color: #0000BB">PostsController&nbsp;</span><span style="color: #007700">extends&nbsp;</span><span style="color: #0000BB">AppController&nbsp;</span><span style="color: #007700">{<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;</span><span style="color: #0000BB">$name&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">&#8216;Posts&#8217;</span><span style="color: #007700">;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;</span><span style="color: #0000BB">index</span><span style="color: #007700">()&nbsp;{<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$posts&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">paginate</span><span style="color: #007700">();<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(isset(</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">params</span><span style="color: #007700">[</span><span style="color: #DD0000">'requested'</span><span style="color: #007700">]))&nbsp;{<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">$posts</span><span style="color: #007700">;<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">set</span><span style="color: #007700">(</span><span style="color: #DD0000">&#8216;posts&#8217;</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$posts</span><span style="color: #007700">);<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />}<br />
<br /></span><span style="color: #0000BB">?&gt;</span><br />
</span><br />
</code>
</p>
<p>
注意，我们在index action中改用了paginate()方法。在view中,我们可以设置paginate的相关参数来控制它的返回内容。
</p>
<p><h4>View Template:</h4>
<p><code><span style="color: #000000"></p>
<p>$posts&nbsp;=&nbsp;$this-&gt;requestAction(&#8217;posts/index/sort:created/direction:desc/limit:10&#8242;);<br />
<br />foreach($posts&nbsp;as&nbsp;$post):<br />
<br />&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$post['Post']['title'];<br />
<br />endforeach;<br />
<br /></span><br />
</code>
</p>
<p>
我们现在可以只返回最新的10条信息了。哇哦，我们在没有改变或创建任何action的条件下创建了一个显示最新post的element。
</p>
<p>
现在我们来调用这个element并将它缓存一个小时。创建文件/app/elements/latest_posts.ctp:
</p>
<p><h4>View Template:</h4>
<p><code><span style="color: #000000"></p>
<p><span style="color: #0000BB">&lt;?php&nbsp;</span><span style="color: #007700">echo&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">element</span><span style="color: #007700">(</span><span style="color: #DD0000">&#8216;latest_posts&#8217;</span><span style="color: #007700">,&nbsp;array(</span><span style="color: #DD0000">&#8216;cache&#8217;</span><span style="color: #007700">=&gt;</span><span style="color: #DD0000">&#8216;+1&nbsp;hour&#8217;</span><span style="color: #007700">);</span><span style="color: #0000BB">?&gt;<br />
<br /></span><br />
</span><br />
</code>
</p>
<p>
我们仍然可以在其他View文件中使用这个element。
</p>
<p>
requestAction()方法还有很多其他的用途。但如果你想为网站创建可复用得element，那么本教程所讲述的方法是一个不错的选择。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.myleoliu.com/archives/10.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>一本不错的书《Zend Framework In Action》</title>
		<link>http://www.myleoliu.com/archives/7.html</link>
		<comments>http://www.myleoliu.com/archives/7.html#comments</comments>
		<pubDate>Thu, 05 Jun 2008 03:49:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[zend framework]]></category>

		<category><![CDATA[Ebook]]></category>

		<guid isPermaLink="false">http://www.myleoliu.com/?p=7</guid>
		<description><![CDATA[最近在学习Zend Framework,在网上找到一本不错的书《Zend Framework In Action》，Rob Allen等人写的。




下载地址：ZendFramework In Action
目录：
Part 1: The essentials
1. Introducing the Zend Framework
2. Hello Zend Framework!  
Part 2: A core application 
3. Building a web site with the Zend Framework
4. Ajax
5. Managing the database
6. User authentication and authorisation
7. Forms
8. Searching
9. Email
10. Deployment  
Part 3: More power to your application 
11. Talking [...]]]></description>
			<content:encoded><![CDATA[<p>最近在学习Zend Framework,在网上找到一本不错的书《Zend Framework In Action》，Rob Allen等人写的。<br />
<br/><br />
<img style="border: 0px;" src="http://www.myleoliu.com/files/Zendframework_in_action.gif" alt="《Zend Framework In Action》" width="210" height="267" /><br />
<br/><br />
<br/><br />
下载地址：<a href="http://d.download.csdn.net/down/391560/kittyjie" target="_blank" >ZendFramework In Action</a></p>
<h2>目录：</h2>
<h3>Part 1: The essentials</h3>
<p>1. Introducing the Zend Framework<br />
2. Hello Zend Framework!  </p>
<h3>Part 2: A core application </h3>
<p>3. Building a web site with the Zend Framework<br />
4. Ajax<br />
5. Managing the database<br />
6. User authentication and authorisation<br />
7. Forms<br />
8. Searching<br />
9. Email<br />
10. Deployment  </p>
<h3>Part 3: More power to your application </h3>
<p>11. Talking with other applications<br />
12. Mash ups with public web services<br />
13. Caching: making it faster<br />
14. Internationalization and localization<br />
15. Creating PDFs<br />
16. Integrating with other PHP libraries  </p>
<h3>Appendix A. Stuff you (should) already know<br />
Appendix B. System-specific gotchas<br />
Appendix C. Zend Framework Core Components reference  </h3>
<p><br/></p>
]]></content:encoded>
			<wfw:commentRss>http://www.myleoliu.com/archives/7.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Php路径问题及其解决方法</title>
		<link>http://www.myleoliu.com/archives/6.html</link>
		<comments>http://www.myleoliu.com/archives/6.html#comments</comments>
		<pubDate>Tue, 20 May 2008 04:40:57 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[PHP相关]]></category>

		<category><![CDATA[原创]]></category>

		<guid isPermaLink="false">http://www.myleoliu.com/?p=6</guid>
		<description><![CDATA[


初学PHP的时候，我们经常被PHP的绝对路径和相对路径弄的晕头转向。路径问题经常导致include及require命令不能加载到指定的页面，从而导致Web程序运行错误。本文将跟大家一起探讨一下PHP路径问题的常用解决方案。
    下面我们先做一个个简单的示例:



上图是一个简单Web项目的结构图,其中各文件的代码如下:  
root/index.php : 
  

&#60;?php 
    require_once &#8216;app/blog.php&#8217;;
    
    $blog=new Blog();
    echo $blog-&#62;GetBlogInfo();
    ?&#62;
root/app/blog.php : 

  &#60;?php 
    require_once &#8216;../lib/smarty/functions.php&#8217;;
    ?&#62; 
    &#60;?php 
 [...]]]></description>
			<content:encoded><![CDATA[<style type="text/css">
<!--
#code{
	background-color:#DBFAFF;
	border:1px solid #BDF6FE;
	padding:12px;
	margin-bottom:10px;
	margin-top:10px;
}
.blue{
	color:#0033FF;
}
.green{
	color:#339900;
}
.green_bold{
	color:#339900;
	font-weight:bold;
}
.red{
	color:#FF0000;
}
.style1 {font-size: 16px}
-->
</style>
<p align="left">初学PHP的时候，我们经常被PHP的绝对路径和相对路径弄的晕头转向。路径问题经常导致include及require命令不能加载到指定的页面，从而导致Web程序运行错误。本文将跟大家一起探讨一下PHP路径问题的常用解决方案。<br />
    下面我们先做一个个简单的示例:</p>
<p>
<img style="border: 0px;" src="http://www.myleoliu.com/files/image_path_sln1.jpg" alt="示例1图片" width="175" height="185" />
</p>
<p align="left">上图是一个简单Web项目的结构图,其中各文件的代码如下:  </p>
<p><span class="green_bold">root/index.php :</span> 
  </p>
<div id="code">
<span class="red">&lt;?php</span> <br />
    <span class="blue">require_once</span> <span class="green">&#8216;app/blog.php&#8217;</span>;<br />
    <br />
    $blog=new Blog();<br />
    <span class="blue">echo</span> $blog-&gt;GetBlogInfo();<br />
    <span class="red">?&gt;</span></div>
<p><strong class="green_bold">root/app/blog.php :</strong> </p>
<div id="code">
  <span class="red">&lt;?php </span><br />
    <span class="blue">require_once</span> <span class="green">&#8216;../lib/smarty/functions.php&#8217;</span>;<br />
    <span class="red">?&gt; </span><br />
    <span class="red">&lt;?php </span><br />
    <span class="blue">class</span> Blog<br />
    { <br />
    &nbsp;&nbsp;&nbsp;<span class="blue">public</span> <span class="blue">function</span> GetBlogInfo()<br />
    &nbsp;&nbsp;&nbsp;{<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="blue">return</span> <span class="green">&#8216;This is a test of  blog!&#8217;</span>;<br />
    &nbsp;&nbsp;&nbsp;}<br />
    } <br />
    <span class="red">?&gt; </span><br />
    <span class="red">&lt;?php </span><br />
    <span class="blue">echo</span> <span class="green">&#8216;root/app/blog.php loaded successed!&lt;/br&gt;&#8217;</span>; <br />
    <span class="red">?&gt;</span></div>
<p align="left">首先,我们从浏览器里直接输入<span class="blue">http://localhost/root/app/blog.php</span>,浏览器显示：</p>
<p>  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p align="left">root/app/blog.php loaded successed!</p>
<p align="left">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p align="left">文件加载成功，没发生任何警告或错误。</p>
<p align="left">
  接下来，我们在浏览器中请求如下网站：<span class="blue">http://localhost/root/index.php</span>,浏览器显示出如下错误信息:</p>
<p align="left">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
  Warning: require_once(../lib/smarty/functions.php) [<span class="blue">function.require-once</span>]: failed to open  stream: No such file or directory in  T:\Study\PHP_REL\Projects\root\app\blog.php on line 2<br />
  Fatal error: require_once() [<span class="blue">function.require</span>]: Failed opening  required &#8216;../lib/smarty/functions.php&#8217; (include_path=&#8217;.;C:\php5\pear&#8217;) in  T:\Study\PHP_REL\Projects\root\app\blog.php on line 2<br />
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p align="left">为什么&#8217;../lib/smarty/functions.php&#8217;没能加载? 我们访问http://localhost/root/app/blog.php没有出现任何异常，这说明出现错误的原因很可能在<span class="green_bold"><strong>root/index.php</strong></span>的<span class="blue">require_once</span> <span class="green">&#8216;app/blog.php&#8217;</span>语句。从Google里搜索一下：<strong class="red">php路径问题</strong>，你就能找到问题的答案。当<span class="green_bold"><strong>root/index.php</strong></span>引用<span class="green_bold"><strong>root/app/blog.php</strong></span>后，blog.php中的<span class="blue">require_once</span>语句的参照点变成了<strong class="green_bold">root/index.php</strong>所在的目录（根目录root）。所以，以<span class="green_bold"><strong>root/index.php</strong></span>为参照点加载<span class="green">&#8216;../lib/smarty/functions.php&#8217;</span>时,自然就出错了。</p>
<p align="left">找到了问题所在，接下来，我们就来寻找解决问题的办法：</p>
<p class="green_bold style1">1.将所有文件放在一个文件夹下</p>
<p>  将所有文件放在一个文件夹下,那么就不会存在路径问题了。但是，这绝对是个馊主意！！除非你写一个小的不能再小的项目，不然请不要尝试这种方法，没有结构的系统太可怕了！</p>
<p class="green_bold style1"> 2.使用绝对路径</p>
<p> <span class="red"><strong>注：</strong></span>PHP中的include和require使用的是文件系统的绝对路径，如<span class="green">&#8220;c:\wwwroot\yourproject\index.php&#8221;</span><br />
  <span class="green"></p>
<p>  step1：</span>刚刚发生异常是因为我们使用了相对路径，如果换成绝对路径就不会出现以上错误。让我们简单修改一下<span class="green_bold">root/app/blog.php</span>:<br />
  将前三行由 </p>
<div id="code">
  <span class="red">&lt;?php </span><br />
  <span class="blue">require_once</span> <span class="green">&#8216;../lib/smarty/functions.php&#8217;</span>;<br />
  <span class="red">?&gt;<br />
  </span></div>
<p>  修改为: </p>
<div id="code">
  <span class="red">&lt;?php </span><br />
  <span class="blue">require_once</span> <span class="green">&#8216;T:\\Study\\PHP_REL\\Projects\\root\\lib\\smarty\\functions.php&#8217;</span>;<br />
  <span class="red">?&gt;  </span></div>
<p>
    现在,我们访问:<span class="blue">http://localhost/root/index.php</span>  ,浏览器显示:</p>
<p>    &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
    root/app/blog.php loaded successed!<br />
    This is a test of blog!<br />
    &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>    程序执行成功了。</p>
<p>  <span class="green">step2</span>：虽然程序不报错了，但很明显，我们并没有真正的解决问题。没有人会在程序里写<span class="blue">require_once</span><span class="green"> &#8216;T:\Study\PHP_REL\Projects&#8230;functions.php&#8217;</span>这样的东西,这样写将会使程序完全丧失灵活性,使程序难以移植!</p>
<p>
    让我们再重新回想一下出现错误的原因:1.不同层次文件之间的引用使<span class="blue">require_once</span>的<strong>参照点</strong>发生了变化;2.参照点发生变化后，按<strong>相对路径</strong>加载文件会出错。如果我们把<span class="blue">require_once</span>的参照点固定,问题不就解决了吗.如何固定参照点?当然是使用绝对路径，具体实现方法：一个函数+一个常量:dirname()和__FILE__。让我们重新修改<span class="green_bold">root/app/blog.php</span>如下：<br />
    将前三行由 </p>
<div id="code">
<span class="red">&lt;?php </span><br />
<span class="blue">require_once</span> <span class="green">&#8216;T:\\Study\\PHP_REL\\Projects\\root\\lib\\smarty\\functions.php&#8217;</span>; <br />
<span class="red">?&gt;</span>
</div>
<p>修改为: </p>
<div id="code">
<span class="red">&lt;?php </span><br />
<span class="blue">require_once</span> dirname(__FILE__).<span class="green">&#8216;/&#8217;</span>.<span class="green">&#8216;../lib/smarty/functions.php&#8217;</span>; <br />
<span class="red">?&gt;</span></div>
<p>
再次访问<span class="blue">http://localhost/root/index.php</span>程序运行正常,但这种解决方式很明显优于<span class="blue">step1</span>中的解决方式。应该说,这是一种<strong>&quot;绝对路径+相对路径&quot;</strong>的解决方式。</p>
</p>
<p align="left">step3：上面的方法已经能够解决路径问题，但感觉代码不够优雅。让代码更优雅，我们可以这样做：在根目录(root)下新建一个<span class="green_bold">settings.php:</span> </p>
<p>
<img style="border: 0px;" src="http://www.myleoliu.com/files/image_path_sln2.jpg" alt="示例2图片" width="173" height="205" />
</p>
<p><strong class="green_bold">root/settings.php :</strong> </p>
<div id="code">
  <span class="red">&lt;?php </span><br />
      <span class="blue">if</span>(!defined(ABSPATH)) <br />
      <span class="blue">define</span>(<span class="green">&#8216;ABSPATH&#8217;</span>,dirname(__FILE__).<span class="green">&#8216;/&#8217;</span>);<br />
      <span class="red">?&gt;</span> </div>
<p>      <span class="green"><strong>root/app/blog.php</strong></span>中的代码修改为:</p>
<div id="code">
  <span class="red">&lt;?php </span><br />
      <span class="blue">require_once</span> ABSPATH.<span class="green">&#8216;lib/smarty/functions.php&#8217;</span>; <br />
      <span class="red">?&gt;  </span></div>
<p>    同时<span class="green_bold">root/index.php</span>中的代码修改为:<br />
    </p>
<div id="code">
  <span class="red">&lt;?php</span><br />
      <span class="blue">require_once</span><span class="green"> &#8217;settings.php&#8217;</span>; <br />
      <span class="blue">require_once</span> ABSPATH.<span class="green">&#8216;app/blog.php&#8217;</span>;<br />
      <br />
    $blog=new Blog();<br />
      <span class="blue">echo</span> $blog-&gt;GetBlogInfo();<br />
      <span class="red">?&gt;</span></div>
<p align="left">仔细考虑一下,如果直接访问<span class="blue">http://localhost/root/app/blog.php</span>又会出现问题:常量ABSPATH没有定义。所以，如果你的程序有直接访问<span class="blue">http://localhost/root/app/blog.php</span>这种情况类似的情况，那么最好直接使用dirname(__FILE__).<span class="green">&#8216;/&#8217;</span>.<span class="green">&#8216;相对路径&#8217;</span>，或者在使用ABSPATH前加一个判断（但这样有点脱裤子放Ｘ的感觉）。</p>
<p align="left"><strong>注</strong>:在<span class="blue">WordPress</span>中使用了ABSPATH与dirname(__FILE__).<span class="green">&#8216;/&#8217;</span>.<span class="green">&#8216;相对路径&#8217;</span>相结合的方法,从网站统一入口(<span class="green_bold">根目录/index.php</span>)加载的文件,使用ABSPATH的解决方法(ABSPATH在<em>根目录<span class="green">/wp-config-sample.php </span></em>中定义),而那些不直接通过统一入口访问的php文件,WP使用dirname(__FILE__).<span class="green">&#8216;/&#8217;</span>.<span class="green">&#8216;相对路径&#8217;</span>的解决方案。</p>
<p class="green_bold style1">3.设置Apache的include_path参数</p>
<p>在前面的错误信息中,有一句值得我们注意: </p>
<p>      &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
      Fatal error: require_once() [<span class="blue">function.require</span>]: Failed opening required &#8216;../lib/smarty/functions.php&#8217;<span class="green_bold"> (include_path=&#8217;.;C:\php5\pear&#8217;)</span> in T:\Study\PHP_REL\Projects\root\app\blog.php on line 2<br />
      &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>      Apache的include_path参数保存的是require/include的读取目录,在上面的错误信息里，include_path包含了两个位置:<br />
      1) &quot;.&quot;表示从当前文件所在的目录中加载<br />
      2) &quot;C:\php5\pear&quot;表示从C盘的php5/pear目录下加载。<br />
      php函数库为我们提供了set_include_path()函数用于设置include_path参数。通过set_include_path()函数,我们可以自定义加载位置（<span class="blue">ZendFramework</span>中就是使用set_include_path()函数来解决路径问题）。</p>
<p>      下面我们来演示一下如何用set_include_path()函数：</p>
<p>      <span class="green_bold">root/index.php :</span></p>
<div id="code">
	  <span class="red">&lt;?php</span><br />
  set_include_path(<span class="green">&#8216;./&#8217;</span>.PATH_SEPARATOR.dirname(__FILE__));</p>
<p>
    <span class="blue">require_once</span> <span class="green">&#8216;app/blog.php&#8217;</span>;</p>
<p>    $blog = new Blog();<br />
    <span class="blue">echo</span> $blog-&gt;GetBlogInfo();<br />
  <span class="red">?&gt;</span></div>
<p>root/app/blog.php ;</p>
<div id="code">
<span class="red">&lt;?php</span><br />
      <span class="blue">require_once</span> <span class="green">&#8216;lib/smarty/functions.php&#8217;</span>;<br />
      <span class="red">?&gt;</span><br />
      <span class="red">&lt;?php</span><br />
      <span class="blue">class</span> Blog<br />
      {<br />
      <span class="blue">&nbsp;&nbsp;public</span> function GetBlogInfo()<br />
      &nbsp;&nbsp;{<br />
      &nbsp;&nbsp;&nbsp;&nbsp;<span class="blue">return</span><span class="green"> &#8216;This is a test of blog!&#8217;</span>;<br />
      &nbsp;&nbsp;}<br />
      }<br />
      <span class="red">?&gt;</span><br />
      <span class="red">&lt;?php</span><br />
      <span class="blue">echo</span> <span class="green">&#8216;root/app/blog.php loaded successed!&lt;br/&gt;&#8217;</span>;<br />
      <span class="red">?&gt;</span>
  </div>
<p> 测试<span class="blue">http://localhost/root/index.php</span>,运行正常。从<span class="green_bold">root/app/blog.php</span>可以看出，<span class="blue">require_once</span>的路径写法更简洁了（不需要使用ABSPATH或者dirname(__FILE__)）。这种实现方式跟ABSPATH的解决方式一样，需要保证系统有统一的入口点(一般通过<a href="http://www.myleoliu.com/archives/5.html">.htaccess文件</a>实现)。</p>
<p>当然，解决php路径的方法不止以上几种，网上有很多人提供了针对php路径问题的解决方案，但多数都有一定的适用场景，不能生搬硬套。在下一篇日志中，我会对php路径问题的其他解决方法做一个简单的总结。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.myleoliu.com/archives/6.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>.htaccess文件简介</title>
		<link>http://www.myleoliu.com/archives/5.html</link>
		<comments>http://www.myleoliu.com/archives/5.html#comments</comments>
		<pubDate>Sat, 17 May 2008 11:42:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[PHP相关]]></category>

		<category><![CDATA[原创]]></category>

		<guid isPermaLink="false">http://www.myleoliu.com/?p=5</guid>
		<description><![CDATA[前一阵在学习ZendFramework时,在配置.htaccess文件的过程中出了点小问题。现在问题已经解决，在此把.htaccess相关的内容整理了一下：
1. .htaccess文件简介

.htaccess文件又称为"分布式配置文件",它为我们提供了针对目录改变配置的方法。.htaccess可以做大量的事情，包括：文件夹密码保护、用户自动重定向、自定义错误页面、改变你的文件扩展名、封禁特定IP地址的用户、只允许特定IP地址的用户、禁止目录列表，以及使用其他文件作为index文件。

以下是Apache指南中关于.htaccess文件的介绍:

.htaccess文件(或者"分布式配置文件")提供了针对目录改变配置的方法， 即，在一个特定的文档目录中放置一个包含一个或多个指令的文件， 以作用于此目录及其所有子目录。
说明：
如果需要使用.htaccess以外的其他文件名，可以用AccessFileName指令来改变。 例如，需要使用.config，则可以在服务器配置文件中按以下方法配置：
AccessFileName .config 
允许放在这些文件中的指令取决于AllowOverride指令， 此指令按类别决定了.htaccess文件中哪些指令才是有效的。 如果一个指令允许放在.htaccess文件中，则，在Apache手册的说明中，此指令会有一个覆盖段， 其中说明了为使此指令生效而必须在AllowOverride指令中设置的值。

.......
]]></description>
			<content:encoded><![CDATA[<p>前一阵在学习ZendFramework时,在配置.htaccess文件的过程中出了点小问题。现在问题已经解决，在此把.htaccess相关的内容整理了一下：</p>
<p><span style="font-size:14px;">1. <span style="color: #0000ff;">.htaccess</span>文件简介</span></p>
<p>.htaccess文件又称为&#8221;分布式配置文件&#8221;,它为我们提供了针对目录改变配置的方法。.htaccess可以做大量的事情，包括：文件夹密码保护、用户自动重定向、自定义错误页面、改变你的文件扩展名、封禁特定IP地址的用户、只允许特定IP地址的用户、禁止目录列表，以及使用其他文件作为index文件。</p>
<p>以下是Apache指南中关于.htaccess文件的介绍:</p>
<p>.htaccess文件(或者&#8221;分布式配置文件&#8221;)提供了针对目录改变配置的方法， 即，在一个特定的文档目录中放置一个包含一个或多个指令的文件， 以作用于此目录及其所有子目录。<br />
说明：<br />
如果需要使用.htaccess以外的其他文件名，可以用AccessFileName指令来改变。 例如，需要使用.config，则可以在服务器配置文件中按以下方法配置：<br />
AccessFileName .config<br />
允许放在这些文件中的指令取决于AllowOverride指令， 此指令按类别决定了.htaccess文件中哪些指令才是有效的。 如果一个指令允许放在.htaccess文件中，则，在Apache手册的说明中，此指令会有一个覆盖段， 其中说明了为使此指令生效而必须在AllowOverride指令中设置的值。</p>
<p>&#8230;&#8230;.</p>
<p>更多内容:<a href="http://www.uplinux.com/download/doc/apache/ApacheManual/howto/htaccess.html">Apache指南—.htaccess文件</a></p>
<p><span style="font-size:14px;">2. 使用过程中遇到的问题</span><br />
1).htaccess文件的创建<br />
在使用过程中第一个遇到的问题就是.htaccess文件创建的问题。因为我使用的是Windows操作系统，Windows不允许以正常的方式创建.htaccess。原因很简单，.htaccess只有扩展名。不能以正常的方式创建那么，意味着非正常的方式可以创建：<br />
a）从网上直接下载一个（从Google或百度里搜索一下）,这是最简单有效的方法，唯一要注意的问题就是小心病毒。在病毒横行的年代，我们要时刻保持警惕。<br />
b）本人在网上搜了一段VB代码：</p>
<p style="font-size: 12px;background-color:#DBFAFF;border:1px solid #BDF6FE;padding:10px;">Dim fso, f1<br />
Set fso = CreateObject(&#8221;Scripting.FileSystemObject&#8221;)<br />
Set f1 = fso.CreateTextFile(&#8221;d:\.htaccess&#8221;, True)</p>
<p>用记事本创建一个文本文件,将以上三行代码复制到此文本文件。把文本文件的扩展名由.txt改为.vbs，然后双击即可。默认将.htaccess文件保存在D盘根目录,你可以根据自己的需要修改上面的代码。注：必须使用已存在的路径，若路径不存在，则会抛出异常！</p>
<p>2).htaccess文件的使用<br />
使用zendframework时,需要在根目录下建一个.htaccess文件,并创建如下内容:</p>
<p style="font-size: 12px;background-color:#DBFAFF;border:1px solid #BDF6FE;padding:10px;">RewriteEngine on<br />
RewriteRule .* index.php<br />
php_flag magic_quotes_gpc off<br />
php_flag register_globals off
</p>
<p>然后在php.ini中AllowOverride 设置为 All</p>
<p>以上设置的目的是使所有请求都重定向到index.php,由index.php来处理所有请求（为什么这样做，我会在其他文章中介绍）。但设置完成后，无论我访问任何页面，都会报错：<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
Internal Server Error<br />
The server encountered an internal error or misconfiguration and was unable to complete your request.</p>
<p>Please contact the server administrator, <a href="mailto:myleoliu@gmail.com">myleoliu@gmail.com</a> and inform them of the time the error occurred, and anything you might have done that may have caused the error.</p>
<p>More information about this error may be available in the server error log.<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>查看Apache的日志，发现如下错误<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
[Sat May 15 14:45:43 2008] [alert] [client 127.0.0.1] E:/Projects/BS/PHP/zendtest/.htaccess: Invalid command &#8216;RewriteEngine&#8217;, perhaps misspelled or defined by a module not included in the server configuration<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
原来是模块rewrite_module 没有加载（apache默认是不加载此模块），在httpd.config中,将#LoadModule rewrite_module modules/mod_rewrite.so前面的#去掉。然后保存、重启Apache，问题解决。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.myleoliu.com/archives/5.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>第一篇博客</title>
		<link>http://www.myleoliu.com/archives/3.html</link>
		<comments>http://www.myleoliu.com/archives/3.html#comments</comments>
		<pubDate>Fri, 09 May 2008 16:27:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[杂谈]]></category>

		<category><![CDATA[生活]]></category>

		<guid isPermaLink="false">http://www.myleoliu.com/?p=3</guid>
		<description><![CDATA[很久之前就有人忽悠我开博客了，但工作原因，一直没有时间。现在项目告一段落了，终于可以拿出时间来写一点东西，记录一下自己这段时间学到东西。
我是个程序员，更确切的说，应该是个“人肉代码生成器”。平时的工作自然就是生成由26个字母和一堆符号组成的代码。我是一个从美工起家的程序员，从大一到大三一直都在做界面生成器（网页，喷绘，封面，logo&#8230;&#8230;什么都做，没办法，领导需要你做什么，你就要会什么)，平面设计做累了，就开始学写程序，起初只是想玩玩，没想到却成了我现在的饭碗。记得我写的一个程序是用C#写的一个爬虫下载器（自动搜索并下载图片），当时看到蓝色理想由很多不错的图片素材（20000多张），实在懒得一张张下了，于是就写了那个程序，结果一个晚上下了5Gb的图片。从此，我被程序设计所勾引，一发不可收拾。从最初的界面、逻辑、数据访问写在一块的垃圾代码，到三层程序架构、mvc、设计模式、IOC、Plugin体系，从asp到asp.net 再到php&#8230;&#8230;.每一次成长都让我欣喜若狂。
我现在还是个普通的IT民工，所以现阶段还只能幻想着有房、有车的生活。为了过上自己想要的生活，我会一直努力下去。现在的我可以不成功，但不能不进步。
]]></description>
			<content:encoded><![CDATA[<p>很久之前就有人忽悠我开博客了，但工作原因，一直没有时间。现在项目告一段落了，终于可以拿出时间来写一点东西，记录一下自己这段时间学到东西。</p>
<p>我是个程序员，更确切的说，应该是个“人肉代码生成器”。平时的工作自然就是生成由26个字母和一堆符号组成的代码。我是一个从美工起家的程序员，从大一到大三一直都在做界面生成器（网页，喷绘，封面，logo&#8230;&#8230;什么都做，没办法，领导需要你做什么，你就要会什么)，平面设计做累了，就开始学写程序，起初只是想玩玩，没想到却成了我现在的饭碗。记得我写的一个程序是用C#写的一个爬虫下载器（自动搜索并下载图片），当时看到蓝色理想由很多不错的图片素材（20000多张），实在懒得一张张下了，于是就写了那个程序，结果一个晚上下了5Gb的图片。从此，我被程序设计所勾引，一发不可收拾。从最初的界面、逻辑、数据访问写在一块的垃圾代码，到三层程序架构、mvc、设计模式、IOC、Plugin体系，从asp到asp.net 再到php&#8230;&#8230;.每一次成长都让我欣喜若狂。</p>
<p>我现在还是个普通的IT民工，所以现阶段还只能幻想着有房、有车的生活。为了过上自己想要的生活，我会一直努力下去。现在的我可以不成功，但不能不进步。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.myleoliu.com/archives/3.html/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
