Heim Backend-Entwicklung PHP-Tutorial 用C实现PHP扩展类的步骤_PHP教程

用C实现PHP扩展类的步骤_PHP教程

Jul 14, 2016 am 10:06 AM
php 实现 开发 扩展 Ja 步骤 verwenden von 简单 语言

   前面简单介绍了用C语言实现PHP扩展的步骤,见用C开发PHP扩展的步骤,那个是扩展一个函数,这里讲述一下如何用C扩展类。

    准备实现的类如下:

   

[php] 
class Rectangle{ 
    private $_width; 
    private $_height; 
    public function __construct($width, $height){ 
        $this->_width = $width; 
        $this->_height = $height; 
    } 
    public function clone(){ 
        return new Rectangle($this->_width, $this->_height); 
    } 
    public function setWidth($width){ 
        $this->_width = $width; 
    } 
    public function setHeight($height){ 
        $this->_height = $height; 
    } 
    public function getWidth(){ 
        return $this->_width; 
    } 
    public function getHeight(){ 
        return $this->_height; 
    } 
    public function getArea(){ 
        return $this->_width * $this->_height; 
    } 
    public function getCircle(){ 
        return ($this->_width + $this->_height) * 2; 
    } 

实现类扩展的步骤如下:(首先下载PHP源码,这里使用的是php-5.2.8)

1,建立扩展骨架

[php] 
cd php-5.2.8/ext 
./ext_skel --extname=class_ext 

2,修改编译参数
[php] 
cd php-5.2.8/ext/class_ext 
vi config.m4 
去掉PHP_ARG_ENABLE(class_ext, whether to enable class_ext support,和
[   --enable-class_ext       Enable class_ext support])两行前面的dnl,修改后为:


[php]
dnl Otherwise use enable:   
PHP_ARG_ENABLE(class_ext, whether to enable class_ext support,   
dnl Make sure that the comment is aligned:   
[  --enable-class_ext           Enable class_ext support]) 

3,编写C代码

[php] 
cd php-5.2.8/ext/class_ext 
vi php_class_ext.h 
#在 PHP_FUNCTION(confirm_class_ext_compiled); 后面增加申明函数; 

[php] 
PHP_METHOD(Rectangle,__construct); 
PHP_METHOD(Rectangle,clone); 
PHP_METHOD(Rectangle,setWidth); 
PHP_METHOD(Rectangle,setHeight); 
PHP_METHOD(Rectangle,getWidth); 
PHP_METHOD(Rectangle,getHeight); 
PHP_METHOD(Rectangle,getArea); 
PHP_METHDO(Rectangle,getCircle); 

[php] 
vi class_ext.c 
#申明方法的参数,注册到函数表中 

[php] 
ZEND_BEGIN_ARG_INFO(arg_construct,2) 
ZEND_ARG_INFO(0, width) 
ZEND_ARG_INFO(0, height) 
ZEND_END_ARG_INFO() 
 
ZEND_BEGIN_ARG_INFO(arg_set_width,1) 
ZEND_ARG_INFO(0, width) 
ZEND_END_ARG_INFO() 
 
ZEND_BEGIN_ARG_INFO(arg_set_height,1) 
ZEND_ARG_INFO(0, height) 
ZEND_END_ARG_INFO() 
 
const zend_function_entry class_ext_functions[] = { 
    PHP_FE(confirm_class_ext_compiled, NULL) 
    PHP_ME(Rectangle, __construct, arg_construct, ZEND_ACC_CTOR|ZEND_ACC_PUBLIC) 
    PHP_ME(Rectangle, clone, NULL, ZEND_ACC_PUBLIC) 
    PHP_ME(Rectangle, setWidth, NULL, ZEND_ACC_PUBLIC) 
    PHP_ME(Rectangle, setHeight, NULL, ZEND_ACC_PUBLIC) 
    PHP_ME(Rectangle, getWidth, NULL, ZEND_ACC_PUBLIC) 
    PHP_ME(Rectangle, getHeight, NULL, ZEND_ACC_PUBLIC) 
    PHP_ME(Rectangle, getArea, NULL, ZEND_ACC_PUBLIC) 
    PHP_ME(Rectangle, getCircle, NULL, ZEND_ACC_PUBLIC) 
    {NULL, NULL, NULL}  /* Must be the last line in class_ext_functions[] */ 
}; 
[php] 
#其中ZEND_ACC_CTOR表示构造函数,ZEND_ACC_PUBLIC表示访问权限为PUBLIC。 
[php] 
#接下来,在模块初始化函数中注册并初始化类 

[php] 
zend_class_entry *Rectangle_ce; //zend内部类结构变量 
PHP_MINIT_FUNCTION(class_ext) 

