Home  >  Article  >  Backend Development  >  PHP extension development: developing our own interface class

PHP extension development: developing our own interface class

不言
不言Original
2018-04-13 16:23:161739browse

The content of this article is to share with you the development of PHP extensions and the development of our own interface classes. It has a certain reference value. Friends in need can refer to it

PHP extensions are a must for advanced PHP programmers One of the skills to understand is that for a beginning PHP extension developer, how can he develop a mature extension and enter the advanced field of PHP development? This series of development tutorials will take you step by step from entry to advanced stages.
This tutorial series is developed under Linux (centos is recommended), the PHP version is 5.6, and it is assumed that you have certain Linux operating experience and C/C foundation.
If you have any questions and need to communicate, please join the QQ technical exchange group 32550793 to communicate with me.

The previous chapter demonstrated how to export ordinary functions in PHP extensions. This chapter introduces how to export classes in extensions. Enables PHP to directly access C classes in extensions in scripts.

1. How to export C class in PHP extension

The following is an extended skeleton code developed using PHP-CPP. Compilation can export a demonstration C class.

The source code of the project can be found on github. You can use the git client or open the URL to package and download.

# git clone https://github.com/elvisszhang/phpcpp_counter.git

Now our class name is Counter, the syntax for registering the class in the extension is like this

Php::Class7291a602fab93c84dabbc8532a6a1d6e counter("Counter");

There is a function called increment in the Counter class, and the following syntax tells the extension to allow the php script to access this function.

counter.method78b504f69415d8c8003c96fef61971c4 ("increment");

The C source code of main.cpp is as follows.

#include <phpcpp.h>
#include <time.h>

//扩展的导出类 Counter
class Counter : public Php::Base
{
private:
    int _value = 0;
public:
    Counter() = default;
    virtual ~Counter() = default;
    //类的普通成员函数
    Php::Value increment() { return ++_value; }
    Php::Value decrement() { return --_value; }
    Php::Value value() const { return _value; }
    //类的静态成员函数
    static Php::Value gettime() {return time();}
};

//告诉编译器get_module是个纯C函数
extern "C" {
    //get_module是扩展的入口函数
    PHPCPP_EXPORT void *get_module() {
        static Php::Extension myExtension("counter", "1.0.0");
        
        //初始化导出类
        Php::Class<Counter> counter("Counter");
        
        //注册导出类的可访问普通函数
        counter.method<&Counter::increment> ("increment");
        counter.method<&Counter::decrement> ("decrement");
        counter.method<&Counter::value> ("value");
        
        //注册导出类的可访问静态函数
        counter.method<&Counter::gettime>("gettime");

        //注册导出类,使用右值引用方式,优化资源使用
        myExtension.add(std::move(counter));
        
        //返回扩展对象指针
        return myExtension;
    }
}

The PHP test code corresponding to the above example is as follows.

<?php
$counter = new Counter;
echo &#39;result of increment() = &#39;. $counter->increment() . PHP_EOL;
echo &#39;result of increment() = &#39;. $counter->increment() . PHP_EOL;
echo &#39;result of decrement() = &#39;. $counter->decrement() . PHP_EOL;
echo &#39;result of value() = &#39;. $counter->value() . PHP_EOL;
echo &#39;result of gettime() = &#39;. Counter::gettime() . PHP_EOL;
?>

The output information after running the above php code is as follows.

result of increment() = 1
result of increment() = 2
result of decrement() = 1
result of value() = 1
result of gettime() = 1523363778

2. Styles supported by ordinary functions of extension classes

Functions of extension classes must be written according to certain specifications, and the names and types of return values ​​and parameters are all specified. Otherwise it will not be recognized by the PHP script.

The most common are the following four function styles. The styles of ordinary functions in the previous chapter are actually similar. The usage of return values ​​and parameters are exactly the same, so I won’t go into details.

// signatures of supported regular methods
void        YourClass::example1();
void        YourClass::example2(Php::Parameters &params);
Php::Value  YourClass::example3();
Php::Value  YourClass::example4(Php::Parameters &params);

In addition, if the function has the modifier const. There are also 4 different styles below.

void        YourClass::example5() const;
void        YourClass::example6(Php::Parameters &params) const;
Php::Value  YourClass::example7() const;
Php::Value  YourClass::example8(Php::Parameters &params) const;

3. References

PHP-CPP Help: classes-and-objects


PHP extension is a must for advanced PHP programmers One of the skills to understand is that for a beginning PHP extension developer, how can he develop a mature extension and enter the advanced field of PHP development? This series of development tutorials will take you step by step from entry to advanced stages.
This tutorial series is developed under Linux (centos is recommended), the PHP version is 5.6, and it is assumed that you have certain Linux operating experience and C/C foundation.
If you have any questions and need to communicate, please join the QQ technical exchange group 32550793 to communicate with me.


The previous chapter demonstrated how to export ordinary functions in PHP extensions. This chapter introduces how to export classes in extensions. Enables PHP to directly access C classes in extensions in scripts.

Related recommendations:

Comparison and introduction of related development technologies for PHP extension development

Writing the first extension for PHP extension development hello world

PHP extension development to develop our own mathematical function library


The above is the detailed content of PHP extension development: developing our own interface class. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn