Php вопросительный знак перед переменной

Описание типов — Основы PHP

В этом уроке мы поближе познакомимся с типами данных и обсудим нюансы работы с ними.

Когда мы пишем на PHP, то не особо задумываемся над типами данных. Мы просто пишем код и ожидаем, что данные будут соответствовать нашим ожиданиям:

 function sayHelloTo($name)  print_r("Hello, $name>"); > 

Функция выше ожидает на вход строку. Это видно по тому, как используется переменная $name . А что, если мы ошибемся и передадим массив? Давайте попробуем:

 // В функцию передается не то, что ожидается: sayHelloTo([]); // PHP Notice: Array to string conversion 

Код отработает, но результат не будет соответствовать нашим ожиданиям. Ничего страшного в таком поведении нет — это просто цена за использование динамической типизации.

В тех местах, где входной тип особенно важен, можно добавить соответствующую проверку и генерировать исключение, если переданы неверные данные. По крайней мере так делали раньше, до введения в язык механизма type hinting.

Type Hinting — это механизм, который позволяет явно указывать типы параметров. Интерпретатор использует их и применяет исключение в тех ситуациях, когда тип не соответствует ожидаемому. Так работает в большинстве языков, где присутствует этот механизм.

В PHP используется слабая типизация, поэтому здесь все чуть сложнее. Можно жестко указать тип int , но это не значит, что интерпретатор начнет ругаться на все остальное. Он выполнит автоматическое приведение и спокойно обработает и логический, и строковый тип данных.

Чтобы объявить тип аргумента, необходимо перед его именем добавить имя требуемого типа:

 // Тип int говорит, что ожидается число function sayHelloTo(int $name)  print_r("Hello, $name>"); > // Все, что может быть приведено к указанному типу, будет считаться подходящим sayHelloTo(false); // Hello, 0 sayHelloTo('1'); // Hello, 1 

Попробуем в качестве типа аргумента передать строку string :

 function sayHelloTo(string $name)  print_r("Hello, $name>"); > sayHelloTo([]); // PHP Fatal error: Uncaught TypeError: Argument 1 passed to sayHelloTo() must be of the type string, array given 

Теперь ошибка совсем другая — нам явно говорят, что типы не сошлись. Увидеть и исправить подобную ошибку уже значительно легче. Рассмотрим еще один пример с несколькими параметрами:

 function get(string $text, int $index, $default = null)  $length = strlen($text); return ($index >= 0) && ($index  $length) ? $text[$index] : $default; > get('hi', 3, 8); // 8 get('ho', 'hey'); // PHP Fatal error: Uncaught TypeError: Argument 2 passed to get() must be of the type integer, string given 

Обратите внимание на отсутствие типа у $default . Значение по умолчанию может быть абсолютно любым, поэтому тип не указывается.

Null не похож на другие типы данных и ведет себя особым образом. Дело в том, что типы данных в PHP не являются nullable — то есть они не допускают значение Null .

Представим, что мы ждем на вход значение определенного типа — например, строку. В PHP строка не может иметь значение Null . Но это ограничение можно обойти. Можно указать значение, по умолчанию равное Null , и тогда указанный тип становится nullable — появится возможность передавать Null снаружи.

Посмотрим, как это выглядит в коде:

Не nullable:

 function printStr(string $value)  echo $value; > printStr(null); // PHP Fatal error: Uncaught TypeError: Argument 1 passed to printStr() must be of the type string, null given 
 function printStr(string $value = null)  echo $value; > printStr(null); 

Начиная с версии PHP 7.2, в языке появилась возможность указывать тип не только для входящих параметров, но и для возврата функции. Оно записывается через двоеточие после закрывающей скобки:

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

Если мы ошибемся в теле функции выше и вернем строку, то интерпретатор скажет об этом:

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

 function sayItLoud(string $text): void  $loudText = "$text>!"; print_r($loudText); > 

