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

xiaoxiao2021-02-27  471

前言

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

C语言C++ php-cppZephir 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 };

不要用define和defined,关于常量的使用,可以参考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 ….”,连出错原因和出错位置都没有。

转载请注明原文地址: https://www.6miu.com/read-316.html

最新回复(0)