Skip to content

Commit 5a53c46

Browse files
committed
update
1 parent 8ca6e50 commit 5a53c46

File tree

1 file changed

+40
-3
lines changed

1 file changed

+40
-3
lines changed

7/func.md

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -275,12 +275,49 @@ break;
275275
>
276276
> 2、"h"与"H"当传参为数组时同样没有差别,当传参为对象时,"H"将把对象的成员参数数组解析到目标变量,"h"将报错
277277
278-
__(3)对象__
278+
__(6)对象:o、O__
279279

280-
__(4)资源__
280+
如果参数是一个对象则可以通过"o"、"O"将其解析到目标变量,注意:只能解析为zval*,无法解析为zend_object*
281+
```c
282+
zval *obj;
283+
284+
if(zend_parse_parameters(ZEND_NUM_ARGS(), "o", &obj) == FAILURE){
285+
...
286+
}
287+
```
288+
"O"是要求解析指定类或其子类的对象,类似传参时显式的声明了参数类型的用法:`function my_func(MyClass $obj){...}`,如果参数不是指定类的实例化对象则无法解析。
289+
290+
"o!"、"O!"与字符串用法相同。
291+
292+
__(7)资源:r__
293+
294+
如果参数为资源则可以通过"r"获取其zval的地址,但是无法直接解析到zend_resource的地址,与对象相同。
295+
```c
296+
zval *res;
297+
298+
if(zend_parse_parameters(ZEND_NUM_ARGS(), "r", &res) == FAILURE){
299+
...
300+
}
301+
```
302+
"r!"与字符串用法相同。
303+
304+
__(8)类:C__
305+
306+
如果参数是一个类则可以通过"C"解析出zend_class_entry地址:`function my_func(stdClass){...}`,这里有个地方比较特殊,解析到的变量可以设定为一个类,这种情况下解析时将会找到的类与指定的类之间的父子关系,只有存在父子关系才能解析,如果只是想根据参数获取类型的zend_class_entry地址,记得将解析到的地址初始化为NULL,否则将会不可预料的错误。
307+
```c
308+
zend_class_entry *ce = NULL; //初始为NULL
309+
310+
if(zend_parse_parameters(ZEND_NUM_ARGS(), "C", &ce) == FAILURE){
311+
RETURN_FALSE;
312+
}
313+
```
314+
__(9)通用解析:z__
315+
316+
"z"表示按参数实际类型解析,比如参数为字符串就解析为字符串,参数为数组就解析为数组,这种实际就是将zend_execute_data上的参数地址拷贝到目的变量了,没有做任何转化。
281317

318+
"z!"与字符串用法相同。
282319

283-
__(6)其它标识符__
320+
__(10)其它标识符__
284321

285322
#### 7.6.1.3 函数返回值
286323

0 commit comments

Comments
 (0)