Поиск…


Синтаксис

  • function f (ClassName $ param) {}
  • функция f (bool $ param) {}
  • функция f (int $ param) {}
  • функция f (float $ param) {}
  • функция f (строка $ param) {}
  • функция f (self $ param) {}
  • функция f (вызываемый $ param) {}
  • функция f (массив $ param) {}
  • функция f (? type_name $ param) {}
  • function f (): type_name {}
  • функция f (): void {}
  • функция f ():? type_name {}

замечания

Объявление типа намека или типа является защитной практикой программирования, которая гарантирует, что параметры функции имеют заданный тип. Это особенно полезно, когда тип намекает на интерфейс, поскольку он позволяет функции гарантировать, что предоставленный параметр будет иметь те же методы, которые требуются в интерфейсе.

Передача неправильного типа в тип намеченной функции приведет к фатальной ошибке:

Fatal error: Uncaught TypeError: Аргумент X, переданный foo (), должен иметь тип RequiredType , предоставляемый тип

Тип подсказки скалярных типов, массивов и вызовов

Поддержка параметров массива типа hinting (и возвращаемых значений после PHP 7.1) была добавлена ​​в PHP 5.1 с помощью array ключевых слов. Все массивы любых размеров и типов, а также пустые массивы являются допустимыми значениями.

В PHP 5.4 была добавлена ​​поддержка ссылочных ссылок типа. Любое значение is_callable() допустимо для параметров и возвращаемых значений, намеченных для callable , то есть объектов Closure , строковых имен функций и array(class_name|object, method_name) .

Если в имени функции есть опечатка, так что она не is_callable() , будет отображаться менее очевидное сообщение об ошибке:

Fatal error: Uncaught TypeError: аргумент 1, переданный foo (), должен быть типа вызываемого, строка / массив задан

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

Нестатические методы также могут передаваться как вызывающие вызовы в статическом формате, что приводит к предупреждению об отставке и ошибке уровня E_STRICT в PHP 7 и 5 соответственно.

Учитывается видимость метода. Если контекст метода с callable параметром не имеет доступа к предоставленному вызову, он будет заканчиваться так, как если бы метод не существовал.

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

Выход:

Fatal error: Uncaught TypeError: аргумент 1, переданный в r (), должен быть вызванным, массив задан

В PHP добавлена ​​поддержка типов сканов типа hinting. Это означает, что мы получаем поддержку boolean типов для boolean s, integer s, float и string s.

<?php

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

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

По умолчанию PHP будет пытаться использовать любой предоставленный аргумент для соответствия подсказке типа. Изменение вызова для add(1.5, 2) дает точно такой же результат, поскольку float 1.5 был добавлен в int PHP.

Чтобы остановить это поведение, нужно добавить declare(strict_types=1); в начало каждого исходного файла PHP, который требует его.

<?php

declare(strict_types=1);

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

var_dump(add(1.5, 2));

Вышеприведенный скрипт теперь вызывает фатальную ошибку:

Fatal error: Uncaught TypeError: аргумент 1, переданный в add (), должен иметь тип integer, float given

Исключение: особые типы

Некоторые функции PHP могут возвращать значение resource типа. Поскольку это не скалярный тип, а особый тип, его невозможно набрать.

Например, curl_init() вернет resource , а также fopen() . Конечно, эти два ресурса несовместимы друг с другом. Из - за этого, PHP-всегда будет бросать следующий TypeError , когда тип намекая resource в явном виде:

TypeError: аргумент 1, переданный sample (), должен быть экземпляром ресурса, ресурсом

Тип подсказки общих объектов

Поскольку объекты PHP не наследуются от какого-либо базового класса (включая stdClass ), нет поддержки типа, stdClass тип универсального объекта.

Например, нижеследующее не будет работать.

<?php

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

class ClassOne {}
class ClassTwo {}

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

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

И будет генерировать фатальную ошибку:

Fatal error: Uncaught TypeError: аргумент 1, переданный doSomething (), должен быть экземпляром объекта, экземпляр OperationOne указан

Обходным путем является объявление вырожденного интерфейса, который не определяет методы, и все объекты реализуют этот интерфейс.

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

Типы подсказок и интерфейсов типа

Тип PHP для классов и интерфейсов был добавлен в PHP 5.

Тип подсказки типа

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

Вышеупомянутые скриптовые выходы:

Крис учится в Университете Эдинбурга


Тип интерфейса подсказка

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

Вышеприведенный пример выводит то же, что и раньше:

Крис учится в Университете Эдинбурга

Подсказки типа «тип»

Ключевое слово self можно использовать как подсказку типа, чтобы указать, что это значение должно быть экземпляром класса, объявляющего метод.

Тип Hinting No Return (Пустота)

В PHP 7.1 был добавлен тип возврата void . В то время как у PHP нет фактического значения void , обычно понимается через языки программирования, что функция, которая ничего не возвращает, возвращает void . Это не следует путать с возвратом null , поскольку значение null - это значение, которое может быть возвращено.

function lacks_return(): void {
    // valid
}

Обратите внимание, что если вы объявляете возврат void , вы не можете вернуть никаких значений или вы получите фатальную ошибку:

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

Однако использование возврата для выхода из функции действительно:

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

Подсказки типа Nullable

параметры

В PHP 7.1 добавлен подсказку типа Nullable, используя команду ? оператора перед типом подсказки.

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

Перед PHP 7.1, если параметр имеет подсказку типа, он должен объявить значение по умолчанию null для принятия нулевых значений.

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

Возвращаемые значения

В PHP 7.0 функции с возвращаемым типом не должны возвращать значение null.

В PHP 7.1 функции могут объявлять подсказку типа nullable return type. Тем не менее, функция все равно должна возвращать null, а не void (no / empty return statements).

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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow