PHP-CPP开发扩展(三)

PHP-CPP是一个用于开发PHP扩展的C++库。本节讲解PHP函数形参相关的实现。

指定函数参数类型

有时候,我们需要指定函数的形参是数组或者指定的,那么在PHP-CPP里是否可以指定函数的参数类型呢?答案是可以的。

按值传递

示例:

/**
 * User: 公众号: 飞鸿影的博客(fhyblog)
 * Date: 2018/7
 */

#include <phpcpp.h>

void example(Php::Parameters &params)
{
}

extern "C" {
    PHPCPP_EXPORT void *get_module() {
        static Php::Extension myExtension("my_extension", "1.0");
        myExtension.add<example>("example", {
            Php::ByVal("a", Php::Type::Numeric),
            Php::ByVal("b", "ExampleClass"),
            Php::ByVal("c", "OtherClass")
        });
        return myExtension;
    }
}

我们使用Php::ByVal()进行指定函数类型,示例里分别指定为Numeric和自定义类类型。

我们再看一下Php::ByVal()原型:

/**
 *  Constructor
 *  @param  name        Name of the parameter
 *  @param  type        Parameter type
 *  @param  required    Is this parameter required?
 */
ByVal(const char *name, Php::Type type, bool required = true);

第一个参数abc可以视为占位符,内部要用到,不重复即可。
第二个参数支持以下类型:

Php::Type::Null
Php::Type::Numeric
Php::Type::Float
Php::Type::Bool
Php::Type::Array
Php::Type::Object
Php::Type::String
Php::Type::Resource
Php::Type::Constant
Php::Type::ConstantArray
Php::Type::Callable

这些类型其实就是PHP支持的变量类型。

最后一个参数可以用来设置参数是否可选,默认必选。如果将其设置为true,则在没有此参数的情况下调用函数时,PHP将触发错误。

我们以sum_n函数为例:

extension.add<sum_n>("sum_n", {
    Php::ByVal("a", Php::Type::Numeric, true)
});

如果使用的时候不给参数,就会PHP Warning:

PHP Warning:  sum_n() expects at least 1 parameter(s), 0 given in /media/d/work/php-ext/phpcpp/phpcpp_helloworld/test.php on line 4

Php::ByVal()还有一种原型:

/**
 *  Constructor
 *  @param  name        Name of the parameter
 *  @param  classname   Name of the class
 *  @param  nullable    Can it be null?
 *  @param  required    Is this parameter required?
 */
ByVal(const char *name, const char *classname, bool nullable = false, bool required = true);

多了个nullable:是否可以用NULL来代替参数。比如:

extension.add<say_class>("say_class", {
    Php::ByVal("class_name", "Datetime", true, true)
});

这个say_class方法里,我们指定形参为Datetime类型,可以使用NULL替代,参数必选。如果nullable改为false,这时候就必须传指定类型Datetime了。

引用传递

有时候我们需要支持函数直接修改原来的变量值,就需要使用引用的方式传参了。PHP-CPP也提供了Php::ByRef进行支持。

/**
 *  Constructor
 *  @param  name        Name of the parameter
 *  @param  type        Parameter type
 *  @param  required    Is this parameter required?
 */
ByRef(const char *name, Php::Type type, bool required = true);

示例:

/**
 * User: 公众号: 飞鸿影的博客(fhyblog)
 * Date: 2018/7
 */

#include <phpcpp.h>

void swap(Php::Parameters &params)
{
    Php::Value temp = params[0];
    params[0] = params[1];
    params[1] = temp;
}

extern "C" {
    PHPCPP_EXPORT void *get_module() {
        static Php::Extension myExtension("my_extension", "1.0");
        myExtension.add<swap>("swap", {
            Php::ByRef("a", Php::Type::Numeric),
            Php::ByRef("b", Php::Type::Numeric)
        });
        return myExtension;
    }
}

我们使用test.php进行测试:

<?php
// define two variables
$a = 1;
$b = 2;

// 交换变量
swap($a, $b);

// 下面使用错误,仅支持变量引用
//swap(10,20); //会触发PHP Fatal error:  Only variables can be passed by reference

var_dump($a, $b);
?>

(未完待续)

想第一时间获取最新动态,欢迎关注关注飞鸿影的博客(fhyblog),不定期为您呈现技术干货。

posted @ 2018-07-30 08:15 飞鸿影 阅读(...) 评论(...) 编辑 收藏