php发展

首页 » 常识 » 常识 » PHP7扩展开发篇二函数的传参与返回
TUhjnbcbe - 2021/3/18 18:08:00
前言

这次,我们将演示如何在PHP扩展中接受传入的参数和输出返回值。

?php

functiondefault_value($type,$value=null)

{

if($type=="int"){return$value??0;}elseif($type=="bool"){return$value??false;}elseif($type=="str"){returnis_null($value)?"":$value;}returnnull;}var_dump(default_value("int"));var_dump(default_value("int",1));var_dump(default_value("bool"));var_dump(default_value("bool",true));var_dump(default_value("str"));var_dump(default_value("str","a"));var_dump(default_value("array"));?

我们将在扩展中实现`default_value`方法。

代码基础代码

这个扩展,我们将在say扩展上增加default_value方法。say扩展相关代码大家请看这篇博文。PHP7扩展开发之helloword文中已经详细介绍了如何创建一个扩展和提供了源码下载。

实现default_value方法

default_value方法的PHP扩展源码:

21222PHP_FUNCTION(default_value){zend_string*type;zval*value=NULL;#ifndefFAST_ZPP/*Getfunctionparametersanddoerror-checking.*/if(zend_parse_parameters(ZEND_NUM_ARGS(),"S

z",type,value)==FAILURE){return;}#elseZEND_PARSE_PARAMETERS_START(1,2)Z_PARAM_STR(type)Z_PARAM_OPTIONALZ_PARAM_ZVAL_EX(value,0,1)ZEND_PARSE_PARAMETERS_END();#endifif(ZSTR_LEN(type)==3strncmp(ZSTR_VAL(type),"int",3)==0value==NULL){RETURN_LONG(0);}elseif(ZSTR_LEN(type)==3strncmp(ZSTR_VAL(type),"int",3)==0value!=NULL){RETURN_ZVAL(value,0,1);}elseif(ZSTR_LEN(type)==4strncmp(ZSTR_VAL(type),"bool",4)==0value==NULL){RETURN_FALSE;}elseif(ZSTR_LEN(type)==4strncmp(ZSTR_VAL(type),"bool",4)==0value!=NULL){RETURN_ZVAL(value,0,1);}elseif(ZSTR_LEN(type)==3strncmp(ZSTR_VAL(type),"str",3)==0value==NULL){RETURN_EMPTY_STRING();}elseif(ZSTR_LEN(type)==3strncmp(ZSTR_VAL(type),"str",3)==0value!=NULL){RETURN_ZVAL(value,0,1);}RETURN_NULL();}代码说明获取参数

在PHP7中提供了两种获取参数的方法。zend_parse_parameters和FASTZPP方式。

zend_parse_parameters

在PHP7之前一直使用zend_parse_parameters函数获取参数。这个函数的作用,就是把传入的参数转换为PHP内核中相应的类型,方便在PHP扩展中使用。参数说明:第一个参数,参数个数。一般就使用ZEND_NUM_ARGS(),不需要改变。第二个参数,格式化字符串。这个格式化字符串的作用就是,指定传入参数与PHP内核类型的转换关系。

代码中S

z的含义就是:S表示参数是一个字符串。要把传入的参数转换为zend_string类型。

表示之后的参数是可选。可以传,也可以不传。z表示参数是多种类型。要把传入的参数转换为zval类型。

除此之外,还有一些specifier,需要注意:!如果接收了一个PHP语言里的null变量,则直接把其转成C语言里的NULL,而不是封装成IS_NULL类型的zval。/如果传递过来的变量与别的变量共用一个zval,而且不是引用,则进行强制分离,新的zval的is_ref__gc==0,andrefcount__gc==1.

更多格式化字符串的含义可以查看官方网站。

1
查看完整版本: PHP7扩展开发篇二函数的传参与返回