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

前言

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

其中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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值