Кто-нибудь еще использует PHP < 5.4?

danforth
На сайте с 18.12.2015
Offline
153
#61

saanvi, вы немного путаете.

Все что вы привели, это попытки приведения к типу. Убрали попытку приведения string => hex. А это, на секундочку, оптимизация работы со строками, т.к. нам не нужно до конца проверять строку "0х123", в PHP7 он вернет 0 уже на первом символе, в PHP5.x прочитает всю строку да ещё и совершит попытку сконвертировать строку в число.

За это и не любят ПЭХАПЭ, за то что каша и не прозрачное поведение и динамическая подлая типизация. Создатели пытаются хоть как-то навести порядок.


var_dump("php - gavno?" == 0); // true
// python - false
// js - false
// php - true? WTF?!
Junior Web Developer
saanvi
На сайте с 01.04.2015
Offline
108
#62
danforth:
За это и не любят ПЭХАПЭ, за то что каша и не прозрачное поведение

Всё оно прозрачное. Было одно - а теперь другое. Я, в принципе, данную фичу не заюзал в коде ни разу (конкретно HEX). Но при просмотре "счастливых изменений 7-ой версии" был нехило удивлён такими приколами.

Здоровый пофигизм (http://saanvi.ru)
mendel
На сайте с 06.03.2008
Offline
183
#63
danforth:
WTF?!

Ой, я Вас умоляю... Это не баг, а фича.

Просто не интуитивная.

Например как:


$obj1 = new StdClass();
$obj2 = new StdClass();

$obj1->value = 1;
$obj2->value = 1;

function f1($o) {
$o = 100;
}

function f2($o) {
$o->value = 100;
}

f1($obj1);
f2($obj2);

var_dump($obj1);
var_dump($obj2);

Угадайте что получим на выходе?

Процентов 90% не угадает. Хотя тоже в документации всё разжевано.

Или например многие не знают, что в пхп имена методов и функций регистронезависимые. Я например не знал. Хотя читал конечно, но это когда было то? Тогда о таких вещах и не думалось...

Шутку любишь над Фомой, так люби и над собой. (с) народ. Бесплатные списки читабельных(!) свободных доменов (http://burzhu.net/showthread.php?t=2976) (5L.com) Сайты, All inclusive. 5* (/ru/forum/962215)
danforth
На сайте с 18.12.2015
Offline
153
#64

mendel, можно называть это как угодно, я называю это плохой архитектурой языка.

Язык популярный, да. Потому что когда появился, аналогов ему практически не было. Занял свою нишу, укоренился. А, как известно, лидера очень сложно потеснить. Но выбирая сейчас на чем писать проект, вряд ли выбрал бы PHP, если бы основным требованием не было "БЫСТРЕЙ!!11"

Можно найти неплохую статью по запросу "PHP: fractal of bad design", там очень огромный "послужной" список, а держать в голове все эти "фичи" нету никакого желания, но приходится.

mendel
На сайте с 06.03.2008
Offline
183
#65
danforth:
если бы основным требованием не было "БЫСТРЕЙ!!11"

У меня аргумент за PHP только один. Это LAMP и "тест зубной щетки".

Если я хочу чтобы мой фреймворк прошел "тест зубной щетки" (с) Гугл, то он должен в первую очередь работать под LAMP. Потом уже по одной меняем первые три буквы, чтобы и там тоже работало. А что до четвертой... вообще хочу. Но думаю что последняя буква не будет изменена никогда.

Видели под Java придумали GC который нифига не убирает?) Это не единственный случай когда Java развивается в сторону того, чтобы хорошо работать умирая. А PHP уже много лет двигается в сторону того чтобы мог не умирать. И то и другое весьма успешно получается.

danforth:
а держать в голове все эти "фичи" нету никакого желания, но приходится.

Да не обязательно в голове держать.

Просто не нужно использовать экстремальных вещей, писать так как ты бы писал на другом языке, где тебе позволено не все, и ошибок тебе не прощают. Ну и тестировать, да.

edogs software
На сайте с 15.12.2005
Offline
775
#66
danforth:
saanvi, вы немного путаете.
Все что вы привели, это попытки приведения к типу. Убрали попытку приведения string => hex. А это, на секундочку, оптимизация работы со строками, т.к. нам не нужно до конца проверять строку "0х123", в PHP7 он вернет 0 уже на первом символе, в PHP5.x прочитает всю строку да ещё и совершит попытку сконвертировать строку в число.
За это и не любят ПЭХАПЭ, за то что каша и не прозрачное поведение и динамическая подлая типизация. Создатели пытаются хоть как-то навести порядок.

Кто не любит-то?

Те кто понимает в программинге - никогда не полагались на приведение к типу из хекса и всегда сравнивали строки как положено - как строки. Поэтому им было и есть глубоко плевать на эти особенности.

mendel:
Или например многие не знают, что в пхп имена методов и функций регистронезависимые. Я например не знал. Хотя читал конечно, но это когда было то? Тогда о таких вещах и не думалось...

Вот из той же серии что и первый абзац. Ни один нормальный программер не будет делать одну функцию Ololo а другую ololo , а у соблюдающего стандарты такое просто в принципе не может получится. Поэтому проблемы это не представляет ну вообще никакой, для тех кто хоть немного разбирается, опять же.

То же можно, кстати, сказать про глобальные переменные. Половина интернета засрана умными статьями на тему как это небезопасно и на фиг нужно и что пхп весь такой кривой. А в чем проблема-то? Проблема только в том, что некоторые использовали непроверенные переменные. Решил ли проблему отказ от глобальных? Нет! Нет, тысяча чертей. Эти люди так и используют непроверенные переменные, просто сценариев когда это может выйти боком стало меньше.

При чем одна из самых крупных уязвимостей в phpbb (казалось бы вещь), именно в том, что использовалась непроверенная переменная и нестрогое сравнение (ансериалайз массива из печенек юзера если кто помнит), и - сюрприз - глобальные были не при чем.

По сути вся история удаления особенностей в пхп это история о том, как людям отсыпали острых ножей на любой вкус, а потом разработчики внезапно обнаружили что некоторые могут ими поранится и стали затуплять эти инструменты. Но один черт - если ножом в ухе ковырять - ничем хорошим это не кончится, а то что ей теперь им палец труднее порезать - это что - решение проблемы?

mendel:
Процентов 90% не угадает. Хотя тоже в документации всё разжевано.

Потому что 95% документацию не читали. В каждом втором проекте натыкаемся на чью-нибудь колхозную реализацию стандартных функций пхп, да еще снабженную гордыми комментариями типа "во как я придумал". Т.е. речь ведь даже не о том, что человек не знает как работает какая-то функция (учитывая зоопарк функций по разному работающих это еще простительно), а то что она там вообще есть.

mendel:
Да не обязательно в голове держать.
Просто не нужно использовать экстремальных вещей, писать так как ты бы писал на другом языке, где тебе позволено не все, и ошибок тебе не прощают.

Вот это бы на камне высечь. +100-500.

Знаем некоторые сайты которые еще на 3-шке написаны и неплохо так (максимум с парой внешних дописок, но без изменения самого кода) на 7-ке заведутся и без глюков будут работать. Потому что писались без экстрима, штатным набором средств присутствующих в любом языке и работающих предсказуемым образом даже для незнакомого с пхп человеком.

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
danforth
На сайте с 18.12.2015
Offline
153
#67
mendel:
Да не обязательно в голове держать.
edogs:
Кто не любит-то?

Те, кто знает про существование альтернатив? Ладно вам заливать! Вот примеры:

  • gettype и get_class - разное написание. Сходу и не вспомню. Таких функций полно.
  • strpos($haystack, $needle) и array_search($needle, $haystack) - разная очередность семантически одинаковых атрибутов. Спасибо IDE, она знает.
  • добрая половина функций работы с массивами начинается со слова array_, оставшаяся часть или имеет буковку a или вообще ничего (shuffle).

На закуску:


class Human
{
// очень приватное свойство, да?
private $name;

public function __construct($name)
{
$this->name = $name;
}

public function touch($human)
{
$human->name = "Ahtung";
return "Touched $human->name";
}

public function getName()
{
return $this->name;
}
}

$name у нас приватное свойство, обратили внимание? Cоздаем два человека


$john = new Human("John");

$sully = new Human("Sully");

Попытаемся прочесть имя Джона напрямую


echo $john->name; // Fatal error: Uncaught Error: Cannot access private property Human::$name

Супер, все у нас приватно, Джон приватный чувак. Идем дальше.


echo $john->touch($sully); // Touched Ahtung!

Джон потрогал Салли, но.. проблема. Салли = Ахтунг. Можно было бы подумать, что только в глазах Джона, но...


echo $sully->getName(); // Ahtung

А теперь вопрос: куда делась приватность? Это тоже фича? Мы не только прочитали свойство, мы смогли его изменить!

Полный листинг.

Аналогичный пример на Go (не хочу за него топить, просто первое что попалось под руку).

В Go свойства и методы бывают экспортируемые и неэкспортируемые: первые доступны во всем приложении, вторые только на уровне пакета. Для этого я сделал отдельный пакет с названием human. Свойство у struct закрытое (листинг файла). Вот основной файл с созданием Human'ов и попытками изменить приватное. В конце попытку изменить неэкспортируемое свойство нужно закомментировать, т.к. не скомпилируется. В результате имеем это:


Touched Ahtung // потому что все Human в одном пакете, и мы имеем доступ к name, мы можем его прочитать и заменить, но
// так как в функции я передаю копию, то и изменения происходят над копией
Sully // сам объект остается неизменным
// попытки прочесть имя объекта sully напрямую приведет к тому, что программа не скомпилируется (чтение не из пакета, где объявлено свойство, а значит закрыто)

Добавлю, что в Go также есть подводные камни (фичи как вы их называете), например слайсы в фукнции передаются по ссылке, а все остальное - нет.

Artisan
На сайте с 04.03.2005
Offline
353
#68
edogs:
В каждом втором проекте натыкаемся на чью-нибудь колхозную реализацию стандартных функций пхп, да еще снабженную гордыми комментариями типа "во как я придумал". Т.е. речь ведь даже не о том, что человек не знает как работает какая-то функция (учитывая зоопарк функций по разному работающих это еще простительно), а то что она там вообще есть.
edogs:
Вот это бы на камне высечь. +100-500. Знаем некоторые сайты которые еще на 3-шке написаны и неплохо так (максимум с парой внешних дописок, но без изменения самого кода) на 7-ке заведутся и без глюков будут работать. Потому что писались без экстрима, штатным набором средств присутствующих в любом языке и работающих предсказуемым образом даже для незнакомого с пхп человеком.

Взаимно исключающие параграфы.

www.leak.info / ДАРОМ линки конкурентов и забытых доменов
SeVlad
На сайте с 03.11.2008
Offline
1609
#69
mendel:
Строго говоря в основном говносайтов.

блин.. как отозвать спасибку :)

