10

私は多くの言語で多くのプログラミングを行ったことがありませんが、C(++) では変数の型 ( 、など) を宣言する必要があることは知っていintますchar

もちろん、PHP ではその必要はありません。$str = "something";あなたは後で始めることができ$str = array("something" => "smells");、彼女は幸せです.

PHP はどのようにコンパイルしますか? 変数の型がどうなるかをどのように知るのでしょうか? それも気にしますか?

この質問は、私がしていることとは何の関係もありません。ただ興味があるだけ。

編集。

この質問を少し明確にする必要があります。

C では、次のように言います。

int y;

用に x バイト量を予約しますyyオーバーフローした場合は、悪いニュースです。

PHP にはこのような性質はありません (少なくとも私はそうは思いません)。

$i = "a number";
$i = 8;
$i = 1000000000000000000;

言語に関してはすべて同じです。予約する金額をどのように知るのですか? それともリンゴとオレンジを比較しているのでしょうか? 私がこれについて間違っているとしたら、理解を深めるために読むことができる良いトピックはありますか?

4

6 に答える 6

8

C の経験があるので、PHP 変数は次のようになると考えてください。

typedef struct {
 int varType;
 void* data;
} variable_t;

新しい変数を作成すると、 が作成variable_tされ、型タグが付けられ (int の場合は 1、文字列の場合は 2 とします)、リストのどこかに格納されます (スコープによって、名前による参照)。実際の内容は に格納され*dataます。変数が再びアクセスされると、 から型を判別でき、int または string として使用するなど、で適切なint varTypeアクションが実行されます。void* data

PHP スニペットが次のようになっていると想像してください。

 $data = 12;
 $data2 = $data + 1;
 $data = "Hello";

次のような命令を生成します (疑似 Cish):

Line 1:
variable_t* var = new_variable(TYPE_INT, data);
store_variable("data", var);

Line 2:
variable_t* var = get_variable("data2");
if (var->varType == TYPE_INT)
   int value = 1 + *(int*)var->data);
else
   error("Can't add non int");
var = new_variable(TYPE_INT, value);
store_variable("data2", var);

Line 3:
variable_t* var = get_variable("data");
if (var)
  destroy_variable(var);
// Do like line 1, but for TYPE_STRING

このタイプの拡張データは、バイトコード、コンパイル、または直接解釈された言語で機能します。

さまざまな仮想マシンの実装 (ローカル割り当て、ヒープ割り当て、VM の登録など) に関する詳細があります。仮想マシンがどのように機能するかを実際に理解したい場合は、Lua が最適なリファレンスです。非常にクリーンな言語、非常にクリーンなバイトコード、非常にクリーンな仮想マシン。PHP はおそらく、検討すべき最後の実装です。

于 2010-10-28T03:58:36.873 に答える
1

PHP は実際にはコンパイルされません。(オペコードに) 解釈されます。

実行できない特定のデータ型で何かを実行しようとすると、エラーが発生します。型チェックはありません。

于 2010-10-28T03:37:39.353 に答える
1

コンパイルされません。Javascript のようなインタープリター言語です。

于 2010-10-28T03:38:33.977 に答える
1

これは古い質問だと思いますが、PHPがOPからの質問をどのように処理するかについてのより具体的な情報を次に示します。

これは、最初に使用する PHP リファレンスのページです。

変数の概要

リンクが好ましくないことはわかっていますが、そのリンクは安定している必要があり、PHP リファレンス ドキュメントの大量コピーはしたくありません。ここにハイライトがあります。

OP: PHP は、どのタイプの変数を使用するか (または使用するか) をどのように認識しますか?

PHP は C で書かれており、zval を呼び出す C 構造体 typedef と、すべての変数を表す zval_value を呼び出す C 共用体 typedef を使用ます。

typedef struct _zval_struct {
    zvalue_value value;        /* variable value */
    zend_uint refcount__gc;    /* reference counter */
    zend_uchar type;           /* value type */
    zend_uchar is_ref__gc;     /* reference flag */
} zval;

