php 扩展之 – 获取函数参数

前面的一篇文章, 我们知道了怎么创建一个函数, 下面来瞅瞅是怎么获得这个函数的参数的。

来看看php原型

function hello($name) {
  echo "hello " + $name;
}

test.php

 hello('Greed');
PHP_FUNCTION(hello)
{
	char *name;
	int name_len;
	
	/* 获取参数
	   ZEND_NUM_ARGS()  告诉zend engine 要去参数
	   TSRMLS_CC 保障线程安全, 检查返回值是不是 SUCCESS or FAILURE
	   "s"  表示要取得char 类型的参数
	   $name , $name_len  把参数取出放到这里
	   取参数是可变的, 根据参数的个数设定, 如, 表示取三个参数, 第三个是可选的
	   zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz|z", &name, &rxt, &source) 
	   */
	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) {
	    RETURN_NULL();
	}
	
	php_printf("Hello %s ", name);
	
	RETURN_TRUE;
}

是不是简单的。 哦, 什么,对获取参数不是很明白, 好吧, 再来看个例子吧。

看看原型

function hello_add($a, $b, $return_long = false) {

    $sum = (int)$a + (float)$b;

    if ($return_long) {
        return intval($sum);
    } else {
        return floatval($sum);
    }
}

test.php

echo hello_add(12.2, 1.3); 
 echo "\n";
echo hello_add(12.2, 1.3, true);
PHP_FUNCTION(hello_add)
{
    long a;
    double b;
    zend_bool return_long = 0;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ld|b", &a, &b, &return_long) == FAILURE) {
        RETURN_NULL();
    }

    if (return_long) {
        RETURN_LONG(a + b);
    } else {
        RETURN_DOUBLE(a + b);
    }
}

下表说明了字母和类型是怎么对应的了
表: zend_parse_parameters() 字母对应的类型

类型 字母 变量类型
Boolean b zend_bool
Long l long
Double d double
String s char *, int
Resource r zval *
Array a zval *
Object o zval*
zval z zval*

上面可以看到有变量是 zval , 这个是php 的复杂类型。 这个在下来介绍。

Tags: ,

发表评论

电子邮件地址不会被公开。 必填项已用*标注