Строго говоря - уверенных в себе админов. Взломаны были и достаточно крупные сайты.

mendel:
булка выдает ошибку базы данных при перегрузе субд на впс где стоит серч.

Ни сервер ни булка тут не причем (она просто не проверят дубли поста, но это другая история). Это то, о чем я тебе говорил, но ты не слышишь - это качество 3Ж. Медленный и не стабильный мобильный интернет инет.

Но это уже не по теме :)

Делаю хорошие сайты хорошим людям. Предпочтение коммерческим направлениям. Связь со мной через http://wp.me/P3YHjQ-3.
mendel
На сайте с 06.03.2008
Offline
183
#70
danforth:
Вот примеры:

Да, да, и еще раз да.

кто понял жизнь, тот таких вопросов не задает))))

Да, это капец-капец.

Но нам приходится пользоваться пхп потому что он самый популярный.

Это разные мысли?

Нет!!!

Это две стороны одной медали!!

Пхп самый популярный потому что в нем все так криво.

Да!

Почему у него все так криво?

Потому что на скорую руку запихнули в него все доступные под руками библиотеки. Из Си, из чего угодно. Именовали всё - как было там где тащили.

Главное побольше "ножей" и побыстрее.

Почему пхп самый популярный? Потому что к тому времени как другие вылизали свои детища - место под солнцем было уже занято). Да!

