类的自动载入机制

Gravatar是个提供头像服务的网站(网址:[https://www.gravatar.com]),只要用邮箱注册之后,就可以用邮箱获得上面的头像。

下面我们要在每行留言的前面由留言者的email,生成其在Gravatar上注册的头像。

为了演示我们的autoload,我们打算用一个独立的类完成这个操作。

  • 打开控制器文件app/notebook/controller/default.php,修改index方法。
<?php
class notebook_ctl_default extends base_controller{

    public function 
index(){
        
$this->pagedata['items'] = $this->app->model('item')->getList('*');

        
//新加的内容开始
        
$gravatar = new notebook_gravatar;

        foreach(
$this->pagedata['items'] as $k=>$item){
            
$this->pagedata['items'][$k]['avatar'] = $gravatar->get_avatar($item['item_email']);
        }
        
//新加的内容结束

        
$this->display('default.html');
    }

    ....
  • 这里的new notebook_gravatar 我们没有指定类的地址,而是通过自动载入完成查找文件的操作。
  • 规则如下:

以下划线_分隔类的名称,第一个区段标示app的名字,后面的部分为该applib目录下路径。 最后一个区段是具体的文件名。当app的名字是core时,则到ecoscore/lib目录下寻找指定的类。当类名中没有下划线时,则到ecoscore/lib/static目录下寻找指定的类。因此,aaa_bbb_ccc_ddd指向app/aaa/lib/bbb/ccc/ddd.phpcore_bbb_ccc指向core/lib/bbb/ccc.php

  • 此时,我们建立notebook_gravatar的文件app/notebook/lib/gravatar.php。 内容如下:
<?php
class notebook_gravatar{

    function 
get_avatar($email){
        return 
sprintf('https://www.gravatar.com/avatar/%s?s=48&r=x',md5($email));
    }

}
  • 现在让头像显示出来。修改文件:app/notebook/view/default.html
<dl>
	<{foreach from=$items item=item}>
	<dt>
	<{$item.item_subject}>
	<span class="date">日期: <{$item.item_posttime|cdate}></span>
	</dt>
	<dd>
	<!-- 新加的内容开始 -->
	<img src="<{$item.avatar}>" style="float:left;margin-right:10px" />
	<!-- 新加的内容结束 -->
	<{$item.item_content}>
	</dd>
	<{/foreach}>
	<div style="margin-bottom:20px;clear:both" />&nbsp;</div>
</dl>
  • 看一下成果吧:


內容目录

上一个主题

创建数据表,实现基本功能代码

下一个主题

Service - app间的扩展机制

快速搜索

输入相关的模块,术语,类或者函数名称进行搜索