    zend_class_entry Rectangle; 
    INIT_CLASS_ENTRY(Rectanble, "Rectangle", class_ext_functions); //第二个参数为类名,第三个参数为类的函数列表 
    Rectangle_ce = zend_register_internal_class_ex(&Rectangle, NULL, NULL TSRMLS_CC); //注册类 
    zend_declare_property_null(Rectangle_ce, ZEND_STRL("_width"), ZEND_ACC_PRIVATE TSRMLS_CC); //初始化类的属性_width 
    zend_declare_property_null(Rectangle_ce, ZEND_STRL("_height"), ZEND_ACC_PRIVATE TSRMLS_CC);  //初始化类的属性_height 
    return SUCCESS; 

[php] 
#在文件最后增加类的成员函数的具体实现代码 
[php] 
PHP_METHOD(Rectangle, __construct) 

    long width,height; 
    if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &width, &height) == FAILURE){ //获取构造函数的两个函数参数_width和_height 
        WRONG_PARAM_COUNT; 
    } 
    if( width         width = 1; //如果_width为0,则赋默认值1 
    } 
    if( height         height = 1; //如果_height为0,则赋默认值1 
    } 
    zend_update_property_long(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("_width"), width TSRMLS_CC); //更新类成员变量_width的值 
    zend_update_property_long(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("_height"), height TSRMLS_CC);  //更新类成员变量_height的值 
    RETURN_TRUE; 

 
PHP_METHOD(Rectangle, clone) 

    zval *clone_obj; 
    zval *width,*height; 
    MAKE_STD_ZVAL(clone_obj); 
    object_init_ex(clone_obj, Rectangle_ce); //初始化对象,对象所属的类为Rectangle_ce 
    width = zend_read_property(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("_width"), 0 TSRMLS_CC); //获取类成员变量_width的值 
    height = zend_read_property(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("_height"), 0 TSRMLS_CC); //获取类成员变量_height的值 
    zend_update_property_long(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("_width"), width TSRMLS_CC); //更新Rectangle_ce类对象clone_obj的属性值_width 
    zend_update_property_long(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("_height"), height TSRMLS_CC); //更新Rectangle_ce类对象clone_obj的属性值_height 
    RETURN_ZVAL(clone_obj, 1, 0);  //返回该对象 

 
PHP_METHOD(Rectangle, setWidth() 

    long width; 
    if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &width) == FAILURE){ 
        WRONG_PARAM_COUNT; 
    } 
    if( width         width = 1; 
    } 
    zend_update_property_long(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("_width"), width TSRMLS_CC); //更新类成员变量_width的值 
    RETURN_TRUE; 

 
PHP_METHOD(Rectangle, setHeight() 

    long height; 
    if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &height) == FAILURE){ 
        WRONG_PARAM_COUNT; 
    } 
    if( height         height = 1; 
    } 
    zend_update_property_long(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("_height"), height TSRMLS_CC); //更新类成员变量_height的值 
    RETURN_TRUE; 

 
PHP_METHOD(Rectangle, getWidth) 

    zval *zWidth; 
    long width; 
    zWidth = zend_read_property(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("_width"), 0 TSRMLS_CC); //获取类成员变量_width的值 
    width = Z_LVAL_P(zWidth); 
    RETURN_LONG(width); 

 
PHP_METHOD(Rectangle, getHeight) 

    zval *zHeight; 
    long height; 
    zHeight = zend_read_property(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("_height"), 0 TSRMLS_CC); 
    height = Z_LVAL_P(zHeight); 
    RETURN_LONG(height); 

 
PHP_METHOD(Rectangle, getArea) 

    zval *zWidth,*zHeight; 
    long width,height,area; 
    zWidth = zend_read_property(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("_width"), 0 TSRMLS_CC); 
    zHeight = zend_read_property(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("_height"), 0 TSRMLS_CC); 
    width = Z_LVAL_P(zWidth); 
    height = Z_LVAL_P(zHeight); 
    area = width * height; 
    RETURN_LONG(area); 

 
