Skip to content

修改文档文案,添加类的入门文档 #8

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 89 additions & 1 deletion source/manual/0.0.1/oopfeaturesupportentry/simpleclassdefine.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,92 @@ layout: manual
subtype: normal
title: 原生类定义详细文档
---
努力书写中,敬请期待 ...
php跟c++都支持面向对象特性,但是c++定义的类并不能完全的被php调用,而zendAPI就解决了这个问题。
PS:本章采用php官网文档[类与对象](http://php.net/manual/zh/language.oop5.php)章节一样的示例来演示zendAPI对php面向对象特性的全面支持
#### 简单类定义
本示例为一个简单的类SimpleClass,类包含一个属性var,和一个返回var属性值的方法getVar
##### php实现类定义
```php
<?php
class SimpleClass
{
// property declaration
public $var = 'a default value';

// method declaration
public function displayVar() {
echo $this->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");
// 注册属性 后面会详细讲解属性定义
simpleClass.registerProperty("var", "a default value");
// 注册函数 后面会详细讲解函数定义
simpleClass.registerMethod<decltype(&SimpleClass::getVar), &SimpleClass::getVar>
("getVar");
// 注册类到扩展
hellozapi.registerClass(simpleClass);
return hellozapi;
}
```
##### SimpleClass测试
```
<?php
$a = new SimpleClass();
echo $a->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);
});
}
```
更加详细的内容可以看项目源码。
下一篇我们会详细讲解类属性的定义,欢迎大家进一步阅读。
4 changes: 2 additions & 2 deletions source/manual/0.0.1/zendapidesignentry/vocabularydesc.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ title: zendAPI 相关术语解释文档
### 通用术语解释
#### PHP
如果单纯的说`PHP`我个人认为`PHP`应该由以下部分组成:
1.`PHP`语言规范
2.`Zend Engine`虚拟机
1. `PHP`语言规范
2. `Zend Engine`虚拟机
3. 为`PHP`提供特定功能的各种扩展

#### PHP 语言规范
Expand Down
4 changes: 2 additions & 2 deletions source/manual/0.0.1/zendapidesignentry/zendapiinitcycle.md
Original file line number Diff line number Diff line change
Expand Up @@ -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);`
每次请求结束的时候会调用这个函数指针所指的回调函数。
Expand All @@ -90,7 +90,7 @@ std::map<int, Extension *> mid2extension; // line number 58
```
`name2extension`提供按照模块的名称查找对应的扩展对象指针的功能
`mid2extension`提供按照模块的编号查找对应的扩展对象指针的功能
我们为什么需要这两个全局变量呢?应为在`PHP`的生命周期回调函数里面传递的参数中之后模块的标号,为了方便我们在项目中查找对应的模块,所以引入了这两个全局变量。
我们为什么需要这两个全局变量呢?应为在`PHP`的生命周期回调函数里面传递的参数中包含模块的标号,为了方便我们在项目中查找对应的模块,所以引入了这两个全局变量。
*特别说明:这种全局标量的方式可能不是线程安全的,在多线程环境下对其进行操作可能会有问题,我们会在以后的版本中进行优化。*
```cpp
Extension::Extension(const char *name, const char *version, int apiVersion)
Expand Down