diff --git a/source/manual/0.0.1/oopfeaturesupportentry/simpleclassdefine.md b/source/manual/0.0.1/oopfeaturesupportentry/simpleclassdefine.md index ea1cdb4..9fb180a 100644 --- a/source/manual/0.0.1/oopfeaturesupportentry/simpleclassdefine.md +++ b/source/manual/0.0.1/oopfeaturesupportentry/simpleclassdefine.md @@ -3,4 +3,92 @@ layout: manual subtype: normal title: 原生类定义详细文档 --- -努力书写中,敬请期待 ... \ No newline at end of file +php跟c++都支持面向对象特性,但是c++定义的类并不能完全的被php调用,而zendAPI就解决了这个问题。 +PS:本章采用php官网文档[类与对象](http://php.net/manual/zh/language.oop5.php)章节一样的示例来演示zendAPI对php面向对象特性的全面支持 +#### 简单类定义 +本示例为一个简单的类SimpleClass,类包含一个属性var,和一个返回var属性值的方法getVar +##### php实现类定义 +```php +var; + } +} +?> +``` +##### zendApi实现 +zendAPI实现php类定义分为两步 +1. 定义一个继承`zapi::lang::StdClass`的类`SimpleClass` +2. 定义扩展对象,并通过`zapi::lang::Class`注册定义的类`SimpleClass`中需要暴露给php的属性和方法到扩展 + +```cpp +#include "zapi/ZendApi.h" +#include "zapi/lang/Type.h" +#include "simpleClass.h" + +using zapi::lang::Class; +using zapi::ds::StringVariant; + +class SimpleClass : public zapi::lang::StdClass +{ +public: + StringVariant var = "a default value"; + StringVariant getVar() + { + return this->var; + } +}; + +extern "C" { + +ZAPI_DECL_EXPORT void *get_module() +{ + // 定义扩展 + static zapi::lang::Extension hellozapi("hellozapi", "1.0"); + Class simpleClass("SimpleClass"); + // 注册属性 后面会详细讲解属性定义 + simpleClass.registerProperty("var", "a default value"); + // 注册函数 后面会详细讲解函数定义 + simpleClass.registerMethod + ("getVar"); + // 注册类到扩展 + hellozapi.registerClass(simpleClass); + return hellozapi; +} +``` +##### SimpleClass测试 +``` +getVar(); // 输出 "a default value" +?> +``` +#### 类定义实现原理 +php加载扩展模块的时候会调用回调函数`module_startup_func`,而类的注册就是在这个阶段。 +在[初始化流程详情](http://www.zendapi.org/manual/0.0.1/zendapidesignentry/zendapiinitcycle.html)中已经讲解过,zendAPI开发模块的`module_startup_func`即为如下函数 +```cpp +// line numer 429, src/lang/Extension.cpp +int ExtensionPrivate::processStartup(INIT_FUNC_ARGS) +{ + ZEND_INIT_MODULE_GLOBALS(zapi, init_globals, nullptr); + Extension *extension = find_module(module_number); + return BOOL2SUCCESS(extension->initialize(module_number)); +} +``` +上面的`extension->initialize(module_number)`最终会调用如下代码,注册所有的类 +``` + // line number 514, src/lang/Extension.cpp + // here we register all global classes and interfaces + iterateClasses([moduleNumber](AbstractClass &cls) { + cls.initialize(moduleNumber); + }); +} +``` +更加详细的内容可以看项目源码。 +下一篇我们会详细讲解类属性的定义,欢迎大家进一步阅读。 diff --git a/source/manual/0.0.1/zendapidesignentry/vocabularydesc.md b/source/manual/0.0.1/zendapidesignentry/vocabularydesc.md index f76694d..65eca8c 100644 --- a/source/manual/0.0.1/zendapidesignentry/vocabularydesc.md +++ b/source/manual/0.0.1/zendapidesignentry/vocabularydesc.md @@ -8,8 +8,8 @@ title: zendAPI 相关术语解释文档 ### 通用术语解释 #### PHP 如果单纯的说`PHP`我个人认为`PHP`应该由以下部分组成: -1.`PHP`语言规范 -2.`Zend Engine`虚拟机 +1. `PHP`语言规范 +2. `Zend Engine`虚拟机 3. 为`PHP`提供特定功能的各种扩展 #### PHP 语言规范 diff --git a/source/manual/0.0.1/zendapidesignentry/zendapiinitcycle.md b/source/manual/0.0.1/zendapidesignentry/zendapiinitcycle.md index 87a0ae3..67634d0 100644 --- a/source/manual/0.0.1/zendapidesignentry/zendapiinitcycle.md +++ b/source/manual/0.0.1/zendapidesignentry/zendapiinitcycle.md @@ -77,7 +77,7 @@ title: zendAPI 初始化流程详解 开始加载扩展的时候会调用这个函数指针所指的回调函数。 2. `int (*module_shutdown_func)(SHUTDOWN_FUNC_ARGS);` 扩展被卸载的时候会调用这个函数指针所指的回调函数。 -3. `int (*request_shutdown_func)(SHUTDOWN_FUNC_ARGS);` +3. `int (*request_startup_func)(INIT_FUNC_ARGS);` 每次请求开始的时候会调用这个函数指针所指的回调函数。 4. `int (*request_shutdown_func)(SHUTDOWN_FUNC_ARGS);` 每次请求结束的时候会调用这个函数指针所指的回调函数。 @@ -90,7 +90,7 @@ std::map mid2extension; // line number 58 ``` `name2extension`提供按照模块的名称查找对应的扩展对象指针的功能 `mid2extension`提供按照模块的编号查找对应的扩展对象指针的功能 -我们为什么需要这两个全局变量呢?应为在`PHP`的生命周期回调函数里面传递的参数中之后模块的标号,为了方便我们在项目中查找对应的模块,所以引入了这两个全局变量。 +我们为什么需要这两个全局变量呢?应为在`PHP`的生命周期回调函数里面传递的参数中包含模块的标号,为了方便我们在项目中查找对应的模块,所以引入了这两个全局变量。 *特别说明:这种全局标量的方式可能不是线程安全的,在多线程环境下对其进行操作可能会有问题,我们会在以后的版本中进行优化。* ```cpp Extension::Extension(const char *name, const char *version, int apiVersion)