实现PHP执行每个静态方法前,先执行一段公共代码

最近在封装Redis的操作类,想要实现Redis::setHash()这样的调用,但是在调用这个静态方法前,要先连接Redis:$redis->connect('127.0.0.1', 6379);,本来想把这个代码写在构造方法里,但是一想不对,调用PHP的静态方法时没有实例化对象,是不走构造方法的。最终使用了__callStaticcall_user_func_array这两个函数实现。

代码如下:
RedisDb.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class RedisDb
{
private static $instance = null;
protected static $redis = null;
protected static $expire_time = 10;

public static function __callStatic($method,$param_arr){

if (is_null(self::$instance)) {
self::$redis = new \Redis();
self::$redis->connect('127.0.0.1',6379);
self::$instance = new RedisUtil();
}

return call_user_func_array([self::$instance,$method], $param_arr);
}

}

RedisUtil.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class RedisUtil extends RedisDb
{
//要声明为protected,否则不会触发__callStatic
protected static function setHash($key, $data)
{
foreach ($data as $field => $value) {
self::$redis->hset($key, $field, $value);
}
self::$redis->EXPIRE($key, self::$expire_time);
}

protected static function getHash($key)
{
return self::$redis->hgetall($key);
}
}

参考:
call_user_func_array 动态调用方法
PHP类中在所有方法被调用前执行一段代码
魔术方法之__call__callStatic方法