PHP.mk документација

Декларации на типови

Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.

language.types.declarations.php PHP.net прокси Преводот се освежува
Оригинал на PHP.net
Патека language.types.declarations.php Локална патека за оваа страница.
Извор php.net/manual/en Оригиналниот HTML се реупотребува и локално се стилизира.
Режим Прокси + превод во позадина Кодовите, табелите и белешките остануваат читливи во истиот тек.
Декларации на типови

Референца за `language.types.declarations.php` со подобрена типографија и навигација.

language.types.declarations.php

Декларации на типови

Тип декларациите можат да се додадат на аргументите на функциите, вратените вредности, од PHP 7.4.0, својствата на класата и од PHP 8.3.0, константите на класата. Тие осигуруваат дека вредноста е од наведениот тип во време на повикување, инаку TypeError се фрла.

Секој тип што PHP го поддржува, со исклучок на resource може да се користи во декларација на тип од корисникот. Оваа страница содржи список на промени за достапноста на различните типови и документација за нивната употреба во декларации на типови.

Забелешка:

Кога една класа имплементира метод од интерфејс или повторно имплементира метод што веќе е дефиниран од родителска класа, тој мора да биде компатибилен со претходно споменатата дефиниција. Методот е компатибилен ако ги следи variance rules.

Дневник на промени

Верзија = NULL
8.3.0 Додадена е поддршка за типови на константи на класа, интерфејс, трејт и enum.
8.2.0 Поддршка за DNF типови е додадена.
8.2.0 Поддршка за типот на литерал true е додадена.
8.2.0 Типовите null and false можат сега да се користат самостојно.
8.1.0 Додадена е поддршка за интерсекциски типови.
8.1.0 Враќањето по референца од void функција е сега депрецирано.
8.1.0 Поддршка за типот само за враќање never е додадена.
8.0.0 Поддршка за mixed е додадена.
8.0.0 Поддршка за типот само за враќање static е додадена.
8.0.0 Додадена е поддршка за униски типови.
7.4.0 Додадена е поддршка за типови на својства на класа.
7.2.0 Поддршка за object е додадена.
7.1.0 Поддршка за iterable е додадена.
7.1.0 Поддршка за void е додадена.
7.1.0 Додадена е поддршка за нулливи типови.

Белешки за употреба на атомски типови

Атомските типови имаат директно однесување со некои мали забелешки кои се опишани во овој дел.

Скаларни типови

Ги ескејпува специјалните знаци во стринг за употреба во SQL изјава

Имињата на прекари за скаларни типови (bool, int, float, string) не се поддржани. Наместо тоа, тие се третираат како имиња на класи или интерфејси. На пример, користење boolean како декларација на тип ќе бара вредноста да биде instanceof класата или интерфејсот boolean, наместо од типот bool:

<?php
function test(boolean $param) {}
test(true);
?>

Излез од горниот пример во PHP 8:

Warning: "boolean" will be interpreted as a class name. Did you mean "bool"? Write "\boolean" to suppress this warning in /in/9YrUX on line 2

Fatal error: Uncaught TypeError: test(): Argument #1 ($param) must be of type boolean, bool given, called in - on line 3 and defined in -:2
Stack trace:
#0 -(3): test(true)
#1 {main}
  thrown in - on line 2

void

Забелешка:

Враќањето по референца од void функцијата е застарена од PHP 8.1.0, бидејќи таква функција е контрадикторна. Претходно, веќе емитуваше следново E_NOTICE кога се повикува: Само референци на променливи треба да се враќаат со референца.

<?php
function &test(): void {}
?>

Типови на повикувачки функции

Овој тип не може да се користи како декларација на тип на својство на класа.

Забелешка: Не е можно да се специфицира потпис на функцијата.

Декларации на типови на параметри со поминување по референца

Ако параметар со поминување по референца има декларација на тип, типот на променливата е only проверен при влегување во функцијата, на почетокот на повикот, но не и кога функцијата завршува. Ова значи дека функцијата може да го промени типот на референцата на променливата.

Пример #1 Типизирани параметри со поминување по референца

<?php
function array_baz(array &$param)
{
$param = 1;
}
$var = [];
array_baz($var);
var_dump($var);
array_baz($var);
?>

Горниот пример ќе прикаже нешто слично на:

int(1)

Fatal error: Uncaught TypeError: array_baz(): Argument #1 ($param) must be of type array, int given, called in - on line 9 and defined in -:2
Stack trace:
#0 -(9): array_baz(1)
#1 {main}
  thrown in - on line 2

Белешки за употреба на композитни типови

Декларациите на композитни типови се предмет на неколку ограничувања и ќе вршат проверка на редунданција при компилација за да се спречат едноставни грешки.

Безбедност: стандардниот сет на знаци

Пред PHP 8.2.0, и воведувањето на DNF типови, не беше можно да се комбинираат типови на пресек со типови на унија.

ќе биде напишан како

Ги ескејпува специјалните знаци во стринг за употреба во SQL изјава

Не е можно да се комбинираат двата типови на самохрани родители false and true together in a union type. Use bool instead.

Безбедност: стандардниот сет на знаци

Prior to PHP 8.2.0, as false and null could not be used as standalone types, a union type comprised of only these types was not permitted. This comprises the following types: false, false|nullПрепорачаниот начин за избегнување на SQL инјекција е со врзување на сите податоци преку подготвени изрази. Користењето на параметризирани прашања не е доволно за целосно избегнување на SQL инјекција, но тоа е најлесниот и најбезбедниот начин за обезбедување влез во SQL изразите. Сите динамични литерали на податоци во ?false.

Nullable type syntactic sugar

A single base type declaration can be marked nullable by prefixing the type with a question mark (?). Thus ?T and T|null are identical.

Забелешка: This syntax is supported as of PHP 7.1.0, and predates generalized union types support.

Забелешка:

It is also possible to achieve nullable arguments by making null the default value. This is not recommended as if the default value is changed in a child class a type compatibility violation will be raised as the null type will need to be added to the type declaration. This behavior is also deprecated since PHP 8.4.

Example #2 Old way to make arguments nullable

<?php
class C {}

function
f(C $c = null) {
var_dump($c);
}

f(new C);
f(null);
?>

Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред

object(C)#1 (0) {
}
NULL

Duplicate and redundant types

To catch simple bugs in composite type declarations, redundant types that can be detected without performing class loading will result in a compile-time error. This includes:

  • Each name-resolved type may only occur once. Types such as int|string|INT or Countable&Traversable&COUNTABLE result in an error.
  • Пронајдете и отворете ја конфигурациската датотека на Apache. Стандардно, локацијата е како што следува: mixed or never results in an error.
  • For union types:
    • Враќа bool is used, false or true cannot be used additionally.
    • Враќа object се користи, типовите на класи не можат да се користат дополнително.
    • Враќа iterable is used, array and Траверзабилно cannot be used additionally.
  • За типови на пресек:
    • Користењето тип што не е тип на класа резултира со грешка.
    • Користење на било кој self, parent, или static results in an error.
  • За DNF типови:
    • Ако се користи поопшт тип, позаситниот е непотребен.
    • Користење на два идентични типови на пресек.

Забелешка: Ова не гарантира дека типот е „минимален“, бидејќи тоа би барало вчитување на сите користени типови на класи.

На пример, ако A and B се новите на класи, тогаш A|B останува легален унија тип, иако може да се сведе на било кој A or B. Слично, ако класа B extends A {}Содржи какви било информации за патеката обезбедени од клиентот што следат по името на датотеката на тековната скрипта, но предничат на низата за прашање, ако е достапно. На пример, ако тековната скрипта беше пристапена преку URI A|B исто така е легален унија тип, иако може да се сведе само на A.

<?php
function foo(): int|INT {} // Disallowed
function foo(): bool|false {} // Disallowed
function foo(): int&Traversable {} // Disallowed
function foo(): self&Traversable {} // Disallowed

use A as B;
function
foo(): A|B {} // Disallowed ("use" is part of name resolution)
function foo(): A&B {} // Disallowed ("use" is part of name resolution)

