Domanda

Non ho fatto molto di programmazione in molte lingue, ma so che in C (++), si deve dichiarare un tipo di variabile (int, char, ecc).

In PHP voi, naturalmente, non c'è bisogno di farlo. Si può iniziare con $str = "something"; poi $str = array("something" => "smells"); e lei è felice.

Come si compila PHP? Come fa a sapere che cosa il tipo di variabile sta per essere? Ha anche la cura?

Questa domanda non ha alcuna rilevanza per tutto ciò che sto facendo. Sono solo curioso.

Modifica.

ho bisogno di chiarire la questione un po '.

In C, se dico:

int y;

Si riserva x quantità di byte per y. Se overflow y, cattive notizie.

PHP non ha questa natura (almeno io non credo che lo fa).

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

E 'lo stesso per la lingua. Come fa a sapere quanto di riserva? O sto confrontando le mele alle arance? Se sto andando su questo sbagliato, hai qualche argomenti buoni che posso leggere per capire meglio?

È stato utile?

Soluzione

Dal momento che si dispone di esperienza C, considerare una variabile PHP per essere come il seguente:

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

quando si crea una nuova variabile, si creerà un variable_t, dargli un tag di tipo (diciamo 1 per int, 2 per archi), e conservarla in un elenco da qualche parte (dal campo di applicazione, di riferimento per nome). Il contenuto effettivo verranno memorizzati in *data. Quando la variabile è di nuovo accessibile, il tipo può essere determinato da int varType, e l'azione appropriata fatta in void* data, come l'utilizzo come un int o stringa.

Immaginate che il PHP frammento:

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

produce istruzioni come la seguente (pseudo-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

Questo tipo di opere di dati aumentata in bytecode, compilati, o direttamente linguaggi interpretati.

Non ci sono ulteriori dettagli in materia di diverse implementazioni di macchine virtuali (allocazione locale, allocazione mucchio, registrare macchine virtuali, ecc). Se si vuole realmente capire come macchine virtuali funzionano, il miglior riferimento è Lua. linguaggio molto pulito, bytecode molto pulito, e la macchina virtuale, molto pulita. PHP è probabilmente l'ultima realizzazione si dovrebbe guardare.

Altri suggerimenti

PHP in realtà non compilare -. È interpretato nel (in op-codici)

Praticamente se si tenta di fare qualcosa su un certo tipo di dati che non può essere fatto, ti do un errore. Non v'è alcun tipo di controllo.

Non si compila. Si tratta di un interpretato linguaggio, come Javascript.

mi rendo conto che è una vecchia questione, ma ecco alcune informazioni più specifiche su come PHP gestisce le domande poste dal PO.

Questa è la pagina di riferimento dal PHP che ci si vuole iniziare con:

Introduzione alle variabili

So che collega non è preferito, ma che puntano dovrebbe essere stabile e io non voglio copiare all'ingrosso documentazione di riferimento di PHP. Ecco i punti salienti.

  

OP:? Come funziona PHP sapere che tipo di variabili che utilizza (o lo fa)

PHP è scritto in C e utilizza un typedef C struct che si chiama un zval insieme a una typedef C unione che è chiama un zval_value per rappresentare tutte le variabili.

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;

" I tentativi motore per coprire la complessità del concetto di una variabile che può essere di qualsiasi tipo, fornendo un uniforme e set intuitivo di macro per l'accesso alle strutture vari campi ".

"PHP è una dinamica, linguaggio debolmente tipizzato, che usi copy-on-write e il conteggio di riferimento." Riferimento Conteggio e copy-on-write (COW) sono due potenti usi concetti PHP che non entrerò in qui, ma vale la pena di leggere su.

" tipizzazione debole è implicito della preferenza del motore per convertire, o variabili costringere nel tipo richiesto al momento dell'esecuzione . Conteggio di riferimento è il mezzo mediante il quale il motore può dedurre se una variabile non ha più tutti i riferimenti nel codice degli utenti, e quindi è in grado di liberare le strutture associate con la variabile ".

" Lo zval_value è un'unione che può rappresentare tutti i tipi di una variabile può detenere. "

" ... una variabile può essere di un tipo, i dati variabili è rappresentato dal campo appropriato nel bocchettone zval_value. Lo zval si mantiene il carattere, conteggio di riferimento e un flag per indicare se una variabile è un punto di riferimento. "

  

Come PHP compilazione?

"Compila" è una parola ampio che può avere diversi significati e PHP non viene compilato in senso tradizionale. Esso svolge una sorta di pre-elaborazione che converte il codice sorgente in codici operativi che sono istruzioni che possono essere eseguite dal processore. Questi codici operativi vengono memorizzati nella cache che impedisce PHP da deve analizzare chiamati più frequentemente script.

  

Come fa a sapere che cosa il tipo di variabile sta per essere? Ha anche la cura?

Come già sopra citati, è il motore PHP " la preferenza a convertire, o variabili costringere nel tipo richiesto al momento di esecuzione ." Baiscally PHP non sempre memorizza ciò che determina il tipo di variabile per essere quando è creato, ma quando viene fatto riferimento una variabile PHP fa un'altra determinazione di quale tipo si basa sul contesto in cui esso è utilizzato.

" PHP è debolmente tipizzato, come tale il motore offre funzioni API per la conversione di variabili da un tipo all'altro. "

Il motore ha un insieme di macro che usa per lavorare con i zvals per convertire il tipo di una variabile in modo che di solito non hanno a che fare con questo.

Se volete vedere che cosa zvals sguardo come nell'azione possono essere scaricati con:

debug_zval_dump($variableName);

"Come PHP compilazione? Come fa a sapere che cosa il tipo di variabile sta per essere? Ha ancora la cura?

Questa domanda non ha alcuna rilevanza per tutto ciò che sto facendo. Sono solo curioso. "

PHP è un linguaggio interpretato e non viene compilato.

PHP non sa che tipo la variabile sta per essere, perché il tipo di variabile è determinato dal tipo del valore che è stato assegnato l'ultima volta a quella variabile.

Si può fare questo:

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

Come si può vedere, ogni volta che un valore viene assegnato a foo, il tipo potrebbe essere modificato.

PHP non preoccupano il tipo di variabile, perché è un linguaggio di programmazione e non hanno sentimenti.

EDIT:

"O sono io a confronto le mele agli aranci?"

Sì, sei. Qui si può imparare di più sulla lingua.

EDIT2:

PHP è un linguaggio di scripting con un interprete e senza un compilatore. Ciò significa che in PHP si può ottenere solo errori di runtime. E 'un linguaggio liberale, se si considerano i tipi, perché avete il diritto di fare qualsiasi cosa con le variabili e saranno modificati i loro tipi secondo l'uso di loro.

Questi link potrebbe essere utile per voi:

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

http: // www .webmaster-talk.com / codifica-forum / 186350-fondamentali-differenze-tra-php-cc.html

variabile differenza tra portata PHP e C:? ambito blocco non è esattamente la stessa

Si noti che PHP viene eseguito sul server, se si desidera creare eventi client, JavaScript è il mio suggerimento.

PHP ora supporta tipo hinting, è possibile includere le cose come 'stringa' o 'serie' a definizioni di funzioni che vengono catturati come gli script vengono analizzati per indicare c'è un tipo non corrispondente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top