PHP 7: Как использовать смешанный тип параметра в моих собственных функциях?

Я хочу определить функцию PHP 7, которая принимает параметр смешанного типа. (То, что я хочу, является эквивалентом параметра общего типа в С#, если есть лучший способ подражать этому в 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(), могут принимать смешанные параметры, хотя я не знаю, внутренне ли они используют строгую типизацию.

Я вижу, что "mixed" также используется как псевдо-тип в PHP документации, поэтому я мог бы неправильно понять цель "смешанного", как ключевое слово PHP, но то, что я вижу здесь, по крайней мере, подразумевает, что это законное ключевое слово. Я просто использую его так, как он не предназначен?

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

Спасибо, и, пожалуйста, дайте мне знать, если я могу предоставить дополнительную информацию.

Ответ 1

FYI mixed не является типом. (Обратитесь к документации). Это всего лишь псевдо-тип: подсказка о том, что любой тип может быть передан или возвращен из метода... или, возможно, для переменной, которая была свободно напечатана как смешанная по любой причине...

В отличие от С#, то, что вы пытаетесь достичь, может оказаться сложным в PHP, особенно , при этом strict_types устанавливается в true.

Тем не менее, вы можете добиться почти аналогичного эффекта без Strict Typing - в этом случае ваши методы могут принимать любой тип, если вы не даете никаких подсказок типов. Хотя для программистов на С# это плохо, но , это сок PHP.

Ответ 2

Чтобы указать, что функция также принимает значение null, для этого также работает? -operator, как указано на http://php.net/manual/de/functions.returning-values.php#functions.returning-values.type-declaration

Но это применимо только в том случае, если код не должен быть обратно совместимым, потому что эта функция доступна только на PHP> = 7.1. Как вы можете видеть на https://wiki.php.net/rfc/mixed-typehint там как RFC для добавление смешанного типа подсказки. Так что на самом деле, похоже, нет шансов определить правильную подсказку типа для параметров, которые принимают больше одного типа.

Таким образом, комментарий phpDoc может быть решением (и он также обратно совместим). Пример:

/**
* Functiondescription
* @author FSharpN00b
* @param mixed $s
* @return mixed
**/
function test ($s){
    return $s;
}