LINUX.ORG.RU

И снова самый лучший ЯП

 ,


0

1

Я снова наступил на эти грабли.

Пример кода:

$array = [1, 2, 3];

foreach ($array as &$value) {}    // by reference
echo implode(',', $array), "\n";

foreach ($array as $value) {}     // by value (i.e., copy)
echo implode(',', $array), "\n";

Результат:

1,2,3
1,2,2

Почему? По качану. Между первой и второй нужен unset($value);.

Замечательный язык вообще. И отсутствие у переменных областей видимости уровня блока — отдельная победа на пути к говнокоду. Зато отлично учишься каждые 5 строк кода выносить в отдельную функцию.

PHP и JS, сладкий твикс страдания. JS, правда, боль-мень вылечили.

Спрашивайте ваши ответы.

А вот другие ЯП, типо сишечки, конечно же прощают такое аккуратное обращение с указателями )

goingUp ★★★★★
()
Ответ на: комментарий от goingUp

«В других ЯП» переменная из цикла не протекает наружу.

wandrien ★★
() автор топика

// by value (i.e., copy)

Каво? Ты уже определил переменную как ссылку. После первого цикла она ссылается на последний элемент. Теперь когда в неё что-то будешь класть, будет элемент массива меняться. Поэтому во втором цикле у тебя туда кладётся 1 (первое значение), потом 2 (второе значение) и потом снова 2 (третье значение).

no-such-file ★★★★★
()
Ответ на: комментарий от fernandos

А кто вам виноват, что вы не знаете, как работает область видимости в пиэйчпи?

Я знаю, как работает.

В том-то и дело, что во всех нормальных ЯП просто используешь имена с областью видимости, ограниченной оператором, а в php приходится самому выполнять работу транслятора и следить за непересечением имён.

wandrien ★★
() автор топика
Ответ на: комментарий от wandrien

У меня не хочет. Правда, у меня и вся работа с БД вынесена в синглтон, и MariaDB из "арчевских" репозиториев.

Korchevatel ★★★★★
()
Ответ на: комментарий от wandrien

В том-то и дело, что во всех нормальных ЯП

А массивы начинаются с 0, скажите это разработчикам луа.

а в php приходится самому выполнять работу транслятора и следить за непересечением имён.

А в си приходится выполнять работку вообще всех, ладно, почти всех.

Если вам это так не нравится — напишите предложение по улучшению.

fernandos ★★★
()
Ответ на: комментарий от no-such-file

После первого цикла она ссылается на последний элемент. Теперь когда в неё что-то будешь класть, будет элемент массива меняться. Поэтому во втором цикле у тебя туда кладётся 1 (первое значение), потом 2 (второе значение) и потом снова 2 (третье значение).

И поэтому в половине случаев результат выводится правильный, ага. Мало было кривого синтаксиса, еще UB понавертели.

Отладочный вывод:

Первый вызов функции:

Array ( [0] => Новая Зеландия [1] => США )
Новая Зеландия
Новая Зеландия

Второй:

Array ( [0] => Новая Зеландия [1] => США )
Новая Зеландия
США
wandrien ★★
() автор топика
Последнее исправление: wandrien (всего исправлений: 1)
Ответ на: комментарий от fernandos

А массивы начинаются с 0

Да. Иначе вся арифметика вокруг длин массивов идёт по бороде.

скажите это разработчикам луа.

Если б меня кто спрашивал, обязательно бы сказал.

А в си приходится выполнять работку вообще всех, ладно, почти всех.

В Си как раз синтаксис вызывает наименьшее количество wtf на страницу кода.

Мы не про возможности языка говорим.

wandrien ★★
() автор топика
Ответ на: комментарий от wandrien

во всех нормальных ЯП просто используешь имена с областью видимости, ограниченной оператором, а в php приходится самому выполнять работу транслятора и следить за непересечением имён.

Python 3.8.5 (default, Jan 27 2021, 15:41:15) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.13.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: xs = [1, 2, 3, 7]                                                                                                                                                                                          

