发布于2026-07-21 阅读(0)
扫一扫,手机访问
目前写PHP扩展,主流路线大概有三条:纯C语言、C++结合php-cpp库,还有Zephir。Zephir虽然门槛低,但本质上是先翻译成C再编译,Phalcon框架就是用它写出来的,性能不错。
Zephir语法跟PHP很像,但毕竟不是同一门语言,来回切换就像CPU频繁切换进程一样,多少有点开销。而且用Zephir写应用虽然也行,但万一老板或同事不同意,或者服务器不是Linux,扩展编译不顺手,那就尴尬了。
所以我就写了个工具——php2zep,能把大部分PHP语法自动转成Zephir。这样一来,用PHP写扩展的门槛就降下来了。只要编码风格规范,很多现有PHP代码都能直接转换,甚至整个应用都能以扩展形式发布,既提升响应速度,又能保护源码。
关于使用示例,可以参考该项目的README文档。
当然,为了方便解析,代码规范上得有些要求,其中一部分是从Zephir继承来的。
每个类一个文件,文件名与类名相同,类必须处于命名空间中,命名空间与目录结构一致。这部分和Zephir的要求一致,唯一不同的是,命名空间可以用小写形式,如app/controllers,而Zephir要求首字母大写,程序会自动转换成App/Controllers。
非本应用中的类需要用反斜杠开头,比如引用PHP的Exception类要用\Exception。
同一个代码块的开始与结束必须要有相同的缩进。例如:
function func() {
while($a>10) {
$a--;
} // 这里的闭合大括号必须要跟与之配对的"while"相同的缩进
} // 这里的闭合大括号必须要跟与之配对的"function"相同的缩进
函数的形参要与function关键字处于同一行。不要在字符串里用这种形式的写法 "$a is $b",要改成用.连接:$a . " is " . $b。
其实这些要求并不难做到。
当然不是所有的PHP语法都支持。有些限制是因为Zephir不支持导致的,有些是因为php2zep还没实现这种转换。
函数参数不支持引用传递:
function func(&$a) { //错误, &$a这种写法Zephir还不支持
...
}
闭包不支持通过use来引入外部环境的变量:
return function($x) use ($other) { // 错误,不支持闭包中的use
...
};
不要用define和defined,关于常量的使用,可以参考Android中Ja va的做法,把常量定义到一个类中。
暂不支持list($a,$b)=$arr这种写法 【最新版本已经支持 @2017-05-04】。
不要用这种赋值方式:
$this->field->attr = 10; // 不支持。可以这样 $theField = $this->field; $theField->attr = 10
条件判断中,以下写法不支持:
if (!$this->field) { // 不支持,括号内须改为 !($this->field)...
}
if ($this->field != 10) { // 改成这样 ($this->field) != 10...
}
Zephir虽好,但有个让人抓狂的缺点:编译扩展时错误信息少得可怜,一句“Can not parse file ….”就把你打发了,连哪儿出错、什么原因都不给。
上一篇:删除php+安装 php
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8