• 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),不定期为您呈现技术干货。

  • 相关阅读:
    Python_离线包下载地址
    JMeter_简单控制线程组(Thread Group)组件的执行顺序
    Python_pkgutil.walk_packages_查询包下所有文件
    Grafana_数据可视化工具
    Python_dir+getattr_获取模块下所有属性对象
    Jmeter_BeanShell Assertion自定义断言
    python连接数据库及使用
    python题目
    div 内容超出部分隐藏
    在C#类库中使用App.config文件自定义配置
  • 原文地址:https://www.cnblogs.com/52fhy/p/9351842.html
Copyright © 2020-2023  润新知