Как заставить аргументы быть целыми/строковыми
Я бы хотел, чтобы мои функции ожидали строки/целые числа или бросали подгонку, например:
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++;
}
Ответы
Ответ 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