首頁 後端開發 php教程 用C实现PHP扩张类

用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;	}}
登入後複製


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

1,建立扩展骨架

cd php-5.2.8/ext./ext_skel --extname=class_ext
登入後複製

2,修改编译参数

cd php-5.2.8/ext/class_extvi config.m4
登入後複製
去掉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])
登入後複製

3,编写C代码

cd php-5.2.8/ext/class_extvi php_class_ext.h#在 PHP_FUNCTION(confirm_class_ext_compiled); 后面增加申明函数;
登入後複製

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);
登入後複製

vi class_ext.c#申明方法的参数,注册到函数表中
登入後複製

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

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_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
登入後複製

此时会在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);
登入後複製

结果输出:

int(12)int(26)int(12)int(20000)int(100)int(200)
登入後複製

6,Over!







本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

html的width是什麼意思 html的width是什麼意思 Jun 03, 2021 pm 02:15 PM

在html5中,width的意思是寬度,width屬性定義元素內容區的寬度,在內容區外面可以增加內邊距、邊框和外邊距,只需要給元素設定「元素{width:數值}」即可。

如何在Zend框架中使用ACL(Access Control List)進行權限控制 如何在Zend框架中使用ACL(Access Control List)進行權限控制 Jul 29, 2023 am 09:24 AM

如何在Zend框架中使用ACL(AccessControlList)進行權限控制導言:在一個Web應用程式中,權限控制是至關重要的功能。它可以確保使用者只能存取其有權存取的頁面和功能,並防止未經授權的存取。 Zend框架提供了一種方便的方法來實現權限控制,即使用ACL(AccessControlList)元件。本文將介紹如何在Zend框架中使用ACL

PHP實作框架:Zend Framework入門教程 PHP實作框架:Zend Framework入門教程 Jun 19, 2023 am 08:09 AM

PHP實作框架:ZendFramework入門教學ZendFramework是PHP開發的開源網站框架,目前由ZendTechnologies維護,ZendFramework採用了MVC設計模式,提供了一系列可重複使用的程式碼庫,服務於實作Web2.0應用程式和Web服務。 ZendFramework深受PHP開發者的歡迎與推崇,擁有廣泛

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

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

CSS 維度屬性詳解:height 與 width CSS 維度屬性詳解:height 與 width Oct 21, 2023 pm 12:42 PM

CSS維度屬性詳解:height和width在前端開發中,CSS是一種強大的樣式定義語言。其中,height和width是兩個最基本的維度屬性,用來定義元素的高度和寬度。本文將對這兩個屬性進行詳細解析,並提供具體的程式碼範例。一、height屬性height屬性用來定義元素的高度。可以使用像素(pixel)、百分比(percentage)或

PHP無法辨識ZendOptimizer,如何解決? PHP無法辨識ZendOptimizer,如何解決? Mar 19, 2024 pm 01:09 PM

PHP無法辨識ZendOptimizer,如何解決?在PHP開發中,有時可能會遇到PHP無法辨識ZendOptimizer的情況,這會導致部分PHP程式碼無法正常運作。在這種情況下,我們需要採取一些措施來解決這個問題。以下將介紹一些可能的解決方法,並附上具體的程式碼範例。 1.確認ZendOptimizer是否正確安裝:首先,我們需要確認ZendOptimize

Window2003 IIS+MySQL+PHP+Zend環境如何配置 Window2003 IIS+MySQL+PHP+Zend環境如何配置 Jun 02, 2023 pm 09:56 PM

  Windows2003安裝包包含了Zend,PHP5.2.17,PHPWind8.7和PHPMyadmin3.5.2,您可以直接下載安裝包,節約搜尋資源的時間。  但是,由於MySQL超出了上傳限制,您需要另行前往MySQL官網下載。然後解壓縮拷貝到D碟,如下圖:  MySQLinDdisk  安裝與設定WindowsIIS+FTP  點選開始>控制台>新增或移除程式。  AddingordeletingaPG  點選新增/移除Windows元件(A)。  Addingorde

css表示width值有哪些方法 css表示width值有哪些方法 Nov 13, 2023 pm 05:47 PM

方法有像素值、百分比、em單位、rem單位、vw/vh單位、auto、fit-content、min-content、max-content。詳細介紹:1、像素值(px):像素值是固定的,無論螢幕解析度如何變化,它的寬度都是不變的。例如:width: 300px;2、百分比(%):百分比寬度是相對於父元素的寬度的。例如:width: 50%;3、em單位等等。

See all articles