Нет, я конечно слегка упрощаю. Есть много других факторов,но в целом общая тенденция у всего этого именно такая.

И да, пхп понемногу старается от всего этого наследия вычищаться.

Вон explode/implode уже сто лет как синхронизировали, в ООП версиях тех же функций - большее единообразие, и все такое. В пхп9/пхп10 будет уже более менее порядок + куча депрекейтета который еще не выкинут вплоть до пхп50.

danforth:
$name у нас приватное свойство, обратили внимание? Cоздаем два человека

А вы точно психолог? (с)

Приватные/защищенные методы/переменные это не о том о чем вы думаете.

Здесь главное обеспечить SOLIDность кода. Не защищенность объекта, а отсутствие необходимости разработчика знать внутреннюю реализацию используемого им класса. Защищать объект не нужно, да и невозможно.

Приватные члены используются только в этом классе. Если мы пишем что-то в этом классе, то мы знаем все что в нем есть, и эти члены тоже.

И значит может использовать их как хочет.

При этом тот кто вызывает класс извне - его не знает, и не видит.

И тот кто от него наследуется, он не знает и не видит.

Т.е. это внутреннее апи чисто этого класса.

Если мы берем защищенные члены, то это то АПИ которое предназначено как для внутреннего использования, так и для тех кто должен (или может) нас наследовать. При этом тот кто использует готовый объект нашего класса - знать этот апи не должен, так что это апи от него скрыто.

Паблик доступен всем извне, ну и внутри тоже, ведь это то, что мы заложили в ПУБЛИЧНЫЙ апи нашего объекта.

В вашем примере апи приватное, используется приватно, в рамках класса.

Всё логично. Задача инкапсуляции выполнена хорошо.

