2012-09-22 11 views
7

Ich staunte, als ich heute den folgenden Code getestet:Wie genau erreicht PHP 'dynamische' Variablen?

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

Während des Debuggens ich beobachtet, dass $star einfach aus string Typ integer Typ ändert. Ich war erstaunt über diese Funktionalität. In C++ zum Beispiel ist das einfach unmöglich, aber in C# habe ich die Variable var betrachtet, aber sie ist nicht die selbe.

Zum Beispiel können Sie nicht tun:

var dynamic = "Hello"; 
dynamic = 3; 

Ich begann genau zu fragen, was an dem Punkt passiert, wenn ich im Grunde $ Stern = 11. Meine Vermutung sagen, dass $star einfach neu initialisiert, da es zu sein ist direkt zugewiesen (dies erscheint jedoch seltsam, da der Interpreter bereits weiß, dass eine Variable $star früher deklariert wurde). Kann jemand mit einigen klaren oder offiziellen quellengesicherten Erklärung helfen?

Danke.

Antwort

7

In C/C++ der Typ ist bei der Kompilierung definiert wegen der Art der Optimierung, die auf ihm basieren auftreten können.

In C# leitet der Compiler den Typ basierend auf dem Kontext und im Compiler-Gehirn ersetzt er das Schlüsselwort var für den Typ. Aus diesem Grund können Sie den Typ nicht ändern, nachdem der Compiler die erste Inferenz durchgeführt hat.

In Skriptsprachen wie PHP ist eine Variable ein Eintrag in eine Hash Map (Assoziatives Array, eine Symboltabelle). Dies definiert den Namespace (und den Bereich). Der tatsächliche Wertteil ist ein generischer Objekttyp, der sowohl den Wert als auch den Typ speichert.

+0

Wow, großartig. Also bedeutet es, dass in C# eine Variable niemals wirklich als ein * generischer * Objekttyp gespeichert wird? Und ist es möglich, dass du Quellen zur Verfügung stellen kannst, in denen ich mehr lernen kann? Danke – rtuner

+1

C# ist eine Sprache, um Byte-Code auszugeben, um auf einer VM zu laufen. Der 'generische Objekttyp', auf den ich im PHP-Beispiel Bezug nahm, ist nichts anderes als eine 'C-Sprachstruktur' mit 2 Mitgliedern (ich vereinfache das ein wenig, indem ich das sage). Mehr Quellen sind schwierig, da Sie Konzepte aus 3 verschiedenen Sprachen kombinieren (eine für Assemblercode, eine für Bytecode und eine für interpretierte Ausführung). –

0

PHP ist eine dynamische Sprache, ähnlich wie Perl, Ruby, Python oder viele andere. C++ andererseits ist kompiliert und statisch typisiert, wobei jede Variable einen Typ benötigt, der zur Kompilierungszeit definiert wird.

Überprüfen Sie die PHP-Dokumentation für einige große Einsicht PHP dynamische Typisierung Implementierung: http://php.net/manual/en/language.types.type-juggling.php

+0

Ich glaube nicht, das ganz ist, was sie gesucht haben ... –