Sök…


Syntax

  • funktion f (ClassName $ param) {}
  • funktion f (bool $ param) {}
  • funktion f (int $ param) {}
  • funktion f (flyta $ param) {}
  • funktion f (sträng $ param) {}
  • funktion f (self $ param) {}
  • funktion f (kallbara $ param) {}
  • funktion f (array $ param) {}
  • funktion f (? typ_namn $ param) {}
  • funktion f (): typnamn {}
  • funktion f (): void {}
  • funktion f ():? typ_namn {}

Anmärkningar

Typtips eller typdeklarationer är en defensiv programmeringspraxis som säkerställer att en funktions parametrar är av en specifik typ. Detta är särskilt användbart när du antyder ett tip för ett gränssnitt eftersom det gör att funktionen kan garantera att en tillhandahållen parameter har samma metoder som krävs i gränssnittet.

Att skicka den felaktiga typen till en typ som antyder funktion leder till ett dödligt fel:

Dödligt fel: Uncched TypeError: Argument X som skickas till foo () måste vara av typen RequiredType , ProvidedType given

Skriv antydande skalartyper, matriser och inriktningar

Stöd för typparameterparametrar (och returnvärden efter PHP 7.1) lades till i PHP 5.1 med nyckelordet array . Alla matriser av alla dimensioner och typer, liksom tomma matriser, är giltiga värden.

Stöd för typ antydningsberäkningar tillkom i PHP 5.4. Alla värden som kan is_callable() är giltiga för parametrar och callable kan callable , dvs. Closure , funktionsnamnsträngar och array(class_name|object, method_name) .

Om en skrivfel förekommer i funktionsnamnet så att den inte är kan is_callable() , skulle ett mindre uppenbart felmeddelande visas:

Dödligt fel: Uncailed TypeError: Argument 1 som skickas till foo () måste vara av typen som kan kallas, sträng / array anges

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

Icke-statiska metoder kan också skickas som kallbara i statisk format, vilket resulterar i en avskrivningsvarning och nivå E_STRICT-fel i PHP 7 respektive 5.

Metodens synlighet beaktas. Om metodens sammanhang med den callable parametern inte har tillgång till den tillhandahållbara inbäddade, kommer den att hamna som om metoden inte finns.

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

Produktion:

Dödligt fel: Uncched TypeError: Argument 1 som skickas till r () måste kunna kallas, matris ges

Stöd för typ antydande skalartyper lades till i PHP 7. Detta innebär att vi får typ antydningsstöd för boolean , integer , float s och string .

<?php

function add(int $a, int $b) {
    return $a + $b;
}

var_dump(add(1, 2)); // Outputs "int(3)"

Som standard kommer PHP att försöka kasta alla tillhandahållna argument för att matcha dess typtips. Ändring av samtalet för att add(1.5, 2) ger exakt samma utgång, eftersom flottören 1.5 gjordes till int av PHP.

För att stoppa detta beteende måste man lägga till declare(strict_types=1); till toppen av alla PHP-källfiler som kräver det.

<?php

declare(strict_types=1);

function add(int $a, int $b) {
    return $a + $b;
}

var_dump(add(1.5, 2));

Ovanstående skript producerar nu ett dödligt fel:

Dödligt fel: Uncched TypeError: Argument 1 som skickas för att lägga till () måste vara av typen heltal, float given

Ett undantag: specialtyper

Vissa PHP-funktioner kan returnera ett värde av resource . Eftersom detta inte är en skalartyp, utan en speciell typ, är det inte möjligt att skriva antydan.

Som exempel kommer curl_init() att returnera en resource samt fopen() . Naturligtvis är dessa två resurser inte kompatibla med varandra. På grund av detta kommer PHP 7 alltid att kasta följande TypeError när du typ antyder resource uttryckligen:

TypeError: Argument 1 som skickas till provet () måste vara en instans av resurs, resurs ges

Skriv antydande generiska objekt

Eftersom PHP-objekt inte ärver från någon basklass (inklusive stdClass ) finns det inget stöd för typ som antyder en generisk objekttyp.

Nedan fungerar till exempel inte.

<?php

function doSomething(object $obj) {
    return $obj;
}

class ClassOne {}
class ClassTwo {}

$classOne= new ClassOne();
$classTwo= new ClassTwo();

doSomething($classOne);
doSomething($classTwo);

Och kommer att kasta ett dödligt fel:

Dödligt fel: Uncched TypeError: Argument 1 som skickas till doSomething () måste vara en förekomst av objekt, instans av OperationOne given

En lösning på detta är att förklara ett degenererat gränssnitt som inte definierar några metoder och att alla dina objekt implementerar detta gränssnitt.

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

Skriv antydningsklasser och gränssnitt

Typtips för klasser och gränssnitt lades till i PHP 5.

Klasstips

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

Ovanstående skript matar ut:

Chris går in på University of Edinburgh


Tips för gränssnittstyp

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

Exemplet ovan matar ut samma sak som tidigare:

Chris går in på University of Edinburgh

Tips om självtyp

Den self nyckelord kan användas som en typ ledtråd för att indikera att värdet måste vara en instans av den klass som deklarerar metoden.

Skriv antydan ingen återkomst (upphör)

I PHP 7.1 lades typen av void tillbaka. Medan PHP inte har något faktiskt void förstås det generellt över programmeringsspråk att en funktion som returnerar ingenting returnerar void . Detta bör inte förväxlas med att returnera null , eftersom null är ett värde som kan returneras.

function lacks_return(): void {
    // valid
}

Observera att om du förklarar en void återgång kan du inte returnera några värden eller så får du ett dödligt fel:

function should_return_nothing(): void {
    return null; // Fatal error: A void function must not return a value
}

Men med retur för att lämna funktionen är giltig:

function returns_nothing(): void {
    return; // valid
}

Tips om nullable typ

parametrar

Tips om nullable typ tillkom i PHP 7.1 med hjälp av ? operatör innan typtippet.

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

Innan PHP 7.1, om en parameter har en typtips, måste den förklara ett standardvärde null att acceptera nollvärden.

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

Returnera värden

I PHP 7.0 får funktioner med en returtyp inte returnera noll.

I PHP 7.1 kan funktioner förklara en antydan om returtyp av returtyp. Funktionen måste emellertid fortfarande returnera noll, inte ogiltig (inga / tomma returrätt).

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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow