Domanda

Il modo in cui ho capito, il seguente è consentito in PHP, perché è un linguaggio debolmente tipizzato.

$var = 'Hello';
$var = 5;

Ho appena installato una versione di Windows di Python 2.6 e mi aspettavo che non farmi cambiare tipo proprio così, ma l'equivalente Python del codice di cui sopra funziona proprio come in PHP accidenti!

>>> var = "Hello"
>>> type(var)
<type 'str'>
>>> var = 5
>>> type(var)
<type 'int'>

è la mia comprensione dei deboli tipizzazione forte / viziata?

È stato utile?

Soluzione

Il tuo esempio dimostra dinamica di battitura, non tipizzazione debole. tipizzazione dinamica generalmente significa che il tipo di dati di un oggetto può memorizzare è mutevole; qualsiasi bersaglio può contenere un legante a qualunque tipo di oggetto. Contrasto che, con, ad esempio, C #, che è staticamente tipizzato [*].

int i = 5; // Okay.
i = "5";   // Illegal! i can only hold integers.

tipizzazione forte significa che una volta assegnato un valore di un tipo particolare, oggetti obbediscono regole severe su come essi possono interagire con altri oggetti di vario tipo. tipizzazione debole significa che tali norme sono più rilassati. Ciò non significa che le lingue fortemente tipizzati sono necessariamente superiori in alcun modo; è solo una scelta di design lingua.

Python è considerato fortemente tipizzato, perché gli oggetti hanno una nozione distinta di ciò che tipo sono. operazioni incompatibili tra gli oggetti causano errori:

>>> 1 + 1          # Add two integers.
2
>>> "1" + "1"      # Concatenate two strings.
'11'
>>> 1 + int("1")   # Add two integers.
2
>>> "1" + str(1)   # Concatenate two strings.
'11'
>>> 1 + "1"        # Undefined! Adding integers and strings is meaningless.
Traceback (most recent call last):
  File "", line 5, in ?
TypeError: unsupported operand type(s) for +: 'int' and 'str'

Ma in PHP, le regole sono molto più rilassato su ciò che è accettabile. Così è considerato più debolmente tipizzato di alcune altre lingue.

$x = 1 + "1"; // x is 2

[*] Tecnicamente, come C # 4, C # è staticamente tipizzato, ma con la tipizzazione dinamica opt-in su una base per vincolante, grazie alla parola chiave dynamic. Un sacco di lingue in questi giorni stanno aggiungendo capacità dinamiche e confondendo i confini, così sta diventando sempre più difficile a dire che "il linguaggio X è dinamico" e "linguaggio Y è statico". E 'molto più di una scala mobile o di uno spettro di quello che è una struttura binaria.

Altri suggerimenti

Un'inoltre la prima risposta: E 'un po' più complicato perché in Python l'operatore + è sovraccarico che significa che sarebbe sia aggiungere (matematica) e concatenare (incollare due stringhe). Nell'esempio php

$i = 1 + "1" // $i == 2

il plus aggiunge (matematica), perché il. (Dot) è utilizzata per la concatenazione, quindi in php

$i = 1 . "1" // $i == "11"

Quello che sto cercando di mettere in chiaro è che ogni debolmente tipizzato / Offerte di linguaggio dinamico con questo in un suo modo.

Non c'è vera definizione di tipizzazione debole o forte tipizzazione. Tutti i suoi circa conversioni di tipo implicite e non ha nulla a che fare con tipizzazione statica / dinamica.

Un linguaggio a tipizzazione statica come Java può è debolmente tipizzato (non che è vero), e un linguaggio tipizzato in modo dinamico come PHP può è fortemente tipizzato (non che sia ).

Un linguaggio debolmente tipizzato è più liberale in quali tipi di dati possono essere mescolati in alcune operazioni.

Sì. Che non è forte / tipizzazione debole, che è statico tipizzazione / dinamico. tipizzazione debole permette cose come 5 + '5' alla parità di 10.

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