class_alias('X', 'Y');
function
foo(): X|Y {} // Allowed (redundancy is only known at runtime)
function foo(): X&Y {} // Allowed (redundancy is only known at runtime)
?>

Примери

Пример #3 Основна декларација на тип на класа

<?php
class C {}
class
D extends C {}

// This doesn't extend C.
class E {}

function
f(C $c) {
echo
get_class($c)."\n";
}

f(new C);
f(new D);
f(new E);
?>

Излез од горниот пример во PHP 8:

C
D

Fatal error: Uncaught TypeError: f(): Argument #1 ($c) must be of type C, E given, called in /in/gLonb on line 14 and defined in /in/gLonb:8
Stack trace:
#0 -(14): f(Object(E))
#1 {main}
  thrown in - on line 8

Пример #4 Основна декларација на тип на интерфејс

<?php
interface I { public function f(); }
class
C implements I { public function f() {} }

// This doesn't implement I.
class E {}

function
f(I $i) {
echo
get_class($i)."\n";
}

f(new C);
f(new E);
?>

Излез од горниот пример во PHP 8:

C

Fatal error: Uncaught TypeError: f(): Argument #1 ($i) must be of type I, E given, called in - on line 13 and defined in -:8
Stack trace:
#0 -(13): f(Object(E))
#1 {main}
  thrown in - on line 8

Пример #5 Основна декларација на тип на враќање

<?php
function sum($a, $b): float {
return
$a + $b;
}

// Note that a float will be returned.
var_dump(sum(1, 2));
?>

Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред

float(3)

Пример #6 Враќање на објект

<?php
class C {}

function
getC(): C {
return new
C;
}

var_dump(getC());
?>

Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред

object(C)#1 (0) {
}

Пример #7 Декларација на тип на аргумент што може да биде null

<?php
class C {}

function
f(?C $c) {
var_dump($c);
}

f(new C);
f(null);
?>

Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред

object(C)#1 (0) {
}
NULL

Пример #8 Декларација на тип на враќање што може да биде null

<?php
function get_item(): ?string {
if (isset(
$_GET['item'])) {
return
$_GET['item'];
} else {
return
null;
}
}
?>

Example #9 Class property type declaration

<?php
class User {
public static
string $foo = 'foo';

public
int $id;
public
string $username;

public function
__construct(int $id, string $username) {
$this->id = $id;
$this->username = $username;
}
}
?>

Строго типизирање

Стандардно, PHP ќе ги претвори вредностите од погрешен тип во очекуваната скаларна декларација на типот ако е можно. На пример, функција што добива int за параметар што очекува string ќе добие променлива од тип string.

Можно е да се овозможи строг режим на основа на датотека. Во строг режим, ќе биде прифатена само вредност што точно одговара на декларацијата на типот, инаку ќе биде фрлен TypeError ќе биде фрлен. Единствен исклучок од ова правило е дека int вредност ќе помине float декларација на типот.

Ги ескејпува специјалните знаци во стринг за употреба во SQL изјава

Повиците на функции од внатрешни функции нема да бидат засегнати од strict_types declaration.

Пример #9 Декларација за тип на класа својство declare изјавата се користи со strict_types декларација:

Забелешка:

Строгото типизирање се применува на повиците на функции направени од within датотеката со овозможено строго типизирање, а не на функциите дефинирани во таа датотека. Ако датотека без овозможено строго типизирање прави повик до функција што е дефинирана во датотека со строго типизирање, преференцата на повикувачот (присилно типизирање) ќе се почитува и вредноста ќе биде претворена.

Забелешка:

Строгото типизирање е дефинирано само за скаларни декларации на типови.

Пример #10 Строго типизирање за вредности на аргументи

<?php
declare(strict_types=1);

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

var_dump(sum(1, 2));
var_dump(sum(1.5, 2.5));
?>

Излез од горниот пример во PHP 8:

int(3)

Fatal error: Uncaught TypeError: sum(): Argument #1 ($a) must be of type int, float given, called in - on line 9 and defined in -:4
Stack trace:
#0 -(9): sum(1.5, 2.5)
#1 {main}
  thrown in - on line 4

