Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
<?php
$a= array(0=>'1');
$a= array(0=>'1', 1=>'0');
function x(string $s) {}
x($a);
x($b);
<?php
function x(array $a) {}
x('123');
Catchable fatal error: Argument 1 passed to x() must be an array, string given, called in /tmp/1.php on line 3 and defined in /tmp/1.php on line 2
Call Stack:
0.0005 58256 1. {main}() /tmp/1.php:0
0.0006 58376 2. x() /tmp/1.php:3
массив можно создать только намерено, через array(), type cast, спец.функции и т.п.$a = (array)«string»; // type cast
<?php
$x = 1;
function a(string $a){b($a);}
function b(int $b){c($b);}
function c(float $c){d($c);}
function d(string $d){return $d;}
function example(int $i) {} — означает, что аргумент должен иметь строго тип int.function example(~int $i) {} — аргумент должен быть таким, чтобы была возможность прямого приведения его к типу int. Например, «2» к int приводится (поскольку это именно число в виде строки), а «2qwerty» (в строке не только число) — нет (в последнем случае — т. е. в случае невозможности приведения — выбрасывается соответствующее исключение).function example(int $i) { // $i обязан иметь тип int (если не обязан, то int просто не пишем)
if ($i <= 0) { // Внутри функции делаем какие угодно проверки
throw new Exception('…');
}
}Например, если я пишу:смысла не имеет.
function myFunc(string $x1, int $x2, $x3) {}
то это должно означать, что в качестве $x1 может выступать как «just string», так и 8421, при этом, 8421 должно быть автоматически преобразовано в «8421». В качестве $x2 может выступать не только 8421, но и «8421», и «8421str», но строки должны быть автоматически преобразованы в int по правилам PHP.
ри этом, от отсутствия возможностей явного преобразования PHP никогда не страдал — всегда можно проверить какой тип имеет переменная, так же всегда можно явно привести переменную к нужному типу.(int) $a — это и есть явное преобразование. Оно есть в PHP.
$data = $result->fetch_assoc();
settype('integer', $data['id']);
settype('float', $data['price']);
....
и так для каждого числового типа. А с boolean вообще будет странно, типа такого:
$data['bool_flag'] = (bool)$data['bool_flag'] === '1';
$data['bool_flag'] = $data['bool_flag'] === '1';//Сравнение итак выдает булеан значение, как бы приведение к (bool) там лишнее.
(bool) (int) $data['bool_flag'];
Кто мне запретит? Соот-но такое понятие как интерфейс в php не дает никакой сколько-нибудь значимой гарантии того что ход работы программы не будет прерван сложением DOMDocument и SOAPServer, потому как несмотря на то что класс реализует интерфейсthrow $this; // не ждали?
interface Sum {
/**
* @return integer
**/
getFirstSummand();
/**
* @return integer;
**/
getSecondSummand();
}В программу вполне могут вернуться именно они.
PHP type hinting — строгое или мягкое?