In [2]: for x in xs: 
   ...:     print(x) 
   ...:                                                                                                                                                                                                            
1
2
3
7

In [3]: x                                                                                                                                                                                                          
Out[3]: 7
seiken ★★★★★
()
Ответ на: комментарий от wandrien

В Си как раз синтаксис вызывает наименьшее количество wtf на страницу кода.

Ага, и делать руками там приходится больше всего.

fernandos ★★★
()
Ответ на: комментарий от fernandos

Ага, и делать руками там приходится больше всего.

Это язык из 70-х, алло. Скажи спасибо, что он вообще был.

Зато 90-е дали нам «чудесные» PHP, JS и Python, позор, над которым будут ржать потомки.

wandrien ★★
() автор топика
Ответ на: комментарий от wandrien

JS и Python, позор, над которым будут ржать потомки.

Потомки будут скорее ржать над дедами, которые вместо того, чтобы быстрее получать результат и развивать его, занимались практически малополезной дрочкой очередного теоретически выверенного state-of-the-art языка программирования, использование которого создает больше проблем, чем решает.

seiken ★★★★★
()
Ответ на: комментарий от wandrien

Это язык из 70-х, алло. Скажи спасибо, что он вообще был.

Какая разница? Он из 70-х и он всё ещё один из самых лучших.

Зато 90-е дали нам «чудесные» PHP, JS и Python, позор, над которым будут ржать потомки.

Создание простых яп было ожидаемо, а при простоте (для пользователя) теряется лаконичность и красота. Может, создание этих языков и позор, в какой-то степени, но это подтолкнуло развитие всей области программирования.

fernandos ★★★
()
Ответ на: комментарий от fernandos

JS нормально допилили, насколько позволял исходный дизайн. Дальше только обратную совместимость ломать. Может когда-то и сломают.

Я каждый раз как сажусь после JS писать на питоне, испытываю когнитивный диссонанс. Код абсолютно дубовый, невыразительный и нечитабельный.

wandrien ★★
() автор топика
Ответ на: комментарий от wandrien

Дальше только обратную совместимость ломать

Так и надо делать.

после JS писать на питоне, испытываю когнитивный диссонанс

после JS

на питоне

когнитивный диссонанс

Ага, только не того вы обвиняете.

дубовый, невыразительный и нечитабельный

Думаю, это из-за того, что там совершенно другой синтаксис.

fernandos ★★★
()
Ответ на: комментарий от fernandos

Думаю, это из-за того, что там совершенно другой синтаксис.

Ага. Дубовый.

Ага, только не того вы обвиняете.

Нет, того. :)

wandrien ★★
() автор топика
Ответ на: комментарий от wandrien

Ага. Дубовый.

Он вынуждает писать в +- одном стиле, это таки плюс.

fernandos ★★★
()
Ответ на: комментарий от wandrien

Тебе рассказать, что понятие нормы определяется мейнстримностью, а не тем, что ты себе там субъективно придумал в своем маня-мирке, манечка? PHP это как раз самый НОРМАЛЬНЫЙ язык, так как на нем пишет большинство.

anonymous
()
Ответ на: комментарий от wandrien

Револьвер. Нога. Стрелять.

Добро пожаловать в реальный мир.

no-such-file ★★★★★
()
Ответ на: комментарий от wandrien

еще UB понавертели

В каком месте тут UB? Ты пишешь кривой код с изменением «по месту» без понимания как это работает, а виноват дядя?

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

В каком месте тут UB? Ты пишешь кривой код с изменением «по месту» без понимания как это работает, а виноват дядя?

Почему одинаковый массив на входе даёт разный результат при разных вызовах?

wandrien ★★
() автор топика
Ответ на: комментарий от wandrien

Почему одинаковый массив на входе даёт разный результат при разных вызовах?

Потому что ты так написал по недоумию. Результат ожидаемый.