エンジンは、構造体のさまざまなフィールドにアクセスするための統一された直感的なマクロのセットを提供することにより、任意の型になり得る変数の概念の複雑さを隠そうとします。」

「PHP は動的で型付けの緩い言語であり、コピーオンライトと参照カウントを使用します。」参照カウントとコピー オン ライト (COW) は、PHP が使用する 2 つの強力な概念であり、ここでは説明しませんが、読む価値があります。

"弱い型付けは、実行時に変数を必要な型に変換または強制するというエンジンの設定を暗示しています。参照カウントは、変数がユーザー コードで参照を持たなくなったときにエンジンが推測できる手段です。変数に関連付けられた構造を解放できます。」

" zval_value は、変数が保持できるすべての型を表現できる共用体です。 "

" ...変数は 1 つの型にすることができます。変数データは、zval_value 共用体の適切なフィールドによって表されます。zval 自体は、型、参照カウント、および変数が参照であるかどうかを示すフラグを保持します。 "

PHP はどのようにコンパイルしますか?

「コンパイル」はさまざまな意味を持つ広義の言葉であり、PHP は伝統的な意味でコンパイルしません。ソースコードをプロセッサが実行できる命令であるオペコードに変換する一種のプリコンパイルを行います。これらのオペコードはキャッシュされるため、PHP は頻繁に呼び出されるスクリプトを解析する必要がありません。

変数の型がどうなるかをどのように知るのでしょうか? それも気にしますか?

すでに上で引用したように、これは PHP エンジンの「実行時に変数を必要な型に変換または強制する設定」です。基本的に PHP は、変数の作成時に変数の型を決定するものを常に保存しますが、変数が参照されると、PHP は変数が使用されているコンテキストに基づいて型が何であるかを別の決定を行います。

" PHP は型付けが弱いため、エンジンは変数をある型から別の型に変換するための API 関数を提供します。 "

エンジンには、zvals を操作して変数の型を変換するために使用する一連のマクロがあるため、通常はそれに対処する必要はありません。

zval が実際にどのように表示されるかを確認したい場合は、次のコマンドでダンプできます。

debug_zval_dump($variableName);
于 2016-04-07T21:54:08.303 に答える
0

「PHP はどのようにコンパイルしますか? 変数の型がどうなるかをどのように知るのですか? それは気にしますか?

この質問は、私がしていることとは何の関係もありません。ただ興味があるだけ。"

PHP はインタープリター言語であり、コンパイルされません。

変数の型は、その変数に最後に割り当てられた値の型によって決定されるため、PHP は変数がどの型になるかを知りません。

あなたはこれを行うことができます:

$foo = 5;
var_dump($foo);
$foo = "5";
var_dump($foo);
$foo = array();
$foo[] = 0;
$foo[] = 1;
$foo[] = 2;
var_dump($foo);

ご覧のとおり、値が foo に割り当てられるたびに、型が変更される可能性があります。

PHP はプログラミング言語であり、感情を持たないため、変数の型は気にしません。

編集:

「それとも、リンゴとオレンジを比較しているのでしょうか?」

はい、そうです。ここでは、言語について詳しく学ぶことができます。

EDIT2:

PHP は、インタープリターを使用し、コンパイラーを使用しないスクリプト言語です。これは、PHP では実行時エラーしか取得できないことを意味します。変数を使って何でもする権利があり、それらの型はそれらの使用法に応じて変更されるため、型を考慮するとリベラルな言語です。

これらのリンクは役に立つかもしれません:

http://www.gidforums.com/t-11866.html

http://www.webmaster-talk.com/coding-forum/186350-fundamental-differences-between-php-cc.html

PHP と C の変数スコープの違い: ブロック スコープはまったく同じではありませんか?

PHP はサーバー上で実行されることに注意してください。クライアント イベントを作成する場合は、Javascript をお勧めします。

于 2010-10-28T03:57:04.380 に答える
-1

PHP は型ヒントをサポートするようになりました。関数定義に「string」や「array」などを含めることができます。これらは、スクリプトが解析されて型の不一致があることを示すときにキャッチされます。

于 2010-10-28T03:39:11.067 に答える