2016-07-11 22 views
13

Ho difficoltà a comprendere l'importanza dell'Hint di tipo in PHP.Perché è necessario il suggerimento sul tipo in PHP?

apparentemente 'tipo hinting' in PHP possono essere definiti come segue:

"Type hinting" forces you to only pass objects of a particular type. This prevents you from passing incompatible values, and creates a standard if you're working with a team etc.

Quindi digitare alludendo al livello più elementare, non è tenuto a rendere realtà il codice di lavoro?

ho il seguente codice per cercare di capire cosa sta succedendo ...

Index.php

<?php 
include 'Song.php'; 

$song_object = new Song; 

$song_object->title = "Beat it!"; 
$song_object->lyrics = "It doesn't matter who's wrong or right... just beat it!"; 


function sing(Song $song) 
{ 
    echo "Singing the song called " . $song->title; 
    echo "<p>" . $song->lyrics . "</p>"; 
} 

sing($song_object); 

Song.php

<?php 

class Song 
{ 
    public $title; 
    public $lyrics; 
} 

la il codice fa la sua cosa con o senza il piccolo suggerimento nella funzione sing();

enter image description here

Quindi, questo mi porta a credere che tipo di hinting è semplicemente una convenzione di codifica per assicurarsi che solo alcune classi vengono utilizzati e non sono necessari per la produzione di codice funzionale, è corretto?

Tipo suggerimento, come suggerisce la citazione sopra, è lì per creare uno standard se si sta lavorando con una squadra.

mi manca qualcosa qui?

+1

sì, questo è ... –

+0

Wow, e qui sto cercando di renderlo più complicato di quanto lo sia. Grazie! –

+1

Il suggerimento tipo ti aiuta a cogliere rapidamente gli errori lamentandoti quando passi un parametro che non può accettare invece di accettarlo e poi lanciare misteriosi errori quando tenta di usarlo come oggetto di tipo X mentre in realtà è un oggetto di tipo Y. – apokryfos

risposta

13

Tipo hinting non è necessaria, ma è può permetterti di cogliere certi tipi di errori. Ad esempio, potresti avere una funzione o un metodo che richiede un numero intero. PHP invierà il numero happily convert "numero cercando stringhe" in numeri interi e questo può causare un comportamento difficile nel debug. Se specifichi nel tuo codice che hai specificamente bisogno di un numero intero, questo può prevenire quei tipi di bug in primo luogo. Molti programmatori considerano la protezione del loro codice in questo modo come una best practice.

Come esempio concreto di questo in azione, diamo un'occhiata a una versione aggiornata del file di index.php:

index.php

<?php 
include 'Song.php'; 
include 'Test.php'; 

$song_object = new Song; 
$test_object = new Test; 

$song_object->title = "Beat it!"; 
$song_object->lyrics = "It doesn't matter who's wrong or right... just beat it!"; 

$test_object->title = "Test it!"; 
$test_object->lyrics = "It doesn't matter who's wrong or right... just test it!"; 


function sing(Song $song) 
{ 
    echo "Singing the song called " . $song->title; 
    echo "<p>" . $song->lyrics . "</p>"; 
} 

sing($song_object); 
sing($test_object); 

Così come il nuovo file di Test.php ho aggiunto:

Test.php

<?php 

class Test 
{ 
    public $title; 
    public $lyrics; 
} 

Quando eseguo index.php ora, ottengo il seguente errore:

uscita:

Singing the song called Beat it!<p>It doesn't matter who's wrong or right... 
just beat it!</p>PHP Catchable fatal error: Argument 1 passed to sing() must 
be an instance of Song, instance of Test given, called in test/index.php on 
line 22 and defined in test/index.php on line 15 

Catchable fatal error: Argument 1 passed to sing() must be an instance of 
Song, instance of Test given, called in test/index.php on line 22 and defined 
in test/index.php on line 15 

Questo è PHP lasciare che mi conosce sa che ho cercato di utilizzare il tipo sbagliato di classe quando ho chiamato la funzione sing().

1

Il suggerimento è come se il nome fosse più un suggerimento. Permette agli sviluppatori di vedere quali classi possono essere passate come argomenti e impedisce loro di passare argomenti sbagliati. Questo è particolarmente utile se stai lavorando allo stesso progetto con più di una sola persona e/o il codice è pensato per l'open source.

In tipo php7 accennando per la stringa, int, (misto) e la matrice sono stati aggiunti in modo non è necessario solo le classi, ma anche possibile utilizzare i tipi standard di PHP

1

Il codice funziona correttamente con o senza il suggerimento del tipo.

Un suggerimento tipo ti costringe semplicemente a passare qualcosa di un tipo specifico a quella funzione/metodo.

E.g.

function displayNames($names) 
{ 
    foreach ($names as $n) { 
     echo $n; 
    } 
} 

Questa funzione dovrebbe funzionare bene supponendo che l'utente passata in una matrice come segue.

displayNames(array('Tom', 'John', 'Frank')); 

Tuttavia, PHP permetterebbe all'utente di passare nulla in, ad esempio una stringa, int, bool, oggetto, ecc Nessuno di questi avrebbe agito come ci si aspetta quando raggiunge la foreach all'interno della funzione displayNames .

L'aggiunta di un suggerimento tipo array impone il fatto che questa funzione prevede che $names sia una matrice.

function displayNames(array $names) 
{ 
    // We now KNOW that $names is an array. 
    foreach ($names as $n) { 
     echo $n; 
    } 
} 

Un array è un esempio semplice, ma come lei ha affermato è anche possibile digitare oggetti suggerimento. In tal caso, consente allo sviluppatore di accettare solo un'istanza di una connessione al database in un metodo doSqlQuery(), ad esempio.

Si deve sapere

versioni di PHP sotto 7 solo permetterà di tipo spunti per le classi (comprese le interfacce), e gli array. Per digitare il suggerimento per string, int, bool, ecc. È necessario utilizzare PHP 7.

2

Il suggerimento di tipo è un processo naturale. All'inizio può sembrare un lavoro extra, ma è molto utile in quanto il tuo progetto cresce in PHP. Consente una migliore leggibilità e rende più semplice l'applicazione del controllo degli errori e delle convenzioni di programmazione rigorosa. Ad esempio

$song = (object) new Song; 

$song->title = (string) "Beat it!"; 
$song->lyrics = (string) "It doesn't matter who's wrong or right... just beat it!"; 


function sing(SongInterface $song): string 
{ 
    $html = (string) "Singing the song called " . $song->title 
    . "<p>" . $song->lyrics . "</p>"; 

    return htmlentities($html, ENT_QUOTES, 'utf-8'); 
} 

echo sing($song); 

Utilizzando un'interfaccia, si definiscono solo le funzioni e quindi la si implementa in una classe di brani. In questo modo puoi sempre iniettare un'altra classe di brani (con nuove funzionalità e modifiche) senza rompere la tua applicazione. Scopri le interfacce oop: http://php.net/manual/en/language.oop5.interfaces.php

Da php7, puoi anche definire il tipo di ritorno di una funzione. https://wiki.php.net/rfc/return_types

Problemi correlati