PHP_METHOD(Rectangle, getCircle) 

    zval *zWidth,*zHeight; 
    long width,height,circle; 
    zWidth = zend_read_property(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("_width"), 0 TSRMLS_CC); 
    zHeight = zend_read_property(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("_height"), 0 TSRMLS_CC); 
    width = Z_LVAL_P(zWidth); 
    height = Z_LVAL_P(zHeight); 
    circle = (width + height) * 2; 
    RETURN_LONG(circle); 

4,编译代码

[php] 
cd php-5.2.8/ext/class_ext 
/usr/local/php/bin/phpize 
./configure --with-php-config=/usr/local/php/bin/php-config 
make  
make install 

此时会在php的安装路径下产生一个so文件,比如
/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/class_ext.so

修改php.ini 添加扩展extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/"
[class_ext]
extension = class_ext.so
5,测试代码

[php] 
$width = -10; 
$height = 12; 
$rectangle = new Rectangle($width, $height); 
$area = $rectangle->getArea(); 
var_dump($area); 
$circle = $rectangle->getCircle(); 
var_dump($circle); 
$clone = $rectangle->clone(); 
$_area = $clone->getArea(); 
var_dump($_area); 
$clone->setWidth(100); 
$clone->setHeight(200); 
$_area = $clone->getArea(); 
var_dump($_area); 
$width = $clone->getWidth(); 
var_dump($width); 
$height = $clone->getHeight(); 
var_dump($height); 

结果输出:
[php] 
int(12) 
int(26) 
int(12) 
int(20000) 
int(100) 
int(200) 

 

 

 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/477917.htmlTechArticle前面简单介绍了用C语言实现PHP扩展的步骤,见用C开发PHP扩展的步骤,那个是扩展一个函数,这里讲述一下如何用C扩展类。 准备实现的类如...
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

CakePHP-Projektkonfiguration CakePHP-Projektkonfiguration Sep 10, 2024 pm 05:25 PM

In diesem Kapitel werden wir die Umgebungsvariablen, die allgemeine Konfiguration, die Datenbankkonfiguration und die E-Mail-Konfiguration in CakePHP verstehen.

PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 bringt mehrere neue Funktionen, Sicherheitsverbesserungen und Leistungsverbesserungen mit einer beträchtlichen Menge an veralteten und entfernten Funktionen. In dieser Anleitung wird erklärt, wie Sie PHP 8.4 installieren oder auf PHP 8.4 auf Ubuntu, Debian oder deren Derivaten aktualisieren. Obwohl es möglich ist, PHP aus dem Quellcode zu kompilieren, ist die Installation aus einem APT-Repository wie unten erläutert oft schneller und sicherer, da diese Repositorys in Zukunft die neuesten Fehlerbehebungen und Sicherheitsupdates bereitstellen.

CakePHP Datum und Uhrzeit CakePHP Datum und Uhrzeit Sep 10, 2024 pm 05:27 PM

Um in cakephp4 mit Datum und Uhrzeit zu arbeiten, verwenden wir die verfügbare FrozenTime-Klasse.

CakePHP-Datei hochladen CakePHP-Datei hochladen Sep 10, 2024 pm 05:27 PM

Um am Datei-Upload zu arbeiten, verwenden wir den Formular-Helfer. Hier ist ein Beispiel für den Datei-Upload.

CakePHP-Routing CakePHP-Routing Sep 10, 2024 pm 05:25 PM

In diesem Kapitel lernen wir die folgenden Themen im Zusammenhang mit dem Routing kennen.

Besprechen Sie CakePHP Besprechen Sie CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP ist ein Open-Source-Framework für PHP. Es soll die Entwicklung, Bereitstellung und Wartung von Anwendungen erheblich vereinfachen. CakePHP basiert auf einer MVC-ähnlichen Architektur, die sowohl leistungsstark als auch leicht zu verstehen ist. Modelle, Ansichten und Controller gu

CakePHP arbeitet mit Datenbank CakePHP arbeitet mit Datenbank Sep 10, 2024 pm 05:25 PM

Das Arbeiten mit der Datenbank in CakePHP ist sehr einfach. In diesem Kapitel werden wir die CRUD-Operationen (Erstellen, Lesen, Aktualisieren, Löschen) verstehen.

CakePHP erstellt Validatoren CakePHP erstellt Validatoren Sep 10, 2024 pm 05:26 PM

Der Validator kann durch Hinzufügen der folgenden zwei Zeilen im Controller erstellt werden.

See all articles