多少次我们无醉不欢
咒骂人生太短 唏嘘相见恨晚
让女人把妆哭花了 也不管李宗盛--《山丘》
多少次我们无醉不欢
咒骂人生太短 唏嘘相见恨晚
让女人把妆哭花了 也不管李宗盛--《山丘》
多少往事填在心頭
夜雨觸發這景致 令我憂愁
望見她的身影已無法佔有
我未有想過絕望看她走
在扩展中我们常常会对 zval 进行类型转换,常用的方法可以 convert_to_*
,但是这套函数需要声明临时 zval 来保存结果,对于仅仅需要获取标量转换结果的话有点麻烦了,在 zend_operators.h
中可以找到一些简单的获取转换结果的方法。
1 2 3 4 5 6 7 8 9 10 11 |
// 判断 zval 是否布尔型 true 值 int zend_is_true(zval *op); // 获取 zval 转换 zend_long 型值 zend_long zval_get_long(zval *op); // 获取 zval 转换 double 型值 double zval_get_double(zval *op); // 获取 zval 转换 zend_string 型值 zend_string * zval_get_string(zval *op); // 注意获取到的 zend_string * 需要正确调用 zend_string_release 释放内存 |
今天在写 Azalea\SqlBuilder 过程中,遇到一个类实现接口方法时,传入参数数量可能与接口虚方法不一致的情况,CASE:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
interface SqlBuilderQueryInterface { public function query($sql); } class Mysql implements SqlBuilderQueryInterface { public function query($sql, $foo, $bar) // 这样写会报 Fatal Error public function query($sql, $foo = null, $bar = null) // 这样写才能保证参数表兼容接口方法 { // ... } } |
在扩展中,上例接口方法的 arg_info
定义也不需包含后面的可变参数,不然实现方法也需要定义为 ($sql, ...$args)
1 2 3 4 5 6 7 8 |
// arg_info 定义,只需定义一个参数 ZEND_BEGIN_ARG_INFO_EX(arginfo_interface_query, 0, 0, 1) ZEND_ARG_INFO(0, sql) // 后面的可变参数不需要定义 ZEND_ARG_VARIADIC_INFO ZEND_END_ARG_INFO() // 在 methods 定义中 PHP_ABSTRACT_ME(azalea_interface, query, arginfo_interface_query) |
find ./ -name '.DS_Store' -type f -delete
git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"
git filter-branch -f --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch test.tar.gz' --tag-name-filter cat -- --all
git push origin master -f
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now
我最亲爱的
你过的怎么样
没我的日子
你别来无恙林夕--《我最亲爱的》