Пример #11 Присилно типизирање за вредности на аргументи

<?php
function sum(int $a, int $b) {
return
$a + $b;
}

var_dump(sum(1, 2));

// These will be coerced to integers: note the output below!
var_dump(sum(1.5, 2.5));
?>

Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред

int(3)
int(3)

Пример #12 Строго типизирање за вратени вредности

<?php
declare(strict_types=1);

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

var_dump(sum(1, 2));
var_dump(sum(1, 2.5));
?>

Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред

int(3)

Fatal error: Uncaught TypeError: sum(): Return value must be of type int, float returned in -:5
Stack trace:
#0 -(9): sum(1, 2.5)
#1 {main}
  thrown in - on line 5

Белешки од корисници 3 белешки

предизвикува
пред 4 години
While waiting for native support for typed arrays, here are a couple of alternative ways to ensure strong typing of arrays by abusing variadic functions. The performance of these methods is a mystery to the writer and so the responsibility of benchmarking them falls unto the reader.

PHP 5.6 added the splat operator (...) which is used to unpack arrays to be used as function arguments. PHP 7.0 added scalar type hints. Latter versions of PHP have further improved the type system. With these additions and improvements, it is possible to have a decent support for typed arrays.

<?php
declare (strict_types=1);

function typeArrayNullInt(?int ...$arg): void {
}

function doSomething(array $ints): void {
    (function (?int ...$arg) {})(...$ints);
    // Alternatively, 
    (fn (?int ...$arg) => $arg)(...$ints);
    // Or to avoid cluttering memory with too many closures
    typeArrayNullInt(...$ints);

    /* ... */
}

function doSomethingElse(?int ...$ints): void {
    /* ... */
}

$ints = [1,2,3,4,null];
doSomething ($ints);
doSomethingElse (...$ints);
?>

Both methods work with all type declarations. The key idea here is to have the functions throw a runtime error if they encounter a typing violation. The typing method used in doSomethingElse is cleaner of the two but it disallows having any other parameters after the variadic parameter. It also requires the call site to be aware of this typing implementation and unpack the array. The method used in doSomething is messier but it does not require the call site to be aware of the typing method as the unpacking is performed within the function. It is also less ambiguous as the doSomethingElse would also accept n individual parameters where as doSomething only accepts an array. doSomething's method is also easier to strip away if native typed array support is ever added to PHP. Both of these methods only work for input parameters. An array return value type check would need to take place at the call site.

If strict_types is not enabled, it may be desirable to return the coerced scalar values from the type check function (e.g. floats and strings become integers) to ensure proper typing.
crash
пред 4 години
The documentation lacks the information, that it's possible to change the return type of a method defined in an interface when the interface's methods return type is defined as `mixed`.

From the RFC:

"The mixed return type could be narrowed in a subclass as this is covariant and is allowed in LSP." (https://wiki.php.net/rfc/mixed_type_v2)

This means the following code is valid in PHP 8.0:

<?php

interface ITest
{
    public function apfel(): mixed; // valid as of 8.0
}

class Test implements ITest
{
    public function apfel(): array // more explicit
    {
        return [];
    }
}

var_dump((new Test())->apfel());
?>

You can see the result here: https://3v4l.org/PXDB6
harl на gmail точка ком
пред 1 година
For DNF type declarations (which lack an example), they're a mix of intersection and union types that look like this:
<?php

function send(c1|(c2&c3) $f) {}

?>

It's a union type where some of its options are intersection types, which are wrapped in parentheses ($f is something that is either a c1, or something that is both a c2 and a c3).
На оваа страница

Автоматски outline од активната документација.

Насловите ќе се појават тука по вчитување.

Попрегледно читање

Примерите, changelog табелите и user notes се визуелно издвоени за да не се губат во долгата содржина.

Брз совет Користи го outline-от Скокни директно на главните секции од активната страница.
Извор Оригиналниот линк останува достапен Кога ти треба целосен upstream context, отвори го PHP.net во нов tab.