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

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

Jul 14, 2016 am 10:06 AM
php 成し遂げる 開発する 拡大する はい ステップ 使用 単純 親切 言語

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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

CakePHP プロジェクトの構成 CakePHP プロジェクトの構成 Sep 10, 2024 pm 05:25 PM

この章では、CakePHP の環境変数、一般設定、データベース設定、電子メール設定について理解します。

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP の日付と時刻 CakePHP の日付と時刻 Sep 10, 2024 pm 05:27 PM

Cakephp4 で日付と時刻を操作するには、利用可能な FrozenTime クラスを利用します。

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP ルーティング CakePHP ルーティング Sep 10, 2024 pm 05:25 PM

この章では、ルーティングに関連する次のトピックを学習します。

CakePHP について話し合う CakePHP について話し合う Sep 10, 2024 pm 05:28 PM

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

CakePHP データベースの操作 CakePHP データベースの操作 Sep 10, 2024 pm 05:25 PM

CakePHP でデータベースを操作するのは非常に簡単です。この章では、CRUD (作成、読み取り、更新、削除) 操作について理解します。

CakePHP バリデータの作成 CakePHP バリデータの作成 Sep 10, 2024 pm 05:26 PM

Validator は、コントローラーに次の 2 行を追加することで作成できます。

See all articles