2012-09-22 11 views
7

は、私は驚嘆しました:PHPはどのように「動的」変数を正確に達成していますか?私は今日、次のコードをテストしたとき

$star = "Aquarius"; 
$star = 11; 

はデバッグ中、私は$starは単にstringタイプからinteger型に変化することを観察しました。私はこの機能に驚きました。たとえば、C++ではこれは不可能ですが、C#ではvar変数を考慮しましたが、同じではありません。あなたが行うことはできません。例えば

var dynamic = "Hello"; 
dynamic = 3; 

私は基本的に$スター= 11私の推測では、それが直接されていますので、$starが単純に再初期化されていることであると言うとき、正確にポイントで何が起こるか疑問に思い始めました(しかし、これは、変数$starが先に宣言されていることをインタープリターがすでに知っているので、これは変です。誰も助けることができるいくつかの明確なまたは公式ソースバックの説明?

ありがとうございました。

答えて

7

は++タイプがあるため、それに基づいて発生することができ、最適化の種類のコンパイル時に定義されています。

C#では、コンパイラはコンテキストに基づいて型を推定し、コンパイラの脳では型の型名にvarを代入します。これは、コンパイラが最初の推論を行った後に型を変更できない理由です。

PHPのようなスクリプト言語では、変数はハッシュマップ(連想配列、シンボルテーブル)へのエントリです。これは名前空間(および範囲)を定義します。実際の値の部分は、値と型の両方を格納する汎用オブジェクト型です。

+0

うわー、素晴らしいです。 C#では変数が実際には*汎用*オブジェクト型として格納されることはありませんか?そして、あなたが私がもっと学ぶことができる場所を提供することは可能でしょうか?ありがとう – rtuner

+1

C#は、VM上で実行するバイトコードを出力するための言語です。私がPHPの例で参照していた '汎用オブジェクト型'は、2つのメンバを持つ 'C言語の構造体 'に過ぎません(私はこれを少しだけ簡潔に説明します)。 3つの異なる種類の言語(1つはアセンブリコード用、1つはバイトコード用、もう1つは解釈実行用)のコンセプトを組み合わせるので、ソースを増やすのは難しいです。 –

0

PHPは動的言語であり、Perl、Ruby、Pythonなどと同様の精神を持っています。一方、C++はコンパイルされ、静的に型付けされ、各変数はコンパイル時に定義された型を持つ必要があります。

チェックPHPの動的型付けの実装にいくつかの素晴らしい洞察力のためのPHPのドキュメント:C/Cで http://php.net/manual/en/language.types.type-juggling.php

+0

私は、これは彼らが探していた非常に何であるとは思わない... –

関連する問題