Чтобы показать, что функция ничего не возвращает, нужно написать в ее сигнатуре после двоеточия — void .

Строгие типы

В его базовом варианте Type Hinting не очень помогает выявить ошибки типов. Он больше полезен в качестве документации и подсказок в редакторе.

Но в PHP есть специальная директива, включающая режим строгой проверки:

 // Включаем режим строгой проверки declare(strict_types = 1); function AddIntAndFloat(int $a, float $b): int  return $a + $b; > echo AddIntAndFloat(1.4, '2'); // Fatal error: Uncaught TypeError: Argument 1 passed to AddIntAndFloat() must be of the type int, float given echo AddIntAndFloat(1, '2'); // Fatal error: Uncaught TypeError: Argument 2 passed to AddIntAndFloat() must be of the type float, string given 

В таком варианте не происходит автоматического преобразования типов. PHP выполняет точную проверку и выводит ошибку, если типы не совпали.

Типы значений, допускающие значение NULL

Если поставить знак ? перед названием типа данных, то он помечается как обнуляемый — то есть допускающий значение Null .

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

 function isPersonMrSmith(?string $person): bool  // Тут какая-то логика > 

Запись выше означает, что функция isPersonMrSmith() может принять параметр-строку или null .

Стоит сказать, что null должен быть передан явно — isPersonMrSmith(null) . Иначе интерпретатор выдаст ошибку:

isPersonMrSmith(); // Fatal error: Uncaught ArgumentCountError: Too few arguments to function 

Посмотрим, как ? работает с типом возвращаемого значения:

 public function getName(string $person): ?string  // Тут какая-то логика > 

Функция getName() принимает переменную $person . Затем функция должна вернуть строку с именем человека. Но иногда строки с именем нет — тогда возвращается null .

Дополнительные материалы

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Об обучении на Хекслете

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов

Наши выпускники работают в компаниях:

Источник

Php вопросительный знак перед переменной

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.

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.

same data type and same value but first function declare as a argument type declaration and return int(7)
and second fucntion declare as a return type declaration but return int(8).

function argument_type_declaration(int $a, int $b) return $a+$b;
>

function return_type_declaration($a,$b) :int return $a+$b;
>

Источник

Что делают знаки вопроса перед типами переменных в параметрах?

Я хотел кое-что узнать о них, но я не могу найти их ни в документации PHP, ни в Google. В чем разница между ними?

4 ответа

Вы можете передать значение NULL , если есть параметр типа Nullable (с ? ), или значение того же типа.

Параметры:

function test(?string $parameter1, string $parameter2) < var_dump($parameter1, $parameter2); >test("foo","bar"); test(null,"foo"); test("foo",null); // Uncaught TypeError: Argument 2 passed to test() must be of the type string, null given, 

Тип возврата:

Тип возвращаемого значения функции также может иметь тип NULL и может возвращать null или указанный тип.

function error_func():int < return null ; // Uncaught TypeError: Return value must be of the type integer >function valid_func():?int < return null ; // OK >function valid_int_func():?int < return 2 ; // OK >

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

Параметры с обнуляемым типом не имеют значения по умолчанию. Если опущено, значение по умолчанию не равно нулю и приведет к ошибке:

функция f (? callable $ p) <>
F ( ) ; // недействительным; функция f не имеет значения по умолчанию

Это означает, что аргумент может быть передан как указанный тип или NULL:

Это примерно эквивалентно

 public function (string $parameter1 = null, string $parameter2) <> 

За исключением того, что аргумент все еще требуется, и ошибка будет выдана, если аргумент пропущен.

В частности, в этом контексте требуется второй аргумент, и использование =null сделает первый необязательным, что на самом деле не работает. Конечно, это работает, но я имею в виду, что на самом деле это не делает его необязательным, что является основной целью значений по умолчанию.

public function (?string $parameter1, string $parameter2) <> 

Синтаксически имеет немного больше смысла в этом случае.

Источник

Читайте также:  jQuery Google CDN
Оцените статью