no-such-file ★★★★★
()
Ответ на: комментарий от fernandos

Вот метод:

    public function fillCountryFlags($countries, $lang = null)
    {
        $lang = $this->normalizeLangCodeISO3($lang);

        $countries = preg_split('/[;\/]/', $countries);
        foreach ($countries as &$country) {
            $country = trim($country);
        }
        sort($countries, SORT_STRING);

        $items = [];
        foreach ($countries as $country) {
            $icon = null;
            foreach ($this->flags as $flag) {
                if ($flag[$lang] == $country) {
                    $icon = $flag['ico'];
                    break;
                }
            }
            $items[] = [
                'src' => $icon,
                'text' => $country
            ];
        }
        return $items;
    }

На входе:

Array ( [0] => Новая Зеландия [1] => США )

На выходе то так:

Новая Зеландия
Новая Зеландия

То так:

Новая Зеландия
США
wandrien ★★
() автор топика
Последнее исправление: wandrien (всего исправлений: 1)
Ответ на: комментарий от wandrien

Хотя там наверное сортировка вмешалась. Пофиг.

wandrien ★★
() автор топика
Ответ на: комментарий от seiken

Потомок, скорее, спросит: "Дед, а что такое «язык программирования»?

anonymous
()

Создайте тред «PHP после JavaScript - насколько омерзительно и в чём именно?» …

anonymous
()
Ответ на: комментарий от theNamelessOne

Кто-то заставляет на нём писать? Или обычный мазохизм?

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

Но интерпретируемые языки порой дико бесят. Вместо ошибок при компиляции получаешь просто молча кучу мусора на выходе скрипта.

wandrien ★★
() автор топика
Ответ на: комментарий от wandrien

Вместо ошибок при компиляции получаешь просто молча кучу мусора на выходе скрипта.

В некоторые из них постепенно вводят gradual-typing. Если использовать нормальные библиотеки, в которых типы есть, и заставлять разрабов в проекте тоже писать типы, то ситуация несколько улучшаются. А так только покрывать тестами всё, что возможно, иначе никак.

theNamelessOne ★★★★★
()

Замечательный язык вообще. И отсутствие у переменных областей видимости уровня блока

Это, просто, достаточно знать и все.

Между первой и второй нужен unset($value)

unset не нужен - плохой подход.

Если нужен ключ, то используется конструкция вида: foreach ($list as $key => $value) {}

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

$incList = function ($list) {
    foreach ($list as &$value) {
        $value++;
    }
    return $list;
};

var_dump ( $incList($array) );
Stack77
()
Последнее исправление: Stack77 (всего исправлений: 1)

В треде орудует банда говноедов, ахтунг!

anonymous
()
Ответ на: комментарий от no-such-file

лучший ЯП

1С. Он дает мне работу и деньги. Поэтому вместо того, чтобы коммитить ядро Линуса, я разрабатываю на 1С …

Владимир

anonymous
()
Ответ на: комментарий от anonymous

Здравствуй! И на пхп пишу, но сейчас редко. В основном, это поддержка проектов которые переводить на другой язык нецелесообразно. Как инструмент, php - нормальный язык. Ну, с С#, конечно, какое тут сравнение. Для разных задач. Какую-нибудь «наколеночную» на С# тоже глупо решать.

Stack77
()
Ответ на: комментарий от Stack77

А мне тут Делириум (тоже из наших, кстати) советовал изучать язык Кристал. Говорит, что он сочетает простоту Руби с мощью Си. А я думаю, что он не взлетит …

Владимир

anonymous
()
Ответ на: комментарий от wandrien

Если б меня кто спрашивал, обязательно бы сказал.

Тебя и про пхп в общем-то тоже никто не спрашивал.

Заодно, почитай про Undefined Behavior и впридачу про Unspecified Behavior. А то столько глупости несёшь, что с одной стороны стыдно за ойти, с другой — понимаешь для кого эти PHP и Python придумывали.

filosofia
()
Последнее исправление: filosofia (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.