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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow