团队使用的开发框架现在已经基于composer,并使用composer的classloader来进行文件的自动加载,但composer生成后的loader是需要在php 5.3以上才能运行。

为了加大框架的适应性,并可以不改变composer ClassLoader 的使用方式。修改了一下composer 的ClassLoader,适用于 php 5.2.x。

在调用 /vendor/autoload.php 的时候判断一下php版本,载入不同的autoload.php,编写自己的autoload.php进行 /vendor/composer/autoload_namespaces.php, /vendor/composer/autoload_classmap.php 两个文件的载入并返回修改过的loader对象。

下面是代码:

网站上线的时候,有时需要临时停掉其他人的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();

结果为:

网站开发中,需要针对异常和错误的捕捉,来帮助程序开发者进行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, 给出我的测试代码, 供大家参考: