Типизация зло?

Андрейка

Senior pomidor developer
PHP:
$array = array(1,2,3);
$count = count($array);

if (!is_array($array) || !is_string($count)) {
   throw new Exception();
}

$strlen = strlen($count);
так?
 

demongloom

Новичок
абсолютно не так


скажем напишем функцию approve(String $order).
если ты пишешь класс(функцию) не "для других", то уж позаботиться о том, что передается в функцию проще простого... а от echo $array; тебя ничего не спасет


Я лишь привел пример что жесткая типизация, которая приводит к фатальной ошибке тоже перегиб.

strlen(count(array(н число элементов))) приведет к фатальной ошибке, т.к. count возвращает интегер, а не строку.


если разработчики сделают жесткую фатальную проверку типов, то скажем если будет:
integer function strlen(string $a) {}
integer function count(array $a) {}
то при выполнении strlen(count(array(н число элементов))) приведет к фатальной ошибке, т.к. count возвращает интегер, а не строку.

с другой стороны, все прекрасно работает при
integer function strlen(~string $a) {}
где любой скалярный параметр будет приведен к строке, лишь нескалярные выдадут ошибку.
 

С.

Продвинутый новичок
Я хочу напомнить о таком понятии, как поколение языка:

1е поколение (машинный код)
2е поколение (Ассемблер)
3е поколение (Бейсик, Паскаль, Фортран...)
4е поколение (SQL, Informix...)

В четвертом поколении языков программирования понятие типа данных практически отсутствует. PHP занимает промежуточное положение - формально третье поколение, но с элементами четвертого. Если уж совершенствовать его, то направление движения просто очевидно: в сторону четвертого, но никак, не назад.
 

dr-sm

Новичок
С. ты прогнал помоему, чета, больше кури... :)

demongloom мне тоже кажется в пхп типизация кривая.
в принципе существует один базовый тип, назовем any его.
все переменные у нас этого типа, за исключением параметров
функции, тип которых можно ограничить.
ограничить можно до:
1. array
2. className
ты предлагаешь, как я понял, добавить
3. scalar
ограничивает параметр до скалярного значения (bool,int,float,string).
если передано не скалярное значение, то приводится к нему :):__toString() например). если передан массив или ресурс, то
рантайм еррор. так да?

если так, то я только за :)
 

demongloom

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

function log(~integer $level, ~string $msg) { echo "#$level: $msg"; }
function log_strict(integer $level, string $msg) { echo "#$level: $msg"; }

log(1,"preved"); // #1: preved
log("preved", 1); // warning string "preved" to int // #0: 1
log(1, array("preved","medved")); // warning array("preved", "medved") to string // #1: Array


log_strict(1,"preved"); // #1: preved
log_strict("preved", 1); // error string "preved" to int
log_strict(1, array("preved","medved")); // error array("preved", "medved") to string

Просто такие warning/error можно удобно перехватывать и сбрасывать exception, если переписать set_error_handler
 

dr-sm

Новичок
demongloom как тогда быть с
$var = "665";
log_strict($var++, "PREVED")?
imho смысла нет.
 
Сверху