用PHP写PHP扩展-Another way writing php extensions

来源:互联网 发布:工厂erp软件 编辑:程序博客网 时间:2024/06/06 03:18

前言

目前写PHP扩展主要有三种方法:

  • C语言
  • C++ php-cpp
  • Zephir Zephir

其中Zephir其实也是先翻译成C语言,然后再编译成扩展的。用Zephir 编写的Phalcon,就是以PHP扩展形式发布的一个全栈式MVC框架。

Zephir与PHP在语法上很相似,不过还是有些差别。在不同语言间频繁切换,正如CPU频繁切换进程/线程一样,有一定的开销。虽然用Zephir写应用也没问题,可是又得兼顾不用扩展的情况(要是老板或同事不同意呢,或者非linux系统,编译成扩展不方便)。

于是自己写了个php到Zephir转换的工具,见github: php2zep,可以将大部分PHP语法转换成Zephir语法。这样,用PHP也可以开发PHP扩展了,而且,如果对编码风格做些规范,很多PHP代码都可以转换成Zephir代码,不符合规范的也可以通过其他方式转化,从而将PHP应用以扩展形式发布,既能提高应用响应速度,也可以保护源代码。

关于使用示例,可以参考该项目的README.md。

代码规范

当然为了方便解析,对代码规范有些要求。有些规范是从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};
  • 不要用definedefined,关于常量的使用,可以参考Android中Java的做法,把常量定义到一个类中。

  • 暂不支持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虽然强大,不过有一个确点令人很抓狂:用Zephir编译扩展时,错误信息提示太少了,出错了就一句 “Can not parse file ….”,连出错原因和出错位置都没有。

0 0