用C实现PHP扩张类

Jun 13, 2016 am 10:58 AM
height quot width zend

用C实现PHP扩展类

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

    准备实现的类如下:

    

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;	}}
Copier après la connexion


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

1,建立扩展骨架

cd php-5.2.8/ext./ext_skel --extname=class_ext
Copier après la connexion

2,修改编译参数

cd php-5.2.8/ext/class_extvi config.m4
Copier après la connexion
去掉PHP_ARG_ENABLE(class_ext, whether to enable class_ext support,和

[   --enable-class_ext       Enable class_ext support])两行前面的dnl,修改后为:

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])
Copier après la connexion

3,编写C代码

cd php-5.2.8/ext/class_extvi php_class_ext.h#在 PHP_FUNCTION(confirm_class_ext_compiled); 后面增加申明函数;
Copier après la connexion

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);
Copier après la connexion

vi class_ext.c#申明方法的参数,注册到函数表中
Copier après la connexion

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[] */};
Copier après la connexion
#其中ZEND_ACC_CTOR表示构造函数,ZEND_ACC_PUBLIC表示访问权限为PUBLIC。
Copier après la connexion
#接下来,在模块初始化函数中注册并初始化类
Copier après la connexion

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;}
Copier après la connexion
#在文件最后增加类的成员函数的具体实现代码
Copier après la connexion
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 <br><p>4,编译代码</p><p></p><pre name="code" class="php">cd php-5.2.8/ext/class_ext/usr/local/php/bin/phpize./configure --with-php-config=/usr/local/php/bin/php-configmake make install
Copier après la connexion

此时会在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,测试代码

$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);
Copier après la connexion

结果输出:

int(12)int(26)int(12)int(20000)int(100)int(200)
Copier après la connexion

6,Over!







Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Que signifie la largeur du HTML ? Que signifie la largeur du HTML ? Jun 03, 2021 pm 02:15 PM

En HTML5, width signifie width. L'attribut width définit la largeur de la zone de contenu de l'élément. Vous pouvez ajouter des marges intérieures, des bordures et des marges extérieures en dehors de la zone de contenu. élément.

Comment utiliser l'ACL (Access Control List) pour le contrôle des autorisations dans Zend Framework Comment utiliser l'ACL (Access Control List) pour le contrôle des autorisations dans Zend Framework Jul 29, 2023 am 09:24 AM

Comment utiliser l'ACL (AccessControlList) pour le contrôle des autorisations dans Zend Framework Introduction : Dans une application Web, le contrôle des autorisations est une fonction cruciale. Il garantit que les utilisateurs ne peuvent accéder qu'aux pages et fonctionnalités auxquelles ils sont autorisés à accéder et empêche tout accès non autorisé. Le framework Zend fournit un moyen pratique d'implémenter le contrôle des autorisations, en utilisant le composant ACL (AccessControlList). Cet article explique comment utiliser l'ACL dans Zend Framework.

Framework d'implémentation PHP : Tutoriel de mise en route de Zend Framework Framework d'implémentation PHP : Tutoriel de mise en route de Zend Framework Jun 19, 2023 am 08:09 AM

Framework d'implémentation PHP : tutoriel d'introduction à ZendFramework ZendFramework est un framework de site Web open source développé par PHP et actuellement maintenu par ZendTechnologies. ZendFramework adopte le modèle de conception MVC et fournit une série de bibliothèques de code réutilisables pour servir l'implémentation d'applications Web2.0 et Web Serve. ZendFramework est très populaire et respecté par les développeurs PHP et propose une large gamme de

php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 Jun 13, 2016 am 10:23 AM

php提交表单通过后,弹出的对话框怎样在当前页弹出php提交表单通过后,弹出的对话框怎样在当前页弹出而不是在空白页弹出?想实现这样的效果:而不是空白页弹出:------解决方案--------------------如果你的验证用PHP在后端,那么就用Ajax;仅供参考:HTML code

Explication détaillée des propriétés des dimensions CSS : hauteur et largeur Explication détaillée des propriétés des dimensions CSS : hauteur et largeur Oct 21, 2023 pm 12:42 PM

Explication détaillée des propriétés des dimensions CSS : hauteur et largeur Dans le développement front-end, CSS est un puissant langage de définition de style. Parmi eux, la hauteur et la largeur sont les deux attributs de dimension les plus élémentaires, utilisés pour définir la hauteur et la largeur de l'élément. Cet article analysera ces deux propriétés en détail et fournira des exemples de code spécifiques. 1. Attribut Height L'attribut height est utilisé pour définir la hauteur d'un élément. Vous pouvez utiliser le pixel, le pourcentage ou

PHP ne reconnaît pas ZendOptimizer, comment le résoudre ? PHP ne reconnaît pas ZendOptimizer, comment le résoudre ? Mar 19, 2024 pm 01:09 PM

PHP ne reconnaît pas ZendOptimizer, comment le résoudre ? Dans le développement PHP, vous pouvez parfois rencontrer une situation dans laquelle PHP ne peut pas reconnaître ZendOptimizer, ce qui entraînera un mauvais fonctionnement de certains codes PHP. Dans ce cas, nous devons prendre certaines mesures pour résoudre le problème. Certaines solutions de contournement possibles sont décrites ci-dessous, ainsi que des exemples de code spécifiques. 1. Confirmez si ZendOptimizer est installé correctement : Tout d'abord, nous devons confirmer que ZendOptimizer

Comment configurer l'environnement Window2003 IIS+MySQL+PHP+Zend Comment configurer l'environnement Window2003 IIS+MySQL+PHP+Zend Jun 02, 2023 pm 09:56 PM

Le package d'installation de Windows 2003 comprend Zend, PHP5.2.17, PHPWind8.7 et PHPMyadmin3.5.2. Vous pouvez télécharger le package d'installation directement pour gagner du temps dans la recherche de ressources. Cependant, comme MySQL a dépassé la limite de téléchargement, vous devez vous rendre sur le site officiel de MySQL pour télécharger. Ensuite, décompressez et copiez sur le lecteur D, comme indiqué ci-dessous : MySQLinDdisk Installez et configurez WindowsIIS+FTP Cliquez sur Démarrer>Panneau de configuration>Ajouter ou supprimer des programmes.Ajout ou suppression d'un PG Cliquez sur Ajouter/Supprimer des composants Windows (A). Ajout d'une commande

Quelles sont les méthodes pour exprimer la valeur de la largeur en CSS ? Quelles sont les méthodes pour exprimer la valeur de la largeur en CSS ? Nov 13, 2023 pm 05:47 PM

Les méthodes incluent la valeur de pixel, le pourcentage, l'unité em, l'unité rem, l'unité vw/vh, auto, fit-content, min-content, max-content. Introduction détaillée : 1. Valeur du pixel (px) : La valeur du pixel est fixe et sa largeur reste inchangée quelle que soit la façon dont la résolution de l'écran change. Par exemple : width : 300px ; 2. Pourcentage (%) : le pourcentage de largeur est relatif à la largeur de l'élément parent. Par exemple : largeur : 50 % ; 3, unité em, etc.

See all articles