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

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

предупреждение: 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++;
}

person Moak    schedule 25.03.2011    source источник
comment
Похоже, они добавляются в PHP 7: php. сеть/руководство/ru/   -  person Burhan Ali    schedule 27.11.2015


Ответы (4)


Scalar TypeHints доступны начиная с PHP 7:

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

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

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

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

Чтобы поднять предупреждение, вы должны использовать

с E_USER_WARNING вместо $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
}

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

Если вы отчаянно хотите использовать Scalar Type Hints, взгляните на

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

person Gordon    schedule 25.03.2011

Вы можете использовать «Жонглирование типами», например (int)$height.

Например:

function setImage($target, $source_path, integer $width, $height) {
    $height = (int)$height;
    ...
}
person Frank    schedule 31.07.2014

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

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

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

person Peter Lindqvist    schedule 25.03.2011
comment
Итак, предупреждения, выдаваемые php, проверяются внутри функции? - person Moak; 25.03.2011
comment
Такие функции, как preg_replace, написаны не на PHP и поэтому не должны подчиняться правилам языка PHP. Вам нужно было бы обратиться к исходному коду, чтобы увидеть это, но моя интуиция подсказывает мне, что это так. - person Peter Lindqvist; 25.03.2011
comment
Это может также быть случаем, когда PHP (среда выполнения) внутренне сверяет это с объявлением функции (поскольку она написана на c, она имеет тип, определенный для параметров), а затем решает, что делать. В функции php_pcre_match_impl() четко указано, что тема должна быть char *. - person Peter Lindqvist; 25.03.2011

Если вы не используете 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
person Ihor Burlachenko    schedule 17.01.2016