2012-09-22 16 views
7

mi è stato meravigliarono quando ho provato il seguente codice di oggi:In che modo esattamente PHP raggiunge le variabili "dinamiche"?

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

Durante il debug, ho osservato che $star cambia semplicemente dal tipo string a integer tipo. Sono rimasto stupito da questa funzionalità. Ad esempio in C++, questo è semplicemente impossibile, ma in C# ho considerato la variabile var ma non è la stessa cosa.

Per esempio non si può fare:

var dynamic = "Hello"; 
dynamic = 3; 

ho cominciato a chiedermi che cosa succede esattamente nel momento in cui ho praticamente dico $ stella = 11. La mia ipotesi è che $star è semplicemente reinizializzato dal momento che è di essere direttamente assegnato a (ma questo sembra strano poiché l'interprete sa già che una variabile $star è stata dichiarata in precedenza). Qualcuno può aiutare con alcune chiare o spiegazione ufficiale supportato da fonte?

Grazie.

risposta

7

In C/C++ il tipo è definito in fase di compilazione a causa dei tipi di ottimizzazione che possono verificarsi basati su di esso.

In C# il compilatore deduce il tipo basato sul contesto e nel cervello del compilatore sostituisce la parola chiave var per il tipo. Questo è il motivo per cui non è possibile modificare il tipo dopo che il compilatore ha effettuato l'inferenza iniziale.

In linguaggi di scripting come PHP una variabile è una voce in una mappa di hash (Associative Array, una tabella dei simboli). Questo definisce lo spazio dei nomi (e l'ambito). La parte del valore effettivo è un tipo di oggetto generico che memorizza sia il valore che il tipo.

+0

Wow, grande. Quindi vuol dire che in C# una variabile non viene mai realmente memorizzata come un tipo * generico * di oggetto ?? Ed è possibile che tu possa fornire qualsiasi fonte in cui posso imparare di più? grazie – rtuner

+1

C# è una lingua per l'output di codice byte da eseguire su una VM. Il "tipo di oggetto generico" a cui mi riferivo nell'esempio di PHP non è altro che una 'struct' in linguaggio C con 2 membri (semplifica un po 'la cosa dicendo questo). Più fonti sono difficili poiché si combinano concetti di 3 diversi tipi di linguaggi (uno per codice assembly, uno per byte-code e uno per interpretazione interpretata). –

0

PHP è un linguaggio dinamico, simile nello spirito a Perl, Ruby, Python, o molti altri. Il C++, d'altra parte, è compilato e tipizzato staticamente, richiedendo che ogni variabile abbia un tipo definito in fase di compilazione.

Controllare la documentazione di PHP per qualche grande intuizione di implementazione tipizzazione dinamica di PHP: http://php.net/manual/en/language.types.type-juggling.php

+0

io non credo che questo è esattamente quello che stavano cercando ... –

Problemi correlati