扩展 Zend_Loader,增加 classpath 功能

Posted on 30th January 2008 by Nio in Zend Framework, 程序人生

Zend Framework 一个比较基本的类是 Zend_Loader,可以很方便地注册 autoload,自动根据命名规则加载使用到的类,如:


<?php
Zend_Loader::registerAutoload();
?>

但这个类不支持 classpath,我们可能需要用到多个搜索路径去查找类文件,比如:Nio_Ajax_Response 的路径为 /home/nio/lib/Nio/Ajax/Response.php,classpath 为:/home/nio/lib,而测试用的类,通常会放到另一个单独的目录下:/home/nio/test,Nio_Ajax_Response 的测试类 Nio_Test_Ajax_Response 对应的文件是 /home/nio/test/Nio/Test/Ajax/Response.php。这样,我们就需要用到 classpath 了,依次在不同的目录下查找类文件。

扩展一下 Zend_Loader:


<?php
require_once 'Zend/Loader.php';

/**
 * Class/Interface/File loader.
 *
 * @author Nio Xiao
 */
class Nio_Loader extends Zend_Loader
{    
    /**
     * @var array classpath
     */
    private static $classPaths = array();
    
    /**
     * spl_autoload() suitable implementation for supporting class autoloading.
     *
     * Attach to spl_autoload() using the following:
     * <code>
     * spl_autoload_register(array('Nio_Loader', 'autoload'));
     * </code>
     *
     * @param string $class
     * @return string|false Class name on success; false on failure
     */
    public static function autoload($class)
    {
        try {
            if (preg_match('/^Zend/'$class)) {    //Zend Framework class
                parent::loadClass($class);
            } else {    //my class
                parent::loadClass($classself::$classPaths);
            }
            return $class;
        } catch (Exception $e) {
            return false;
        }
    }    
    
    /**
     * Get current class path array.
     *
     * @return array
     */
    public static function getClassPaths()
    {
        return self::$classPaths;
    }
    
    /**
     * Add a class path to the loader for searching classes.
     *
     * @param string|array $path
     */
    public static function addClassPath($path)
    {
        if (is_array($path)) {
            foreach ($path as $pself::addClassPath($p);
        } else {
            self::$classPaths[] = $path;            
        }
    }
    
    /**
     * Remove a class path from the loader.
     *
     * @param string $path
     */
    public static function removeClassPath($path)
    {
        if ($key array_search($pathself::$classPaths)) {
            unset(self::$classPaths[$key]);
        }
    }
}
?>

现在我们就可以用 Nio_Loader 来加入 classpath 了:


<?php
Zend_Loader::registerAutoload('Nio_Loader'); //注册我们自己的 loader

$classpaths = array(
    '/home/nio/lib',
    '/home/nio/test');
    
K12_Loader::addClassPath($classpaths);
var_dump(K12_Loader::getClassPaths());

K12_Loader::removeClassPath('/home/nio/test');
var_dump(K12_Loader::getClassPaths());
?>

有了这个我们就可以加入多个类搜索路径,不再需要重复写 require_once()/include_once()/Zend_Loader::loadFile() 的代码了 :)

回到广东

Posted on 15th January 2008 by Nio in 日常生活

前两天(周六)早班飞机回到了广东深圳,这次是拖家带口,最主要的是刚满两周岁的宝宝,呵呵。下了飞机就开始感到很热,南北温差太大。宝宝已经不记得爷爷、奶奶和姑姑了,不让抱,进了姑姑家很好奇,这也看看,那也看看。中午出去喝了广东的中午茶,美味的榴莲酥,久违的味道 :)

周日去了香港,发现星光大道多了个李小龙的雕像,还是很酷的。shxll 和我姐买了不少化妆品,我买了块 swatch 的手表,还给宝宝买了奶粉和补钙/补维生素的软糖。铜锣湾人很多,很热闹,店也很多,逛得很累,呵呵。等晚上回到深圳之后,发现宝宝已经开始缠着奶奶了,小孩子适应能力真强。
李小龙

今天中午表妹请吃午饭,宝宝也不记得她了,不过还好,还牵着她的手,也让她抱,呵呵。晚上我姐、姐夫带着我们一家三口出去逛街,宝宝又有了进步,开始喜欢牵着姑姑的手逛了,比较烦人的是,这个小家伙出来一趟,上了五六次厕所,没多长时间就要尿尿,还特别喜欢去坐电梯。。。

总之这几天忙着逛呀,串门呀,都没怎么在家吃饭。

最后秀一下我的 swatch 手表,呵呵。
swatch 手表

防 SPAM 邮件地址

Posted on 4th January 2008 by Nio in 程序人生

在网页上经常会留下邮件地址及链接,但明文的地址容易被 SPAM 利用,一种简单的方式就是利用 JavaScript 来生成邮件地址。


<?php
/**
 * 获取防 SPAM 的邮件链接代码。
 *
 * @param string $email 邮件地址。
 * @param string $text 链接的文字,null 则以邮件地址作为链接文字。
 * @param array $attributes 链接标签 <a> 的属性数组。
 * @return string
 * @author Nio Xiao
 */
function antispam_email($email$text=null$attibutes=array())
{
    if (!$text$text $email;
    $attrs = array();
    if ($attibutes) {
        foreach ($attibutes as $k => $v$attrs[] = $k.'="'.$v.'"';
    }
    $html '<a href="mailto:'.$email.'"'.implode(' '$attrs).'>'.$text.'</a>';
    $chars = array();
    for ($i 0$i strlen($html); $i++) {
        $chars[] = ord($html[$i]);
    }
    $str '
    <script type="text/javascript" language="javascript">
        document.write(String.fromCharCode('.implode(','$chars).'));
    </script>';
    return $str;
}

//测试调用
echo antispam_email('test@somesite.com''My Email');
?>

输出的代码:
<script type="text/javascript" language="javascript">
    document.write(String.fromCharCode(60,97,32,104,114,101,102,61,34,109,97,105,108,116,111,58,116,101,115,116,64,115,111,109,101,115,105,116,101,46,99,111,109,34,62,77,121,32,69,109,97,105,108,60,47,97,62));
</script>