Как заставить аргументы быть целыми числами / строкой - PullRequest
21 голосов
/ 25 марта 2011

Я бы хотел, чтобы мои функции ожидали строки / целые числа или подбрасывали, например:

предупреждение: preg_match () ожидает, что параметр 2 будет строкой

Однако для этой функции

public function setImage($target, $source_path, integer $width, integer $height){...

я получаю:

Аргумент 4, передаваемый в My_Helper_Image :: setImage (), должен быть экземпляром целого числа, целого числа

Но:

function(array $expectsArray)

работает, как я ожидал, как бы я достиг того же эффекта, что и с целыми числами и строками?

Большое обновление

PHP 7 теперь поддерживает скалярный тип подсказки

function increment(int $number) {
     return $number++;
}

Ответы [ 4 ]

25 голосов
/ 25 марта 2011

Скалярные TypeHints доступны с PHP 7 :

Скалярные объявления типов бывают двух видов: принудительные (по умолчанию) и строгие.Следующие типы параметров теперь могут быть принудительно применены (принудительно или строго): строки (строка), целые числа (int), числа с плавающей запятой (float) и логические значения (bool).Они дополняют другие типы, представленные в PHP 5: имена классов, интерфейсы, массивы и возможности вызова.

До PHP7 нет подсказок типов для скаляров. В PHP 5.3.99 действительно были скалярные шрифты , но на тот момент он еще не был завершен, если они останутся и как они будут работать.

Тем не менее, есть варианты для применения скалярных аргументов до PHP7.

Существует пара функций is_*, которые позволяют вам это делать, например,

Повышениеa Предупреждение: вы должны использовать

с E_USER_WARNING for $errorType.

Пример

function setInteger($integer)
{
    if (FALSE === is_int($integer)) {
        trigger_error('setInteger expected Argument 1 to be Integer', E_USER_WARNING);
    }
    // do something with $integer
}

Альтернатива

Если вы хотите отчаянно использовать подсказки скалярного типа, взгляните на

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

5 голосов
/ 31 июля 2014

Вы можете использовать «Type Juggling» как (int) $ height.

Например:

function setImage($target, $source_path, integer $width, $height) {
    $height = (int)$height;
    ...
}
2 голосов
/ 25 марта 2011

PHP (пока) не реализует строгую типизацию, поэтому нельзя заставить параметр быть целым числом.Это применимо только к классам (ошибка, которую вы получаете, подразумевает, что $ width должна быть экземпляром целочисленного класса) и массивов.

Подсказка типов для классов доступна в PHP 5, подсказка типов для массивов начинается с 5.1и, очевидно, хинтинг скалярного типа может быть (или может не быть) доступным в будущем.

Вы, конечно, как указывали другие, можете проверять тип в вашей функции / методе, но это принципиально отличается от строгой типизации,Желаемый эффект, конечно, будет присутствовать в любом случае.

0 голосов
/ 18 января 2016

Если вы не используете PHP 7.x или можете использовать модуль args из Нестандартная библиотека PHP (NSPL) . Это не так красиво, как PHP 7.x, но делает проверку:

use const \nspl\args\numeric;
use function \nspl\args\expects;

function sqr($x)
{
    expects(numeric, $x);
    return $x * $x;
}

sqr('hello world');

Выходы:

InvalidArgumentException: Argument 1 passed to sqr() must be numeric, string given in /path/to/example.php on line 17

Call Stack:
    0.0002     230304   1. {main}() /path/to/example.php:0
    0.0023     556800   2. sqr() /path/to/example.php:17
...