Подтвердить что ты не робот

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

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

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

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

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

Я получаю:

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

Но:

function(array $expectsArray)

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

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

PHP 7 теперь поддерживает подсказки типа Scalar

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

Ответ 1

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

Объявления типа Scalar представлены в двух вариантах: принудительный (по умолчанию) и строгий. Следующие типы параметров могут теперь применяться (коэрцитивно или строго): строки (строки), целые числа (int), числа с плавающей запятой (float) и booleans (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
}

Alternative

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

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

Ответ 2

Вы можете использовать "Тип жонглирования" как (int) $height.

Например:

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

Ответ 3

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

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

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

Ответ 4

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