PHP
Type hint
Zoeken…
Syntaxis
- functie f (ClassName $ param) {}
- functie f (bool $ param) {}
- functie f (int $ param) {}
- functie f (float $ param) {}
- functie f (string $ param) {}
- functie f (self $ param) {}
- functie f (callable $ param) {}
- functie f (array $ param) {}
- functie f (? type_name $ param) {}
- functie f (): type_name {}
- functie f (): void {}
- functie f ():? type_name {}
Opmerkingen
Typehints of typeaangiften zijn een defensieve programmeerpraktijk die ervoor zorgt dat de parameters van een functie van een bepaald type zijn. Dit is met name handig bij het typen van aanwijzingen voor een interface, omdat hiermee de functie kan garanderen dat een opgegeven parameter dezelfde methoden zal hebben als vereist zijn in de interface.
Het doorgeven van het onjuiste type aan een functie met een type hint geeft een fatale fout:
Fatale fout: Uncaught TypeError: Argument X doorgegeven aan foo () moet van het type RequiredType zijn , ProvidedType gegeven
Type hinting scalaire types, arrays en callables
Ondersteuning voor type hinting array parameters (en retourwaarden na PHP 7.1) is toegevoegd in PHP 5.1 met de keyword array
. Arrays van alle dimensies en typen, evenals lege arrays, zijn geldige waarden.
Ondersteuning voor type hints callables is toegevoegd in PHP 5.4. Alle waarden die is_callable()
geldt voor parameters en resultaatwaarden gezinspeeld callable
, dwz Closure
objecten, functies naamrijen en array(class_name|object, method_name)
.
Als een typefout voorkomt in de functienaam zodat deze niet is_callable()
, wordt een minder voor de hand liggende foutmelding weergegeven:
Fatale fout: Uncaught TypeError: Argument 1 doorgegeven aan foo () moet van het type callable zijn, string / array gegeven
function foo(callable $c) {}
foo("count"); // valid
foo("Phar::running"); // valid
foo(["Phar", "running"); // valid
foo([new ReflectionClass("stdClass"), "getName"]); // valid
foo(function() {}); // valid
foo("no_such_function"); // callable expected, string given
Niet-statische methoden kunnen ook worden doorgegeven als opvraagbaar in statisch formaat, wat resulteert in een afschrijvingswaarschuwing en niveau E_STRICT-fout in respectievelijk PHP 7 en 5.
Er wordt rekening gehouden met de zichtbaarheid van de methode. Als de context van de methode met de callable
parameter geen toegang heeft tot het opgegeven opvraagbare, zal het eindigen alsof de methode niet bestaat.
class Foo{
private static function f(){
echo "Good" . PHP_EOL;
}
public static function r(callable $c){
$c();
}
}
function r(callable $c){}
Foo::r(["Foo", "f"]);
r(["Foo", "f"]);
Output:
Fatale fout: Uncaught TypeError: Argument 1 doorgegeven aan r () moet opvraagbaar zijn, array gegeven
Ondersteuning voor scalaire typen voor hinting van typen is toegevoegd in PHP 7. Dit betekent dat we ondersteuning krijgen voor hinting van typen voor boolean
s, integer
s, float
s en string
s.
<?php
function add(int $a, int $b) {
return $a + $b;
}
var_dump(add(1, 2)); // Outputs "int(3)"
Standaard zal PHP proberen elk opgegeven argument te casten dat overeenkomt met de hint van het type. Het veranderen van de oproep om add(1.5, 2)
te add(1.5, 2)
geeft exact dezelfde uitvoer, aangezien de float 1.5
door PHP naar int
werd gecast.
Om dit gedrag te stoppen, moet men declare(strict_types=1);
bovenaan elk PHP-bronbestand dat dit vereist.
<?php
declare(strict_types=1);
function add(int $a, int $b) {
return $a + $b;
}
var_dump(add(1.5, 2));
Het bovenstaande script produceert nu een fatale fout:
Fatale fout: Uncaught TypeError: Argument 1 doorgegeven om toe te voegen () moet van het type integer zijn, float gegeven
Een uitzondering: speciale typen
Sommige PHP-functies kunnen een waarde van het type resource
retourneren. Aangezien dit geen scalair type is, maar een speciaal type, is het niet mogelijk om een hint te typen.
Bijvoorbeeld, curl_init()
retourneert een resource
, evenals fopen()
. Natuurlijk zijn die twee bronnen niet compatibel met elkaar. Daarom gooit PHP 7 altijd de volgende TypeError bij resource
expliciet typen van hints:
TypeError: Argument 1 doorgegeven aan sample () moet een instantie van resource zijn, resource gegeven
Typ hinting generieke objecten
Omdat PHP-objecten van geen enkele basisklasse (inclusief stdClass
) erven, is er geen ondersteuning voor stdClass
voor een generiek objecttype.
Het onderstaande werkt bijvoorbeeld niet.
<?php
function doSomething(object $obj) {
return $obj;
}
class ClassOne {}
class ClassTwo {}
$classOne= new ClassOne();
$classTwo= new ClassTwo();
doSomething($classOne);
doSomething($classTwo);
En zal een fatale fout veroorzaken:
Fatale fout: Uncaught TypeError: Argument 1 doorgegeven aan doSomething () moet een instantie van object zijn, instantie van OperationOne gegeven
Een oplossing hiervoor is om een gedegenereerde interface aan te geven die geen methoden definieert en al uw objecten deze interface laten implementeren.
<?php
interface Object {}
function doSomething(Object $obj) {
return $obj;
}
class ClassOne implements Object {}
class ClassTwo implements Object {}
$classOne = new ClassOne();
$classTwo = new ClassTwo();
doSomething($classOne);
doSomething($classTwo);
Type hintklassen en interfaces
Type hinting voor klassen en interfaces is toegevoegd in PHP 5.
Klasse type hint
<?php
class Student
{
public $name = 'Chris';
}
class School
{
public $name = 'University of Edinburgh';
}
function enroll(Student $student, School $school)
{
echo $student->name . ' is being enrolled at ' . $school->name;
}
$student = new Student();
$school = new School();
enroll($student, $school);
Bovenstaand script geeft uit:
Chris wordt ingeschreven aan de Universiteit van Edinburgh
Interface type hint
<?php
interface Enrollable {};
interface Attendable {};
class Chris implements Enrollable
{
public $name = 'Chris';
}
class UniversityOfEdinburgh implements Attendable
{
public $name = 'University of Edinburgh';
}
function enroll(Enrollable $enrollee, Attendable $premises)
{
echo $enrollee->name . ' is being enrolled at ' . $premises->name;
}
$chris = new Chris();
$edinburgh = new UniversityOfEdinburgh();
enroll($chris, $edinburgh);
In het bovenstaande voorbeeld wordt hetzelfde als eerder uitgevoerd:
Chris wordt ingeschreven aan de Universiteit van Edinburgh
Zelftype tips
Het self
sleutelwoord kan worden gebruikt als een typehint om aan te geven dat de waarde een instantie van de klasse moet zijn die de methode aangeeft.
Type Hinting No Return (ongeldig)
In PHP 7.1 is het type void
return toegevoegd. Hoewel PHP geen werkelijke void
waarde heeft, wordt in de programmeertalen over het algemeen begrepen dat een functie die niets retourneert, void
. Dit moet niet worden verward met het retourneren van null
, omdat null
een waarde is die kan worden geretourneerd.
function lacks_return(): void {
// valid
}
Merk op dat als u een void
aangifte void
, u geen waarden kunt retourneren of dat u een fatale foutmelding krijgt:
function should_return_nothing(): void {
return null; // Fatal error: A void function must not return a value
}
Als u Return gebruikt om af te sluiten, is de functie echter geldig:
function returns_nothing(): void {
return; // valid
}
Nullable type hints
parameters
Nullable type hint werd toegevoegd in PHP 7.1 met behulp van de ?
operator vóór de hint van het type.
function f(?string $a) {}
function g(string $a) {}
f(null); // valid
g(null); // TypeError: Argument 1 passed to g() must be of the type string, null given
Vóór PHP 7.1, als een parameter een typehint heeft, moet deze een standaardwaarde null
declareren om null-waarden te accepteren.
function f(string $a = null) {}
function g(string $a) {}
f(null); // valid
g(null); // TypeError: Argument 1 passed to g() must be of the type string, null given
Retourwaarden
In PHP 7.0 mogen functies met een retourtype niet null retourneren.
In PHP 7.1 kunnen functies een nullable return type hint declareren. De functie moet echter nog steeds null retourneren, niet ongeldig (geen / lege retourinstructies).
function f() : ?string {
return null;
}
function g() : ?string {}
function h() : ?string {}
f(); // OK
g(); // TypeError: Return value of g() must be of the type string or null, none returned
h(); // TypeError: Return value of h() must be of the type string or null, none returned