ホームページ  >  記事  >  バックエンド開発  >  PHP ソース コードの読み取り: 関数の展開と内包

PHP ソース コードの読み取り: 関数の展開と内包

WBOY
WBOYオリジナル
2016-06-20 12:26:47813ブラウズ

explode関数とimplode関数は主に、パラメータを取得した後に特定の文字に従って文字列を分割したり、結果を変換したりするなど、文字列と配列の間の変換操作に使用されます。配列の文字を使用して文字列出力に結合します。これら 2 つの関数は PHP でよく使用されるため、その原理を理解する必要があります。

explode

array explode ( string $delimiter, string $string, [ , $limit ] )

この関数は、文字列で構成される配列を返します。各要素は、次の文字列で区切られた string の部分文字列です。文字列 $delimiter を境界点として使用します。

パラメータの説明

limit

limit が設定されており、それが正の数の場合、返される配列には最大でもlimit要素と最後の要素が含まれます。この要素には文字列の残りの部分が含まれます。

limit が負の数の場合、最後の -$limit 要素を除くすべての要素を返します。

limit が 0 の場合は 1 として扱われます。

delimiter

delimiter が空の場合、関数は FALSE を返します。区切り文字が文字列内になく、limit が負の数の場合は、空の配列が返されます。

サンプルを実行します

$str = 'hello,world,heiheihei,php';

まず制限が設定されていない場合を見てみましょう

$arr = explode(',', $str);print_r($arr);

limit が正の数の場合、limit は 1 に設定され、最大 1 つの要素が返されます。

$arr = explode(',', $str, 1);print_r($arr);

limit は負の数、limit は -1 で、最後の 1 要素を除くすべての要素が返されます。

$arr = explode(',', $str, -1);print_r($arr);

limit は 0 であり、1 として扱われます。

$arr = explode(',', $str, 0);print_r($arr);

パラメータを受け取り、パラメータが次の場合に処理します。は空です

2. 関数で使用されるローカル変数を作成します

3. 制限値に従って文字列を区切るためにさまざまな関数を呼び出します

爆発のコア実装関数は php_explode 関数です。この関数の実行フローチャートは次のとおりです:

php_explode 関数のコア コード:

if (p2 == NULL) {        // 找不到分隔符,直接返回整个字符串    add_next_index_stringl(return_value, p1, Z_STRLEN_P(str), 1);} else {    do {        // 将p1添加到return_value数组中        add_next_index_stringl(return_value, p1, p2 - p1, 1);        p1 = p2 + Z_STRLEN_P(delim);    } while ((p2 = php_memnstr(p1, Z_STRVAL_P(delim), Z_STRLEN_P(delim), endp)) != NULL &&             --limit > 1);    // 将最后一个值添加到return_value    if (p1 <= endp)        add_next_index_stringl(return_value, p1, endp-p1, 1);}
ソースコードの解釈

sizeof("") == 0

。 sizeof には、

sizeof(typename)sizeof(expression) の 2 つの用途があります。パラメーターが typename、つまり型名の場合、sizeof は、それに対応するオブジェクトのサイズを返します。 type; パラメータが式expressionの場合、sizeofは式の戻り値の型に対応するオブジェクトのサイズを計算します。ここで、"" は式です。sizeof はコンパイル時にコンパイラによって "" に割り当てられる領域を計算します。このとき長さは 1 になります。strlen 関数では計算されません。 制限が設定されていない場合、制限のデフォルト値は LONG_MAX

です。 php.h ファイルでは、LONG_MAX は 2147483647L として定義されています。

実装では、制限が 1 より大きい場合は php_explode

関数が呼び出され、制限が 0 より小さい場合は

php_explode_negative_limit 関数が呼び出されます。制限が 0 に等しい場合は 1 処理として扱われ、この時点で add_index_stringl 関数を呼び出して str を配列 return_value に追加します。 区切り文字を検索する場合、php_memnstr

関数 php_memnstr(Z_STRVAL_P(str), Z_STRVAL_P(delim), Z_STRLEN_P(delim), endp) が呼び出され、php_memnstr は

です。 zend_memnstr のマクロ定義は zend_memnstr に実装されているため、文字区切り文字を見つけるために実際には C の memchr が呼び出されます。 区切り文字の位置を見つけたら、add_next_index_stringl

関数を呼び出して、区切られた文字列を戻り配列に挿入します。

implode

string implode ( string $glue, array $pieces )string implode ( array $pieces )
1 次元配列の値を文字列に変換します

パラメータの説明

implode 関数は 2 つのパラメータ命令を受け取ることができます。さらに、最初のパラメータが配列で 2 番目のパラメータが空の場合、2 番目のパラメータはデフォルト値 '' になります。この機能は、爆発の逆のプロセスとみなすことができます。

もちろん、混乱を避けるために文書化された順序を使用してください。

サンプルを実行します

$arr = array('hello', 'world');
ドキュメント順のパラメータ

$str = implode('-‘, $arr);// 输出"hello-world"
最初のパラメータは配列です

$str = implode($arr); // 输出"helloworld"$str = implode($arr, '-'); // 输出"hello-world"
implode 実行ステップ

1.

2. 2 番目のパラメータが空の場合、最初のパラメータの型が配列であるかどうかを判断します。そうでない場合は、エラーが報告されます。それ以外の場合は、「」を使用して値を接着剤に割り当て、それをコネクタとして使用します。

3. 2 番目のパラメータが空でない場合、最初のパラメータが配列型の場合は 2 番目のパラメータを文字列型に変換し、それ以外の場合は 2 番目のパラメータが配列型の場合は最初のパラメータを変換します。文字列型にします。

4. php_implode 関数を呼び出して文字列を接続します。

implode 関数がパラメータを設定した後、最下層は文字列接続のために php_implode 関数を呼び出します。php_implode 関数の実行フローチャートは次のとおりです。

php_implode 関数のコアコード:

ソース コードの解釈

php_implode は配列の内容を 1 つずつ取得し、各要素の型を決定し、必要なデータ型変換を行った後、smart_str_appendl 関数を呼び出して値を追加します。返された文字列。最後に、文字列の後にターミネータを追加します。これは必要な操作であり、今後のプログラミングでは注意が必要です。

smart_str_appendl は、関数 Smart_str_appendl_ex のマクロ定義であり、memcpy を呼び出して文字列をコピーします。

概要

現時点では、PHP ソース コードで一般的に使用される最適化と関数がさらにあります。これらについては、今後のソース コードの読み取りでゆっくりと説明します。

文体が限られ知識も浅いオリジナル記事です 記事内に間違いがあればご指摘ください。

この記事がお役に立ちましたら、クリックしておすすめしてください、ありがとうございます^_^

最後に、github の PHP ソース コードにさらに詳細な注釈を付けました。興味があれば、見てスターを付けてください。 PHP5.4のソースコードのアノテーション。追加された注釈は、コミット レコードを通じて表示できます。

著者がより良い記事を書くためのヒントを提供します。ありがとうございます!

著者に報酬を与える

著者がより良い記事を書けるようにサポートするためのヒント、ありがとう!

支払い方法を選択してください

著者について: hoohack

働いている人ハードルーキーパーソナルホームページ・私の記事・9・

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。