PHPプログラミングでは、配列を走査する際に、最初に終了の判定条件として配列の長さを計算する必要があることがよくあります。 PHP では配列の操作が非常に複雑になることが多いため、count 関数の具体的な実装を見てみましょう。
github の PHP ソース コードにさらに詳細な注釈を付けています。興味があれば、見てスターを付けてください。 PHP5.4のソースコードのアノテーション。追加されたアノテーションは、コミット レコードを通じて確認できます。
カウント
count 関数は、配列またはオブジェクト内のすべての要素の数をカウントします。
オブジェクトの場合、SPL 拡張機能をインストールすると、Countable インターフェイスを実装して count 関数を呼び出すことができます。 Countable インターフェイスには、count() 関数の戻り値を返すメソッド Countable::count() が 1 つだけあります。
パラメータの説明
モード
パラメータモードが COUNT_RECURSIVE (または 1) に設定されている場合、count() は配列を再帰的に計算します。多次元配列を計算する場合に特に便利です。
最初のパラメータが配列または Countable インターフェイスを実装するオブジェクトでない場合、count 関数は 1 を返します。
注: count 関数は無限ループを回避するために再帰を検出できますが、無限再帰が発生したり、予想より大きな値を取得したりすると、E_WARNING プロンプトが返されます。
サンプルを実行する
通常のアプリケーション
リーリー多次元配列
リーリー
数値と文字列
通常のオブジェクト
配列のようなオブジェクト
Countableインターフェイスオブジェクトを実装する
ステップを実行
switch ステートメントを入力してパラメータの型を検出します
NULLの場合は直接0を返します
配列の場合は、php_count_recursive関数を呼び出して、配列要素の数を自動的に選択します
オブジェクトの場合は、まず配列状のオブジェクトかどうかを確認し、そうであれば配列オブジェクトの数を計算します。
それ以外の場合、オブジェクトが Countable インターフェイスを実装している場合は、Countable の count メソッドを呼び出します最後に、整数配列や文字列などの他の型は 1 を返します。
ソースコード解釈
通常の配列の場合、count 関数は php_count_recursive 関数を呼び出してその関数を実装します。実行手順は次のとおりです。現在のハッシュバケットが再帰的にアクセスされた回数が 1 より大きい場合、再帰が繰り返されたことを意味し、E_WARNING エラーが返されます
それ以外の場合は、現在の配列レベルの配列要素の数を計算します
再帰パラメータオプションがある場合は、再帰アクセスを続行します
パラメータがオブジェクト型の場合、実装はまずハンドラーが定義されているかどうかを判断します。ハンドラーは PHP カーネル内のオブジェクトの構造であり、実際には関数である count_elements フィールドが含まれています。オブジェクトが配列のように動作する場合 (一般に配列様オブジェクトとして知られています)、 count_elements 関数が実行されます。具体的な実装では、クラスが PHP の ArrayObject を継承し、クラス内に count 関数を実装します。その具体的な呼び出しは、クラスが count 関数を実装していない場合は 0 を返し、それ以外の場合はオブジェクトの count 関数の戻り値を返します。が返されます。
他のデータ型の場合 1.文字列
2. 数字
3. オブジェクトブランチの if 判定が両方とも false の場合、つまり ArrayObject が継承されず、Countable インターフェースが実装されていない場合。
これらの型はすべて 1 を返します。
オブジェクトの属性の数を計算する必要がある場合は、まずオブジェクトを配列に変換してから、count 関数を呼び出すことができることに注意してください。例:
$count_value = count((配列) $user);
まとめ
count 関数のソース コードを読んでいるときに、if (Z_OBJ_HT_P(array)->count_elements) ステップで行き詰まってしまいました。このブランチに入るデモをまだ作成できなかったので、検索しました。インターネット上で多くの情報を調べても役に立たなかったので、TIPI の reeze を参照して、最終的に希望する答えを得ることができました。分からなかったら聞いてください(笑)。
http://www.bkjia.com/PHPjc/1133038.html