Skip to content

Commit 2cbed40

Browse files
committed
update
1 parent 14375a1 commit 2cbed40

File tree

1 file changed

+5
-8
lines changed

1 file changed

+5
-8
lines changed

3/function_implement.md

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,13 @@ function my_func(){
1111
汇编中函数对应的是一组独立的汇编指令,然后通过call指令实现函数的调用,前面已经说过PHP编译的结果是opcode数组,与汇编指令对应,PHP用户自定义函数的实现就是将函数编译为独立的opcode数组,调用时分配独立的执行栈依次执行opcode,所以自定义函数对于zend而言并没有什么特别之处,只是将opcode进行了打包封装,实际PHP脚本中函数之外的指令整个可以认为是一个函数(或者理解为main函数更直观)。
1212

1313
```php
14-
<?php
1514
/* function main(){ */
1615

1716
$a = 123;
1817
echo $a;
1918

2019
/* } */
21-
?>
20+
```
2221

2322
下面具体看下PHP中函数的结构:
2423

@@ -69,7 +68,7 @@ Zend引擎中定义了很多内部函数供用户在PHP中使用,比如:defi
6968

7069
#### 3.2.2.1 内部函数结构
7170
上一节介绍`zend_function`为union,其中`internal_function`就是内部函数用到的,具体结构:
72-
```
71+
```c
7372
//zend_complie.h
7473
typedef struct _zend_internal_function {
7574
/* Common elements */
@@ -127,13 +126,11 @@ PHP_MINIT_FUNCTION(xxxxxx)
127126
```
128127
接着编译、安装扩展,测试:
129128
```php
130-
<?php
131129
qp_test();
132-
?>
133-
134-
结果输出:
135-
call internal function 'qp_test'
136130
```
131+
结果输出:
132+
`call internal function 'qp_test'`
133+
137134
这样一个内部函数就定义完成了。这里有一个地方需要注意的我们把这个函数注册到__CG(function_table)__中去了,而不是__EG(function_table)__,这是因为在`php_request_startup`阶段会把__CG(function_table)__赋值给__EG(function_table)__
138135

139136
上面的过程看着比较简单,但是在实际应用中不要这样做,PHP提供给我们一套标准的定义方式,接下来看下如何在扩展中按照官方方式提供一个内部函数。

0 commit comments

Comments
 (0)