Я хочу определить функцию PHP 7, которая принимает параметр смешанного типа. (Что я хочу, это эквивалент параметра универсального типа в C #; если есть лучший способ эмулировать это в PHP 7, пожалуйста, дайте мне знать.)
Мой код выглядит следующим образом.
<?php
declare (strict_types = 1);
function test (mixed $s) : mixed {
return $s;
}
// Works
echo gettype ('hello');
// Does not work
echo test ('hello');
?>
Когда я запускаю этот код, я получаю следующее.
Fatal error: Uncaught TypeError: Argument 1 passed to test() must be an instance of mixed, string given, called in mixed.php on line 11 and defined in mixed.php:4
Stack trace:
#0 mixed.php(11): test('hello')
#1 {main}
thrown in mixed.php on line 4
Если я закомментирую вызов test (), код будет работать нормально, так что, по-видимому, по крайней мере я могу использовать смешанный тип параметра в объявлении функции.
Я знаю, что встроенные функции PHP, такие как gettype (), могут принимать смешанные параметры, хотя я не знаю, используют ли они внутри строгую типизацию.
Я вижу, что «смешанный» также используется в качестве псевдотипа в PHP документация, поэтому я могу неправильно понять цель «смешанного» в качестве ключевого слова PHP, но то, что я здесь вижу, по крайней мере, для меня означает, что это допустимое ключевое слово. Я просто использую это способом, для которого это не предназначено?
Наконец, я понимаю, что могу обойти все это, просто не указав тип параметра, но я бы хотел быть последовательным, указав все мои параметры и возвращаемые типы.
Спасибо и, пожалуйста, дайте мне знать, если я могу предоставить дополнительную информацию.
FYI смешанный это не тип. (Обратитесь к документации). Это только псевдотип: Подсказка, что любой тип может быть передан или возвращен из метода … или, возможно, для переменной, которая по какой-либо причине была свободно напечатана как смешанная …
В отличие от C #, то, что вы пытаетесь достичь, может быть сложно в PHP, особенно со строгим типом, установленным в true.
Тем не менее, вы можете добиться почти аналогичного эффекта без строгой типизации — в этом случае ваши методы могут принимать любой тип, если вы не предоставляете подсказки типа. Хотя для программистов C # это плохо — пока, это сок PHP.
Может быть,? -Оператор работает для этого также, как упоминалось на http://php.net/manual/de/functions.returning-values.php#functions.returning-values.type-declaration