2016-05-13 1 views
7

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

Если я закомментировать вызов, чтобы проверить(), код работает нормально, так что, по-видимому, это по крайней мере, хорошо для меня, чтобы использовать смешанный тип параметра в объявлении функции.

Я знаю, что встроенные функции PHP, такие как gettype(), могут принимать смешанные параметры, хотя я не знаю, внутренне ли они используют строгую типизацию.

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

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

Благодарим вас и сообщите, если я могу предоставить дополнительную информацию.

+2

Да, 'mixed' не реальный тип. И постоянство является ортогональным к правильной семантике здесь. – mario

+2

FYI смешанный не тип. (http://php.net/manual/en/language.pseudo-types.php) Это всего лишь ** псевдо-тип **: подсказка о том, что любой тип может быть передан или возвращен из метода ... или возможно, для переменной, которая была свободно напечатана как смешанная по любой причине ... В отличие от C#, то, что вы пытаетесь достичь, может быть сложным в PHP, особенно ** со строкой_types, установленным в true **. Тем не менее, вы можете добиться почти аналогичного эффекта без Strict Typing, и в этом случае ваши методы могут принимать любой тип, если вы не даете никаких подсказок типа. Хотя для программистов на C# это еще плохо, но это сок PHP ** – Poiz

+1

Большое спасибо марио и поэзия. Похоже, я просто соглашусь добавить/* mixed */в качестве комментария. – FSharpN00b

ответ

7

FYI смешанные не является типом. (Refer to the Documentation). Это только тип псевдо: намек, что любой тип может быть передан или возвращаемой из метода ... или, возможно, для переменной, которая была слабо типизированных как смешанные по любой причине ...

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

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

0

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

+0

Добро пожаловать в переполнение стека! Это граничная ссылка [link-only answer] (// meta.stackexchange.com/q/8231). Вы должны расширить свой ответ, указав здесь как можно больше информации, и используйте ссылку только для справки. – FrankerZ