Другое дело что это не особо нужно. Я бы никогда не узнал об этом, потому что вот так вот дергать приватные свойства не очень красиво. В идеале такие вещи лучше вынести в паблик, но в принципе если будет какая-то реальная задача где "мы с Тамарой ходим парой", и некие объекты так тесно связаны, что есть смысл лезть во внутренности другого объекта своего класса, но нельзя давать это в публичное АПИ, то почему бы и нет? Чисто исходя из логики ООП реализация с инкапсуляцией по коду, а не по экземпляру мне кажется более логичной, хотя более кривая логика (та что вы ожидаете) тоже не проблема, она просто другая.

edogs:
Потому что 95% документацию не читали.

Ну их блин много, и документация у пхп кривая если честно.

Помогает не столько то что ты документацию читал, сколько понимание жЫзни.

Когда тебе нужна какая-то функция, и ты понимаешь что в принципе она должна быть в апи, а не гуглится на стековерфлоу. А вот эту функцию лучше искать там, кто-то уже написал, а вот это можно даже не искать, до тебя никто не писал...

edogs:
Ни один нормальный программер не будет делать одну функцию Ololo а другую ololo , а у соблюдающего стандарты такое просто в принципе не может получится.

Ну честно говоря я как в ИДЕ включил проверку PSR, так периодически у себя нахожу опечатки. Раньше у меня в проекте был другой стандарт, пробежался, переделал, но где-то затерялось. Узнал чисто когда впервые увидел что код который давно проверенно работает содержит такую опечатку. Удивился, как-так то, полез в доку, увидел что независимые, поржал, ну и ладно.

А вот мой пример с "передачей по ссылке" всех объектов - чисто следствие внутренней реализации. И тут как раз может сложиться ситуация когда хочется не просто поменять свойства объекта переданного в функцию, а тупо его заменить чем-то, и привычка что раз мы можем его менять, то значит он по ссылке, может сыграть с нами злую шутку. Но... у всех бывают странности.

Меня больше удивляло что в пятом пхп пхп4-стайл конструкторы не были депрекейтет, и убрали его только в седьмом, да еще и с таким количеством воя.

(Сам на это нарвался буквально полгода назад, в пхп5.6 на рефакторинге переименовал один класс, и тут вдруг перестал работать большой кусок.

Рефакторинг был довольно механический, так что тестировал сразу большой кусок, ну что там проверять то? Поэтому довольно много времени взяло понять что один метод вдруг превратился в конструктор.)

---------- Добавлено 21.03.2017 в 10:34 ----------

SeVlad:
Строго говоря - уверенных в себе админов. Взломаны были и достаточно крупные сайты.

Конечно были. Я же сказал - в основном.

Там собственно два кейса - или говносайт, или крупный сайт.

Либо ты используешь потенциально проблемную бортовую функцию (говносайты), либо ты умеешь ее правильно готовить (приличные сайты со своим сервером и админом). Но среди нормальных сайтов второй кейс редкий, а первый отпадает.

Т.е. я к тому что "миллионы говносайтов и десятки нормальных".

SeVlad:
Ни сервер ни булка тут не причем (она просто не проверят дубли поста, но это другая история). Это то, о чем я тебе говорил, но ты не слышишь - это качество 3Ж. Медленный и не стабильный мобильный интернет инет.
Но это уже не по теме

Ну медленный. Ну нестабильный. И что?

У меня на истио.нет было настроено что дубли не проходили.

На продомейнере тоже проверил только-что:


При отправке были допущены следующие ошибки
Это сообщение дублирует аналогичное, сделанное менее пяти минут назад.

Ну вот не помню как я это делал, или плагин, или в ядре. Вообще ПД это последний форум на булке где я админ, и уже сто лет "под капот" не лазил. Как оно начнет отваливаться - скорее всего перенесем на какой-то блогодвиг или свой)

Через день сам пложу дубли именно от ошибки базы данных, хотя если обернуть в транзакцию и закрывать уже в конце страницы, то фиг оно при ошибке сохранится.

А медленный интернет.... ну бывает. Тут оба сценария нормально отработает - защита от дубля напрямую защитит от дубля. А оборачивание всего в транзакцию может защитить превентивно - отправили в браузер, закрыли транзакцию. Обычно этого хватит. Страница будет открываться долго, но откроется.

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

Но! в то время когда писалась булка - инодб была заметно медленнее (сейчас наоборот), и логично что транзакции не рассматривались. По крайней мере в массе. Аналогично - вордпресс ужасен по своему АПИ, но... когда он появился, он был идеален.

ПС: по идее оно все по теме, ибо древний/новый пхп и древние/новые паттерны/библиотеки/драйвера это близкая тема.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий