問題タブ [php-internals]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
yacc - php 拡張機能の flex+bison
Flex と bison を使用して、c で小さなパーサーを作成しました。パーサーは結果をいくつかのグローバル変数に書き込み、呼び出し元関数はそこからそれを読み取ります。
パーサーを php 拡張機能としてパッケージ化しようとしています。私がphpドキュメントから理解していることから、真のグローバル変数はスレッドセーフではなく、代わりにモジュールグローバルを使用する必要があるため、推奨されません。
モジュール グローバルを使用するには、関数 TSRMLS_DC を最後の引数として渡す必要があります。
TSRMLS_DC を引数として受け入れるように yyparse を変更できるかどうかはわかります。または、グローバル変数にアクセスする別の方法がある場合は?
php-extension - ZVALをSAPI全体で永続化しますか?
ZVALは通常、emallocを使用して作成されるため、ページ要求の最後に破棄されます。既存のZVALを取得してSAPI(pemallocと同等)に保持する方法はありますか?pemallocでZVALを作成するのはどうですか?
理想的には(PHPコードで)私がやりたいことはこれです:
リクエストごとcount
に+1が返されます(毎回同じPHP「ワーカー」が使用されていると仮定します-私はPHP-FPMを使用しています)。
php - PHPの「foreach」は実際にどのように機能しますか?
私はそれが何でforeach
あるか、何をし、どのように使用するかを知っていると言うことで、これにプレフィックスを付けさせてください. この質問は、ボンネットの下でどのように機能するかに関するものであり、「これが配列をループする方法です」という行に沿った回答は望んでいませんforeach
。
長い間、私はそれforeach
が配列自体で機能すると思っていました。その後、配列のコピーで動作するという事実への多くの言及を見つけたので、これで話は終わりだと思いました。しかし、私は最近、この問題について議論を始めました。少し実験した結果、これは実際には 100% 真実ではないことがわかりました。
私が何を意味するかを示しましょう。次のテスト ケースでは、次の配列を使用します。
これは、ソース配列を直接操作していないことを明確に示しています。そうしないと、ループ中にアイテムを常に配列にプッシュしているため、ループが永遠に続くことになります。しかし、これが事実であることを確認するために:
これは、ループ中にソース配列のコピーを操作しているという最初の結論を裏付けています。そうしないと、ループ中に変更された値が表示されます。しかし...
マニュアルを見ると、次のステートメントが見つかります。
foreach が最初に実行を開始すると、内部配列ポインターは配列の最初の要素に自動的にリセットされます。
foreach
右...これは、ソース配列の配列ポインターに依存していることを示唆しているようです。しかし、ソース配列で作業していないことが証明されましたよね? まあ、完全ではありません。
したがって、ソース配列を直接操作していないという事実にもかかわらず、ソース配列ポインターを直接操作しています。ポインターがループの最後で配列の最後にあるという事実は、これを示しています。ただし、これが真であるとは限りません。真である場合、テスト ケース 1は永久にループします。
PHPマニュアルにも次のように記載されています。
foreach は内部配列ポインターに依存しているため、ループ内で変更すると、予期しない動作が発生する可能性があります。
では、その「予期しない動作」とは何かを調べてみましょう (技術的には、何を期待すればよいかわからないため、どのような動作も予期しないものです)。
...予想外のことは何もありません。実際、「ソースのコピー」理論をサポートしているようです。
質問
ここで何が起こっているのですか?私の C-fu は、PHP のソース コードを見ただけで適切な結論を導き出すには不十分です。どなたか英語に翻訳していただければ幸いです。
配列のコピーforeach
で動作するように思えますが、ループ後にソース配列の配列ポインターを配列の最後に設定します。
- これは正しく、全体の話ですか?
- そうでない場合、それは実際に何をしているのですか?
- ループ中に配列ポインターを調整する関数 ( など) を使用すると、ループの結果に影響を与える状況はあり
each()
ますか?reset()
foreach
php - php5 拡張用の C++ DLL のラッピングの問題
C++ dll 用の php 5.2.17 拡張機能を作成しようとしています。Windows XP で Visual Studio 2005 と Sambar Server 7.0 を使用しています。2 つの質問があります。
コードに c++ のもの (文字列または STL マップ) を含めることができませんでした..「PHP は 00CF421B でアクセス違反に遭遇しました」のようなエラーが発生します。dll で文字列と STL マップを使用するにはどうすればよいですか。
文字列型の 3 つのパラメーターを持つ関数を含む c++ dll を作成しようとしており、それらの 3 つの 2 番目の文字列を返します。
以下はコードです:
php ファイルには以下が含まれます。
-> ここで、この関数に 2 つのパラメーターが設定されている場合、最初の文字列は正常に返されます。
-> この関数の 2 つのパラメーターを含む 2 番目の文字列を返そうとすると、エラーが発生します: "PHP は 014AE07C でアクセス違反に遭遇しました"
-> 上記のコードのような 3 つのパラメーターを使用して試行すると、サンバー サーバーが自動的に閉じてしまいます。出力が表示される可能性はありません。
なぜこの奇妙な動作なのか、どこが間違っているのでしょうか?
前もって感謝します
アニル
php - PHP 文字列の長さ
PHPコーディング標準は次のように述べています。
... PHP は各文字列の長さのプロパティを保持しており、strlen() で計算すべきではありません。効率とバイナリ セーフの両方のために、関数が length プロパティを利用するような方法で関数を記述します。...
この長さのプロパティにアクセスするにはどうすればよいですか? それとも私はそれを誤解していますか?
php - Zend エンジン呼び出しの親メソッド
現在、カスタム php 拡張機能を作成しようとしていますが、直面している問題は、親メソッドを呼び出す方法がわからないことです。
クラス コンストラクターにいて、親のコンストラクターを呼び出すようなものです。
これを正しく行う方法は?
php - zval を PHP 拡張用のベクトルに変換する方法は?
次のように定義されている C++ ライブラリの php 拡張機能を作成しています。
今、私はこのような上記の関数のphpラッパーを書いています。
getPids() を呼び出したいのですが、idsArray をベクトルとして c++ 関数に渡す適切な方法がわかりません。
Webで検索した後、zval配列を反復して各値を読み取る例を見つけました。これを使用してベクトルを作成できると思いました。
しかし、これは最善のアプローチですか?またはこれを行うためのより良い方法はありますか?
ありがとう!
php - zendengineのリターンオブジェクトリファレンス
phpでは、次のように書くことが有効です。
Zend Engine内でこれを行うにはどうすればよいですか?メソッドでいくつかの操作を実行してから、クラスインスタンス参照を返します。
さらに、(他のクラスからの)いくつかのオブジェクトを保存し、他のいくつかのメソッドの結果としてそれらを返したいのですが、それを保存する必要がありzval*
ますか?それへの参照を返す正しい方法は何ですか?
php - SplObjectStorage::containsとSplObjectStorage::offsetExistsの違いは何ですか?
PHPのドキュメントはあまり明確ではなく、次のように述べているだけです。
SplObjectStorage::offsetExists オブジェクトがストレージに存在するかどうかを確認します。(PHP> = 5.3.0)
SplObjectStorage::contains ストレージに提供されたオブジェクトが含まれているかどうかを確認します。(PHP> = 5.1.0)
これは私にはほとんど同じように思えます。
質問: offsetExistsが5.3.0でのみ利用可能であることを除けば、2つの違いは何ですか?
私が行った小さなテスト...
出力:
php - ZEND_NUM_ARGS()マクロが原因で拡張機能をビルドできません
私は小さなphp拡張機能を書いていますが、それを構築するときに問題があります。コード:
makeでエラーが発生しました:
ZEND_NUM_ARGS()は、Zend_API.hのマクロです。
しかし、「ht」とは何ですか?何か案は?