2016-07-11 14 views
13

Ich habe Probleme, meinen Kopf über die Bedeutung von Typ Hinting in PHP einzuwickeln.Warum ist Typhinweis in PHP notwendig?

'Type Hinting' in PHP kann offenbar wie folgt definiert werden:

"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.

So auf der untersten Ebene Hinting geben, ist nicht erforderlich, tatsächlich um den Code Arbeit zu machen?

Ich habe den folgenden Code, um zu versuchen und zu verstehen, was auf ...

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; 
} 

wird die Code macht seine Sache mit oder ohne den kleinen Typhinweis in der Funktion sing();

enter image description here

Also, dies führt mich, dass Typ-Hinting zu glauben ist einfach eine Codierung Konvention sicher nur bestimmte Klassen machen verwendet werden und sind nicht zur Herstellung von funktionalen Code benötigt, ist das richtig?

Typ Hinting, wie das Zitat oben suggeriert, gibt es erstellen Sie einen Standard, wenn Sie mit einem Team arbeiten.

Fehle ich hier etwas?

+1

ja, das ist es ... –

+0

Wow, und hier versuche ich es komplizierter zu machen, als es ist. Vielen Dank! –

+1

Typhinweis hilft Ihnen, Fehler schnell zu finden, indem Sie einen Parameter übergeben, den er nicht akzeptieren kann, anstatt ihn zu akzeptieren und dann mysteriöse Fehler zu werfen, wenn er versucht, ihn als Objekt vom Typ X zu verwenden, während er in Wirklichkeit ein Objekt ist vom Typ Y. – apokryfos

Antwort

13

Type Hinting ist nicht erforderlich, aber es kann Ihnen erlauben, bestimmte Arten von Fehlern zu fangen. Zum Beispiel könnten Sie eine Funktion oder Methode haben, die eine ganze Zahl benötigt. PHP wird happily convert "Anzahl suchen Strings" in Ganzzahlen, und dies kann dazu führen, dass schwer Verhalten zu debuggen. Wenn Sie in Ihrem Code angeben, dass Sie speziell eine Ganzzahl benötigen, können Sie diese Art von Fehlern von vornherein verhindern. Viele Programmierer betrachten den Schutz ihres Codes auf diese Weise als Best Practice.

Als ein konkretes Beispiel dafür in Aktion, lassen Sie uns in einer aktualisierten Version Ihrer index.php Datei aussehen:

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); 

Neben der neuen Test.php Datei, die ich hinzugefügt:

Test.php

<?php 

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

Als ich index.php jetzt laufen ließe, erhalte ich folgende Fehlermeldung:

Ausgang:

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 

Dies wird im Stich gelassen PHP ich weiß, dass ich die falsche Art zu verwenden versucht, von Klasse, als ich die sing() Funktion anrief.

1

Typ Hinting ist wie der Name sagt eher einen Hinweis. Es ermöglicht Entwicklern zu sehen, welche Klassen als Argumente übergeben werden können und verhindert, dass sie falsche Argumente übergeben. Das ist besonders hilfreich, wenn Sie mit mehr als nur einer Person am selben Projekt arbeiten und/oder der Code für Open Source gedacht ist.

In php7 Typ für String-Hinting, int, (gemischt) und Array hinzugefügt wurden, so dass Sie nicht nur Klassen brauchen, sondern auch die Standard PHP-Typen verwenden können

1

Ihr Code würde laufen gut mit oder ohne den Typhinweis.

Ein Typhinweis zwingt Sie einfach, etwas von einem bestimmten Typ an diese Funktion/Methode zu übergeben.

z.

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

Diese Funktion funktioniert einwandfrei, wenn der Benutzer ein Array wie folgt übergeben hat.

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

Allerdings würde PHP dem Benutzer erlauben, passieren alles in, wie ein String, int, bool, Objekt, usw. Nichts davon würde handeln, wie Sie erwarten, wenn es die foreach Innenseite der displayNames Funktion erreicht .

Das Hinzufügen eines array Typhinweises erzwingt die Tatsache, dass diese Funktion $names als Array erwartet.

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

Ein Array ist ein einfaches Beispiel, aber wie Sie angegeben haben, können Sie auch Tippobjekte eingeben. In diesem Fall kann der Entwickler beispielsweise nur eine Instanz einer Datenbankverbindung in einer doSqlQuery()-Methode akzeptieren.

Sie sollten wissen,

PHP-Versionen unter 7 NUR Typ Hinweise für Klassen (einschließlich der Schnittstellen) und Arrays ermöglichen. Um einen Tipp für string, int, bool usw. einzugeben, müssen Sie PHP 7 verwenden.

2

Typ Hinting ist ein natürlicher Prozess. Am Anfang mag es wie zusätzliche Arbeit erscheinen, aber es ist sehr hilfreich, wenn Ihr Projekt in PHP wächst. Dies ermöglicht eine bessere Lesbarkeit und erleichtert die Anwendung von Fehlerbeherrschung und strengen Programmierkonventionen. Zum Beispiel

Mit einer Schnittstelle definieren Sie nur die Funktionen und implementieren sie dann in einer Song-Klasse. Auf diese Weise können Sie immer eine andere Song-Klasse (mit neueren Funktionen und Änderungen) einfügen, ohne Ihre Anwendung zu unterbrechen. Auschecken Schnittstellen: http://php.net/manual/en/language.oop5.interfaces.php

Seit php7 können Sie auch den Rückgabetyp einer Funktion definieren. https://wiki.php.net/rfc/return_types