ホームページ  >  記事  >  バックエンド開発  >  C_PHP チュートリアルで PHP 拡張クラスを実装する手順

C_PHP チュートリアルで PHP 拡張クラスを実装する手順

WBOY
WBOYオリジナル
2016-07-14 10:06:48799ブラウズ

C 言語を使用して PHP 拡張機能を実装する手順は、C を使用して PHP 拡張機能を開発する手順を参照してください。ここでは、C を使用してクラスを拡張する方法を説明します。

実装するクラスは以下の通りです。

[php]
クラス長方形{
プライベート $_width
プライベート $_高さ
パブリック関数 __construct($width, $height){
$this->_width = $width; $this->_height = $height; }
パブリック関数 clone(){
新しい Rectangle($this->_width, $this->_height) を返します
}
パブリック関数 setWidth($width){
$this->_width = $width; }
パブリック関数 setHeight($height){
$this->_height = $height; }
パブリック関数 getWidth(){
戻り $this->_width
}
パブリック関数 getHeight(){
$this->_height を返す
}
パブリック関数 getArea(){
戻り $this->_width * $this->_height; }
パブリック関数 getCircle(){
戻り値 ($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、class_ext サポートを有効にするかどうか、および

を削除します) [ --enable-class_ext class_ext サポートを有効にする]) 2 行の前の dnl は次のように変更されます:



[php]
dnl それ以外の場合は、enable を使用します:
PHP_ARG_ENABLE(class_ext, class_ext サポートを有効にするかどうか,
dnl コメントが揃っていることを確認してください:

[ --enable-class_ext class_ext サポートを有効にする])


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(長方形,__construct); PHP_METHOD(長方形、クローン); PHP_METHOD(長方形,setWidth); PHP_METHOD(長方形,setHeight); PHP_METHOD(長方形,getWidth); PHP_METHOD(長方形,getHeight); PHP_METHOD(長方形,getArea); PHP_METHDO(Rectangle,getCircle)

[php]
vi class_ext.c

#メソッドのパラメータを宣言して関数テーブルに登録します

[php]
ZEND_BEGIN_ARG_INFO(arg_construct,2)
ZEND_ARG_INFO(0, 幅)
ZEND_ARG_INFO(0, 高さ)
ZEND_END_ARG_INFO()
 
ZEND_BEGIN_ARG_INFO(arg_set_width,1)
ZEND_ARG_INFO(0, 幅)
ZEND_END_ARG_INFO()
 
ZEND_BEGIN_ARG_INFO(arg_set_height,1)
ZEND_ARG_INFO(0, 高さ)
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(長方形、クローン、NULL、ZEND_ACC_PUBLIC)
    PHP_ME(Rectangle, setWidth, NULL, ZEND_ACC_PUBLIC)
    PHP_ME(長方形、setHeight、NULL、ZEND_ACC_PUBLIC)
    PHP_ME(Rectangle、getWidth、NULL、ZEND_ACC_PUBLIC)
    PHP_ME(長方形、getHeight、NULL、ZEND_ACC_PUBLIC)
    PHP_ME(Rectangle、getArea、NULL、ZEND_ACC_PUBLIC)
    PHP_ME(Rectangle、getCircle、NULL、ZEND_ACC_PUBLIC)
    {NULL, NULL, NULL} /* class_ext_functions[] の最後の行である必要があります */
}; 
[php]
#ただし、ZEND_ACC_CTOR は構築関数を示し、ZEND_ACC_PUBLIC は制限が PUBLIC であることを示します。 [php]
#次来,在模块初期化関数数中注册并初期化类

[php]
zend_class_entry *Rectangle_ce; //zend 内部クラス構造変数
PHP_MINIT_FUNCTION(クラス拡張子)
{
zend_class_entry 長方形
INIT_CLASS_ENTRY(Rectanble, "Rectangle", class_ext_functions); // 2 番目のパラメータはクラス名、3 番目のパラメータはクラスの関数リストです
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 のプロパティを初期化します
成功を返します
}
[php]
#クラスメンバー関数の具体的な実装コードをファイルの最後に追加します
[php]
PHP_METHOD(Rectangle, __construct)
{
長い幅、高さ
If(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &width, &height) == FAILURE){ //コンストラクターの 2 つの関数パラメーター _width と _height を取得します
間違ったPARAM_COUNT
}
If( 幅 width = 1; // _width が 0 の場合、デフォルト値 1 を割り当てます
}
If( 高さ 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(長方形、クローン)
{
zval *クローン_obj
zval *幅,*高さ
MAKE_STD_ZVAL(クローン_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()
{
長い幅
If(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &width) == FAILURE){
間違ったPARAM_COUNT
}
If( 幅 幅 = 1; }
zend_update_property_long(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("_width"), width TSRMLS_CC); // クラスメンバー変数 _width の値を更新します
RETURN_TRUE
}

PHP_METHOD(Rectangle, setHeight()
{
長い身長
If(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &height) == FAILURE){
間違ったPARAM_COUNT
}
If( 高さ 高さ = 1; }
zend_update_property_long(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("_height"), height TSRMLS_CC) //クラスメンバー変数 _height の値を更新します
RETURN_TRUE
}

PHP_METHOD(Rectangle, getWidth)
{
    zval *z幅; 
    長い幅。 
    zWidth = zend_read_property(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("_width"), 0 TSRMLS_CC); //获取类成员变量_widthの值
    幅 = Z_LVAL_P(zWidth); 
    RETURN_LONG(幅); 
}
 
PHP_METHOD(Rectangle, getHeight)
{
    zval *z高さ; 
    長い身長。 
    zHeight = zend_read_property(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("_height"), 0 TSRMLS_CC); 
    高さ = Z_LVAL_P(z高さ); 
    RETURN_LONG(高さ); 
}
 
PHP_METHOD(Rectangle, getArea)
{
    zval *z幅、*z高さ; 
    長い幅、高さ、面積。 
    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); 
    幅 = Z_LVAL_P(zWidth); 
    高さ = Z_LVAL_P(z高さ); 
    面積 = 幅 * 高さ; 
    RETURN_LONG(エリア); 
}
 
PHP_METHOD(Rectangle, getCircle)
{
    zval *z幅、*z高さ; 
    長い幅、高さ、円。 
    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); 
    幅 = Z_LVAL_P(zWidth); 
    高さ = Z_LVAL_P(z高さ); 
    円 = (幅 + 高さ) * 2; 
    RETURN_LONG(丸); 
}

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
作る
インストールを行う

今回は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.so
5、测试代

[php]

$width = -10; 
$高さ = 12; 
$rectangle = 新しい 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)

http://www.bkjia.com/PHPjc/477917.htmlwww.bkjia.com本当http://www.bkjia.com/PHPjc/477917.html技術記事前に、C で PHP 展開を実行する手順を示しました。C で PHP 展開を開始する手順 (展開の 1 つです) については、以下で C 展開の種類を説明します。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。