Pull to refresh

Comments 54

Тут главное чтоб руки расли откуда надо. Если придерживаться определенных правил, то эта фича только во благо.
Причем тут руки :), тут главное хвост :))))))))))))
(ммм… т.е. голова)
В нестрогой типизации есть своя прелесть. Только руки должны рости из правильного места.
Ну одно дело нестрогая типизация, а другое когда id и респонс базы называют емейлом. :-)
Как вы яхту назовете так она и поплывет? :-)
Я дико извиняюсь, но при чем тут нестрогая типизация? Термин такой красивый?
Еще более дико извиняюсь. Динамическая.
Вообще-то это динамическая типизация, нестрогая типизация, которая характерна PHP, JavaScript, VBScript проявляется в случаях вида a = «1» + 1, т.е. переменная со значением одного типа используется в разных местах кода как будто она пренадлежит к другим типам, строгая типизация придает определенную строгость языку и не позволяет допустить ряда ошибок характерных коду написанному на языках с нестрогой типизацией. Из скриптовых языков к языкам со строгой типизацией можно отнести Python.
Ну да, я спутал строгую со статической. Бывает.
Именно в php a = «1» + 1, а будет равно 2, а если a = «1». 1, тогда 11 ;)
Только после вашего примера заметил одну странность:)
echo «1» + 1; //Это даже работает! И выводит 1
echo «1»+1; //Выводит 2, оно и понятно… (кстати в JS выведет 11:) )
Но первый пример прям порадовал:) Оказывается даже так:
echo asdf; //Выведет на экран asdf

Дальше углубился в эту задачу и сделал так:
Почему то коммент отправился… Так вот продолжение:)
define(«asdf»,«123»);
echo asdf; //Выводит конечно же 123.
выдаст нотайс о том, что константа asdf не определена и ей присвоено значение «asdf», если я не ошибаюсь
а вот в JS «1» + 1 выдаст 2, потому что для яс первая еденица будет строкой и он будет сливать две строки :)
Сорри, 2 раза энтер кликнул слайчайно
Незнаю, я сам хоть и пишу на PHP — но в нестрогой типизации никакой прелести не нашел, стараюсь жестко придерживаться правила что у одной переменной может быть только один тип, или null, хотя в PHP null тоже отдельный тип данных, сложности следования этому правилу в основном возникают из-за встроенных функций, который часто возвращают то один тип данных, то другой.
А смысл? Я серьезно спрашиваю, не спорю, сколько людей — столько мнений. Просто интересно зачем это делать.
Ну как-то это удобно просто :) Когда пишешь что-то с нуля — тогда конечно при условии прямых рук даже с изменением типа данных в переменной конечно все будет четко и ясно, однако редактируя этот код в последствии — нужно будет проследить всю цепочку преобразований, что дает больший простор для того чтобы что-то проглядеть, забыть, ошибиться, а в случае когда для нового типа данных задается новая переменная — можно быть уверенным что если переменная пришла в функцию или метод строковым параметром — то она в любом ее месте будет строковым параметром, а булевое значение полученное из нее будет иметь отдельную переменную, и также всегда будет булевым значением в любом месте кода. И именую переменные я соот-но, с припиской в виде одной буквы, обозначающий тип, перед именем, а-ля $sName, $iCount и т.п., некоторых такой изыск раздражает, а мне это удобно, я бегло взглянув на код могу понять принцип его работы, где у меня в метод передан скалярный тип, а где целый объект, где строка а где число.
Вообще это по-моему даже какой-то стандарт —

$oObject

$sString

$iInt

$aArray

— первая буква типа=)
Ну да, я это не сам придумывал :) Переодически встречал такой подход в чужом коде, и вот однажды сам начал использовать.
Как раз сейчас эту статью читаю :)
Венгерская нотация приносила имела смысл в C
Парой постов выше приведена достаточно интересна статья про то где и когда венгерская нотация имела смысл.
Случайно отправил, извиняюсь

Итак, в C
wile (dwCount > 0) // бесконечный цикл
{
    // do
    dwCount--;
}


В случае отсутствия беззнаковых переменных ее полезность сомнительна. Для этого нужно чуть пораскинуть мозгами. Нотация позволяет не путаться в типе переменных, Вероятно, у вас в коде объявлено множество переменных с одним именем.

Вот и проблема — множество переменных. Возможные решения — разбиение на методы, выделение классов.
Давайте не искать чужие проблемы методом тыка, а уж тем более учить незнакомых людей азам программирования, по-крайней мере я-же вас им не учу.
Это наверно от кода поста. Ниже привел пример каким его хочется видеть habrahabr.ru/blogs/code_wtf/47774/#comment_1229020
Я не пытаюсь учить — бесполезно. Просто делюсь мыслями. Для меня венгерская нотация пройденный этап.
Нет, я думаю это всеже от отсутствия элементарной культуры, а код поста не просто так находится к блоге «кодобред».
А пример кода кстати и вправду смешон, если соот-щий email в базе найден не будет — внутри переменной email так и останется ресурс :)
там дальше проверка делается на is_string

но всё равно криво, конечн=)
А если он не пройдет первую проверку?
if(is_numeric($email) && !empty($email)){
UFO just landed and posted this here
jQuery напоминает. Там вместо $email – бакс
Насколько помню, всякие из_инт, из_бул, из_флоат, в отличие от из_нумерик, проверяют именно тип переменной.
Мне кажется что этот кусок кода не может служить примером убогости php, поскольку он просто убог и всё. При чём тут php? Я являюсь Java и php разработчиком и могу вам сказать что и там и там есть код от которого хочется встать и бежать. Везде свои фичи и недостатки, и «любить» швабру за то что она хреново гвозди заколачивает… так вы не тем просто заняты вот и всё. При чём тут php?
помоему автор приоткрывает стиль кодера, а не убогость пхп
Понимаю конечно что дурной тон дублировать информацию на странице, но тема топика — «За что я «люблю» PHP или переназначение переменных)»
поправьте если ошибаюсь — var является лишь псевдонимом типа на момент написания кода и на этапе компиляции заменяет на тим. тоесть анонимный класс с, скажем, двумя полями, к которому принадлежит переменная, вряд ли сможет быть изменен для нее в другой тип данных.
Необходимость в переопределении отпадает при декомпозиции кода:
function processEmail($email) {
    requireNumeric($email);
    $row = queryOne("SELECT email FROM users WHERE id=".$email);
    return $row[0];
}


Код библиотеки:
function requireNumeric($data) {
    if (empty($data) || !is_numeric($data))
        throw new InvalidArgumentException();
}

function queryOne($query) {
    $result = query($query);
    if (!$result || mysql_num_rows($result) <= 0)
        throw new InvalidDBDataException();
    return mysql_fetch_row($result);
}


A при использовании ORM даже так
function processEmail($email) {
    requireNumeric($email);
    return select_email($email);
}


Ну а если ORM умеет накладывать ограничения на параметры
function processEmail($email) {
    return select_email($email);
}


Так за что вы «любите» PHP?
Кстати, если написать функцию вроде

function mysql_res($query) { return mysql_fetch_assoc(mysql_query($query)); }

То код в статье можно сильно упростить:

if(!empty($email)) extract(mysql_res('SELECT `email` FROM `users` WHERE `id`='.intval($email)));

Вот за наличие функции extract я люблю пхп :))

P.S. Да, mysql_res() в приведенном мной виде не обрабатывает ошибки, это надо делать отдельно
Вот за функции типа extract я php не совсем люблю, хоть и пишу на нем. Понапишут, блин, а потом думай, откуда переменная $boo взялась и какого она типа
какие страшные условия, а всего надо написать:

if($email = (int) $email){

Кстати, в Python переопределение тоже сработает. И в Perl и в Ruby, причём тут PHP?
Sign up to leave a comment.

Articles