問題タブ [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.
php - コンパイル中に PHP が特定の拡張子でコンパイルされているかどうかを検出します
PHPの拡張機能を構築しようとしています。Sara Golemon の本を読んだ後、共有モジュールとしてコンパイルできる基本的な拡張機能を手に入れました。さらに、PHP 自体に沿って静的にコンパイルすることもできます。
ここで、特定の内部関数呼び出しをインターセプトし、これらの呼び出しを拡張機能に伝えるために、PHP インタープリターを変更したいと考えています。これは、拡張機能が PHP で静的にコンパイルされている場合にのみ実行したいと考えています。それ以外の場合は、インタープリターのビルド プロセスで変更されていない PHP バイナリが生成されます。私の理解では、C プリプロセッサを使用する必要があります。ただし、私の目標を達成するには、PHP が拡張機能を使用してコンパイルするように構成されている場合にのみ発生するプリプロセッサ フラグが必要です(つまり、./configure --enable-myextension)。残念ながら、そのようなフラグは見つからず、configure スクリプトによって設定されているようにも見えません。
ここで、拡張機能のコード内でプリプロセッサ フラグを設定しようとしましたが、うまくいきません。私の拡張機能は、ビルド プロセスの後半 (つまり、インタープリターのコアのほぼ後) で最初に触れられ、そこで設定したフラグは、インタープリター コードの大部分がコンパイルされているときにアクティブではありません。
何かご意見は?上記は合理的に聞こえますか?
php - 参照によって渡されたPHPローカル変数は、関数の外で確実に存続しますか?
null
基本的に、大きな配列を操作する場合、エラーが発生した場合に$array = null
戻すと便利$array[] = 1
です。許容値として受け入れます。基本的には、エラー処理コードがあれば簡単にエラーとして識別できるので便利ですが、気にしない場合は簡単に無視することもできます。[ 1 ]
null
function (array $array = null)
null
null
ほとんどの場合、これはかなり簡単ですが、PHP が実際にはそれほどうまくサポートしていないというまれなケースがあります。時々 null を返しますが、それ以外の場合は参照を返します (ほとんどの場合、インスタンス変数への参照を返すため、これは問題ではありませんが、そうでない場合もあります)。null
扱いにくい方法で値を指定して関数を呼び出す場合もあります。
参照を渡す理由は明らかに、配列をコピーする手間を省くためです (特に配列が非常に大きい場合)。
次の「解決策」...
動作しますが...
私の質問は、ローカル変数へのすべての参照がガベージ コレクションされる前に、ローカル変数がガベージ コレクションされないことを PHP が保証するかどうかです。またはその未定義の動作です。
php - ZEND_BEGIN_ARG_INFO_EX で、PHP 拡張機能に渡される引数の数を制御するにはどうすればよいですか?
C を使用して PHP 拡張機能を開発しています。これまでのところ、PHP ユーザー空間から拡張機能の関数に渡される引数の適切な検証に取り組んでいます。
このマクロZEND_BEGIN_ARG_INFO_EX
を使用して、関数の引数に関する情報を Zend Engine に提供できます。as という名前のマクロの 4 番目のパラメーターを使用するとrequired_num_args
、エンジンが引数の数を自動的に制御できるようになり、この手間が省けます。しかし、それを機能させる方法を見つけることができませんでした。エンジンは、PHP スクリプトが十分な引数を渡さなくても、常に警告なしで拡張機能の関数を実行します。
関数の引数の定義は次のとおりです。
PHP拡張機能によってエクスポートされた関数の私の定義は次のとおりです。
これが私の機能です:
私が実行するPHPスクリプトは次のとおりです。
期待される結果: PHP は、 「十分な引数が関数に渡されていません」のようなエラー/警告/例外を示します。関数は実行されません。
実際の結果: 関数が実行され、 が返されますtrue
。
Zend Engine が引数の数を自動的にチェックするように、関数の引数構造を適切に構成するにはどうすればよいですか? それとも、マクロのrequired_num_args
引数の目的を間違えていますか?ZEND_BEGIN_ARG_INFO_EX
php - 日付、時刻、DSL、およびタイムゾーン情報の取り扱い
タイムゾーンと夏時間の情報は予告なく変更される場合があります。 簡単な法律によって、特定の地域の DSL が変更され、地球上の特定の地域の日時情報が役に立たなくなり、サーバーまたはクライアントの現地時間に依存するコードに突然影響が及ぶ可能性があります。とにかく、タイムゾーンは実際の日没/日の出時間を大まかにしか反映していません.
DateTime
、 、およびその他を含む、この予測不可能な「時間」の定義が影響を与える可能性のある PHP ユーザーランド ライブラリがいくつかありますdate
。ユーザーランドの外には、タイムゾーン変換に依存する内部コードがあるかもしれません。
PHP のライブラリは、刻々と変化する日付、時刻、およびタイムゾーンの定義をどのように説明していますか?
php - Lame.h を PHP 拡張機能とリンクする
初めての PHP 拡張機能を開発しようとしています。それは Lame を使用するので、liblame-dev lame.h をインストールしました。/usr/include/lame/
私のconfig.m4で
ビルドはするが、apacheの起動時に何かがおかしくなる
解決
私にとってconfig.m4の正しい行は、
PHP_SUBST(MYEXTENSION_SHARED_LIBADD)
PHP_ADD_LIBRARY(mp3lame, 1,MYEXTENSION_SHARED_LIBADD)
php-internals - zend_language_scanner.c を再生成しようとしています
私はPHPに新しいキーワードを追加しようとしています(コアを学んでいるだけです)ので、私がしたことは、新しいトークンをzend_language_parser.yに追加し、それをunticket_statementで使用し、PHPをコンパイルしましたが、うまくいきませんでした。その新しいキーワードを zend_language_scanner.l に追加し (このファイルの別の定義で想定していました)、re2c を使用して zend_language_scanner.c を再生成する必要があるようです。
しかし、re2cが私に与えたものは次のとおりです。
行 1004 には次の定義が含まれています。
このエラーは、変更されていない zend_language_scanner.l ファイルでも表示されます。
re2c -v
出力は次のとおりです。re2c 0.13.5
このスキャナーを再生成する方法を知っている人はいますか、または何が間違っていますか?
php - PHP クラス メソッドを C で記述されたハンドラーに置き換える php 拡張機能
私の経験レベル: C に非常に慣れている、PHP の初心者、Zend Engine に不慣れで非常にイライラしている (ドキュメントはありませんか?)
私は最初の PHP 拡張機能を作成しようとしていますが、次のことが可能かどうか疑問に思っています。
私の目標を示すPHPコード:
また、拡張機能によって公開された関数を呼び出すように foo を書き直すこともできますが、それは私にとって興味深いことではありません。上記の例 (PHP クラスが拡張機能を認識せず、連携しない) が可能かどうかを知りたいだけです。
php - PHP 拡張機能を dll にコンパイルする
私はここ数日、オペレーターのオーバーロード拡張機能 (pecl.php.net/package/operator) を利用しようと試みてきました。これは最近、5.3 および 5.4 と互換性を持つように更新されたようです。
PHP 5.4 と Windows SDK 7.1 を使用して、このガイドを使用して Windows (64 ビット Windows 7) でコンパイルしようとしましたが、うまくいきませんでした。そこで、PHP 5.3 と Windows SDK 6.1 で試してみましたが、「configure --disable-all --enable-cli --enable-operator」と「nmake」の構成で正常にコンパイルできます。問題は、オペレーター拡張機能の dll ファイルが生成されず、代わりにthis が生成されることです。これは明らかに役に立たないものです。私が欲しいのは、ローカルの WampServer セットアップに使用できる dll です。
pecl.php.net サイトから operator-0.4.1 を使用しようとしたときに致命的なエラーが発生したため、代わりに git リポジトリ (github.com/php/pecl-php-operator) からダウンロードしてコンパイルしました。 .obj、.idb、および .sbr ファイルを作成しました。
php - print_r() は DateTime オブジェクトにプロパティを追加します
次のコード サンプルを検討してください。
PHP 5.3 以降、これは次の出力 (のようなもの) を生成します。
ただし、次のコード:
...単にエラーを出力します:
print_r()
これらのプロパティをオブジェクトに「追加」するのはなぜですか? これらはマニュアルページDateTime
のクラスの一部として定義されていないことに注意してください。