PHP 開発入門 1

WBOY
リリース: 2016-06-23 13:06:59
オリジナル
1011 人が閲覧しました

私はいつも PHP 拡張機能の開発を学びたいと思っていました。大量の C コードを見るたびに、どこから始めればよいのかわからないように感じます。かつて、Hello World を開発するためにそれを使用しました。しかし、まだよくわかりません。

最近、ランダムな文字列を生成するメソッドが必要です。ネイティブ PHP の生成は少し遅いと感じます (主な理由は、拡張機能の作成を学習できたら試してみたいからです)。そこで、zehphir を使用して拡張機能を作成しました。

さあ、アッシ。速度は純正より遅いです。以前に zephir もテストしたことがありますが、PHP ネイティブ関数が呼び出されないと、何度も速度が低下するようです。したがって、ゼフィールを学習したい場合は、ゼフィールをコード暗号化方法として扱う必要があります。

そこで、C の使用を考えてみましょう。では、どうやって開発すればよいのでしょうか?

Baidu、Google などで多くのチュートリアルを見つけることができます。多くの人は、最初に def ファイルを作成すると言います。初めて作ったときにこの方法で作りました。しかし、今回はdefの書き方のチュートリアルが見つかりませんでした。そこでチュートリアルを探しました。

最終的に、拡張機能を作成するには、主に定義を追加したり、いくつかの場所に関数を追加したりする必要があることがわかりました。もちろん、これは単なる単純な機能です。クラスを開発する方法はまだわかりません。情報を持っている友人がいくつか提供してくれるでしょう。

まず、ext_skelは拡張コードを生成します。

./ext_skel --extname=phpext
ログイン後にコピー

次に、phpext ディレクトリに入ると、php_phpext.h と phpext.c が表示されます。次に、まず php_phpext.h を開いて次のコードを見つけます

PHP_MINFO_FUNCTION(phpext);
ログイン後にコピー

以下に追加したい関数を追加します。関数名は英語の文字列でカスタマイズする必要があります

PHP_FUNCTION(函数名称)
ログイン後にコピー

次に、phpext.c を開いて次のコードを見つけますコード。これは PHP エントリ関数です。どのような関数があるかを PHP に伝える必要があります。

const zend_function_entry ukey_functions[] = {}
ログイン後にコピー

追加した PHP 関数の名前を入力してください

 PHP_FE(函数名称, NULL)
ログイン後にコピー

次のステップは、トリックを拡大することです。関数の機能を追加します。関数

PHP_FUNCTION(函数名称){//这里填写功能if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &length) == FAILURE) //这里获取一个整形的  参数 。length需要前面定义,这里获取到的参数赋值给length{    RETURN_NULL();//返回null  }}
ログイン後にコピー


PHP 組み込みの return 関数

#define RETVAL_RESOURCE(l)				ZVAL_RESOURCE(return_value, l)#define RETVAL_BOOL(b)					ZVAL_BOOL(return_value, b)#define RETVAL_NULL() 					ZVAL_NULL(return_value)#define RETVAL_LONG(l) 					ZVAL_LONG(return_value, l)#define RETVAL_DOUBLE(d) 				ZVAL_DOUBLE(return_value, d)#define RETVAL_STRING(s, duplicate) 		ZVAL_STRING(return_value, s, duplicate)#define RETVAL_STRINGL(s, l, duplicate) 	ZVAL_STRINGL(return_value, s, l, duplicate)#define RETVAL_EMPTY_STRING() 			ZVAL_EMPTY_STRING(return_value)#define RETVAL_ZVAL(zv, copy, dtor)		ZVAL_ZVAL(return_value, zv, copy, dtor)#define RETVAL_FALSE  					ZVAL_BOOL(return_value, 0)#define RETVAL_TRUE   					ZVAL_BOOL(return_value, 1)#define RETURN_RESOURCE(l) 				{ RETVAL_RESOURCE(l); return; }#define RETURN_BOOL(b) 					{ RETVAL_BOOL(b); return; }#define RETURN_NULL() 					{ RETVAL_NULL(); return;}#define RETURN_LONG(l) 					{ RETVAL_LONG(l); return; }#define RETURN_DOUBLE(d) 				{ RETVAL_DOUBLE(d); return; }#define RETURN_STRING(s, duplicate) 	{ RETVAL_STRING(s, duplicate); return; }#define RETURN_STRINGL(s, l, duplicate) { RETVAL_STRINGL(s, l, duplicate); return; }#define RETURN_EMPTY_STRING() 			{ RETVAL_EMPTY_STRING(); return; }#define RETURN_ZVAL(zv, copy, dtor)		{ RETVAL_ZVAL(zv, copy, dtor); return; }#define RETURN_FALSE  					{ RETVAL_FALSE; return; }#define RETURN_TRUE   					{ RETVAL_TRUE; return; }
ログイン後にコピー

PHP でパラメータを受け取り、フォーマットする関数

b	Booleanl	Integer 整型d	Floating point 浮点型s	String 字符串r	Resource 资源a	Array 数组o	Object instance 对象O	Object instance of a specified type 特定类型的对象z	Non-specific zval 任意类型~Z	zval**类型f	表示函数、方法名称,PHP5.1里貌似木有... .
ログイン後にコピー


を phpext.c の最後に追加します。
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート