PHP
Skriv antydning
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