用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};
不要用
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 ….”,连出错原因和出错位置都没有。
- 用PHP写PHP扩展-Another way writing php extensions
- php extensions
- 用C++写php扩展
- 写一个PHP扩展
- c++ 写 php 扩展
- PHP扩展开发-为什么用C写PHP
- 用c写PHP的扩展接口
- 用C语言写PHP扩展
- 用C语言写PHP扩展
- 用C语言写PHP扩展
- 用C语言写PHP扩展
- 用C语言写PHP扩展 linux
- 用C语言写PHP扩展
- 用C语言写php扩展
- 用C语言写PHP扩展
- 《扩展和嵌入python解释器》1.11 用C++写Python扩展(Writing Extensions in C++)
- PHP Extensions官方解释
- Other Basic PHP Extensions
- selinux
- @Resource和@Autowired区别
- 架构思考
- iostat
- AI的部分方法
- 用PHP写PHP扩展-Another way writing php extensions
- HDU
- 回调函数和发消息的作用比较
- 在android studio的虚拟机的sd卡上创建文件夹
- php项目学习
- HTML第一天
- UOJ 111 & BZOJ 4070 [Apio2015]雅加达的摩天楼
- OrangeUI之ListView的简单介绍
- 自定义Dialog(详细)