• 利用svn hook pre-commit 只允许固定提交者的提交

    网站上线的时候,有时需要临时停掉其他人的svn 提交,可以使用pre-commit hook来达到类似的效果:

    
    REPOS="$1"
    TXN="$2"
    
    /usr/bin/svnlook author -t "$TXN" "$REPOS" | grep 'xuanyan' && exit 0
    
    exit 1
    
    
  • 静态对象继承,变量的继承,需要在父类声明

    写了一个单例的基类,其中使用了static::$instance静态变量,看下面代码会出现什么问题:

    
    class Singleton
    {
        protected static $instance = null;
    
        public static function getInstance()
        {
    
            if (!static::$instance instanceof static) {
                static::$instance = new static();
            }
    
            return static::$instance;
        }
    
        function __construct()
        {
            echo '__init__',get_class($this),"\n";
        }
        
        function run()
        {
            echo get_class($this),"\n";
        }
    }
    
    
    class a extends Singleton{}
    
    class b extends Singleton{}
    
    a::getInstance()->run();
    a::getInstance()->run();
    b::getInstance()->run();
    a::getInstance()->run();
    
    

    结果为:

  • php中针对错误和异常的统一处理

    网站开发中,需要针对异常和错误的捕捉,来帮助程序开发者进行bug的修改及网站错误日志记录或者呈现一个相对有好的错误页面.

    如何可以统一管理这些异常和错误? 下面是我准备使用的处理方式:

    
    // 捕捉错误,抛出异常
    set_error_handler(function($errno, $errstr, $errfile, $errline) {
    	throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
    });
    
    // 捕捉undefined function 错误, 抛出异常
    register_shutdown_function(function() {
        if ($error = error_get_last()) {
    		throw new ErrorException($error['message'], 0, $error['type'], $error['file'], $error['line']);
        }
    });
    
    // 统一捕捉异常
    set_exception_handler(function($e) {
    	if ($e instanceof ErrorException) {
    		// 错误抛出的异常
    	} elseif ($e instanceof Exception) {
    		// 真正的异常
    	}
    });
    
    
  • 使用图片的二进制信息,获取图片的类型

    php中,如果只能获取图片的二进制内容,如何获取图片的类型呢?

    当然,除非必不得以,我不会选择通过内容的部分字节来判断类型. 能使用的函数是 getimagesize

    getimagesize 只接收图片地址, 没有地址只有数据, 如果有文件的写权限, 可以通过先写一个临时文件, 然后使用 getimagesize 函数获取图片类型信息.

    还有一种方法, 使用 stream wrapper, 给出我的测试代码, 供大家参考:

  • php根据SplSubject及SplObserver接口实现观察者设计模式

    看到Spl中有这两个Interface, 自己尝试写了一下, 只实现了接口方法. 个人感觉, 适合做消息提醒及日志记录, 或类似于hook机制的插件.

    下面是代码: