[ PHP 内核与扩展开发系列] 类与面向对象:接口实现与类的继承

定义接口 定义一个接口还是很方便的,我先给出一个 PHP 语言中的实现: <?php interface i_myinterface { public function hello(); } 其在扩展中的实现是这样的: zend_class_entry *i_myinterface_ce; static zend_function_entry i_myinterface_metho…

基于 Laravel + Vue.js 开发的全新社交系统 —— ThinkSNS+

什么是ThinkSNS+ ThinkSNS(简称TS)始于2008年,一款全平台综合性社交系统,为国内外大中小企业和创业者提供社会化软件研发及技术解决方案,目前最新版本为ThinkSNS+。新的产品名字叫做 +也就是 Plus ,因为 ThinkSNS 的历史原因,我们已经无法升级 TP 框架,随后花了一年进行 Laravel 化,但是过程中很艰辛,最终我们发现系统中存在太多的问题。于是…

[ PHP 内核与扩展开发系列] 类与面向对象:如何定义一个类

zend_class_entry zend_class_entry 是内核中定义的一个结构体,是内核实现 PHP 语言中类与对象的一个非常基础、关键的结构类型,相当于我们定义类的原型。如果我们想获得一个名字为 myclass 的类该怎么做呢?首先我们定义一个 zend_class_entry 变量,并为它设置名字,最后注册到 runtime 中去: zend_class_entry *m…

[ PHP 内核与扩展开发系列] PHP 中的资源类型:持久资源

通常情况下,像资源这类复合类型的数据都会占用大量的硬件资源,比如内存、CPU以及网络带宽。对于使用频率超级高的数据库连接,我们可以获取一个长连接,使其不会在脚本结束后自动销毁,一旦创建便可以在各个请求中直接使用,从而减少每次创建它的消耗。MySQL 的长连接在 PHP 内核中其实就是一种持久资源。 内存分配 前面的章节里我们接触了 emalloc() 之类的以 e 开头的内存管理函数,通…

[ PHP 内核与扩展开发系列] PHP 中的资源类型:复合数据类型 —— 资源

截止到现在,我们已经熟悉了 PHP 语言中的字符串、数字、布尔以及数组等数据类型了,接下来,我们将接触另外一种 PHP 独特的数据类型——资源(Resource)。 讲述之前,先描述下资源类型在内核中的结构: typedef struct _zend_rsrc_list_entry { void *ptr; int type; int refcount; } zend_rsrc_list…

[ PHP 内核与扩展开发系列] Array 与 HashTable:在内核中操作数组

当你在扩展中使用 HashTable 时候,大部分情况下是要存储用户端的变量,就像 PHP 语言中数组那样。为此,内核中已经准备好了相应的工具,来让我们更加的方便的操作 HashTable 存储 zval*,也就是 PHP 语言中的数组,即 IS_ARRAY 常量代表的 zval,以下用 {数组} 来代替 PHP 语言中的数组这个词。 创建数组 创建 HashTable 有些繁琐,虽然有…

[ PHP 内核与扩展开发系列] Array 与 HashTable:操作 HashTable 的 API

Zend 把与 HashTable 有关的 API 分成了好几类以便于我们查找,这些 API 的返回值大多都是常量SUCCESS 或者 FAILURE。 初始化 HashTable 下面在介绍函数原型的时候都使用了 ht,但是我们在编写扩展的时候,一定不要使用这个名称,因为一些 PHP 宏展开后会声明这个名称的变量,进而引发命名冲突。 创建并初始化一个 HashTable 非常简单,只要…

[ PHP 内核与扩展开发系列] Array 与 HashTable:数组与链表

我们在评选各种数据结构时,往往会考虑我们需要处理的数据规模以及需要的性能。下面让我们简要的看一看 C 语言中的数组和链表。 数组 作者这里用的不是 Array,而是 Vector,可能指的是 C++ 里的 Vector,它与数组几乎是完全一样的,唯一的不同便是可以实现动态存储。本节下文都是用数组一词代替之,请各位注意。数组是内存中一块连续的区域,其每一个元素都具有一个唯一的下标值。 in…

[ PHP 内核与扩展开发系列] 函数的参数:arginfo 与类型绑定

在前面的章节中我们已经介绍过 arginfo 了,下面我们看一下如何通过其实现类型绑定,但这个特性只能在 Zend Engine 2 也就是 PHP 5 中使用。 让我们再回顾一下 arginfo 的结构,每一个 arginfo 结构的声明都是通过 ZEND_BEGIN_ARG_INFO() 或者 ZEND_BEGIN_ARG_INFO_EX() 宏函数开始的,然后紧跟着几行 ZEND_…

[ PHP 内核与扩展开发系列] 函数的参数:zend_parse_paramenters

基本参数 最简单的获取函数调用者传递过来的参数便是使用 zend_parse_parameters() 函数。 zend_parse_parameters() 函数的前几个参数我们直接用内核里的宏来生成便可以了,形式为:ZEND_NUM_ARGS() TSRMLS_CC,注意两者之间有个空格,但是没有逗号。从名字可以看出,ZEND_NUM_ARGS() 代表着参数的个数。紧接着需要传递给…