1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.

Посоветуйте как выучить PHP новичку в программировании

Тема в разделе "Программирование", создана пользователем ahdpe, 05.05.20.

  1. sema

    sema Активный участник

    16.136
    1.777
    Да ладно, какой из меня архитектор, максимум sunтехник )
     
  2. 027

    027 Активный участник

    9.039
    2.885
    Вот поэтому и ненавижу — вынужден сечас на нем писать (опять :madgo:). Начальство попросило сваять онлайн-калькулятор.
    WebAssembly — Википедия
    Дело на мой взгляд перспективное, хотя потенциально представляет новую поверхность для атак. И сырое пока что.
     
  3. 027

    027 Активный участник

    9.039
    2.885
    Кстати о PHP.

    Дописываю этот долбаный онлайн-калькулятор для дебилов. С валидацией ввода все хорошо, хвала jquery — жабоскрип с человеческим лицом. Все красиво переливается красненьким, зелененьким, сереньким. Данные четко синхронизируются в дублирующихся инпутах (так надо). Валидированные наборы значений инпутов успешно складываются в две правильные кучки. Прямой ввод, копипаста, клавой, мышью, тапом на мобилке — кривые данные не введешь. Ништяк.

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

    Это ж какой лютый треш и содомия с массивами в жаваскрипте!

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

    Кое-как, через жёппу, через принудительное приведение типов, в разных случаях разными методами (ага, просто массив, это вам не произвольно индексированный массив, который вовсе не нормальный индексированный массив, а вовсе даже ассоциативный массив, в котором строковые ключи только прикидываются числовыми... а массив с уникальными значениями — это вообще отдельный тип Set(), у которого все на так в потрохах, как у обычного массива, и совсем не так, как у простого объекта, состоящего только из полей, по сути, простого массива, но он не просто, он обмазан унаследованными функциями от прототипа, причем не такими, как обмазан просто массив, который, по сути, объект, но не типа Object, а типа Array...)

    НЕНАВИСТЬ!!!!11111
     
    Последнее редактирование: 30.06.20
  4. Иной гость

    Иной гость Активный участник

    22.222
    3.415
    это вам, батенька, прямиком в питон, в numpy :)
     
    sema нравится это.
  5. 027

    027 Активный участник

    9.039
    2.885
    Не, меня управление отступами вымораживает. :)
    Вкусовщина, понятно...
    Да и не надо оно мне (задачи, в которых явно лидирует питон).

    ***
    Тот большой абзац можно сформулировать короче:
    «Когда в языке наворачивается куча неявной магии, аффтара следует расстрелять из реактивного говномета.»

    Это ж надо было уродить такое непотребство, когда запросто можно зафигачить true == false, а вот Nan != NaN, никогда!
    (Впрочем, внутри Set() NaN таки === NaN. Поубивал бы.)
     
    Последнее редактирование: 30.06.20
    ski нравится это.
  6. hasslich

    hasslich Активный участник

    23.286
    1.997
    Всегда удивляли люди, которые занимаются сразу всем и везде. Эдакий специалист широкого профиля и низкого заработка.
     
  7. E13

    E13 Активный участник

    10.793
    1.680
    Сеты и нативно поддерживаются, без нампи.

    С нампи кажется просто более расширенный функционал, но я его забыть уже напрочь :)

    А в сторону фреймворков вроде Vue не пробовали смотреть? Я имел неосторожность применить jQ на сложном интерфейсе (разработка диалоговой структуры чат-бота), и огрёб таких проблем, что пришлось переписывать всё заново.

    Тут разные методы вроде Array.filter хорошо идут - часто вопрос одной строкой решается. А для типов данных вроде TypeScript норм, но его не копал пока. Хотя придётся, если дальше фронтенд пилить буду.
     
  8. grunt

    grunt Активный участник

    867
    171
  9. 027

    027 Активный участник

    9.039
    2.885
    На хабре была переводная статья по современную экосистему жабаскрипа. Адъ и содомия.

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

    Изрядно подолбавшись с гребаной неявной магией, таки закончил с этим проектом. Надеюсь, ОЧЕНЬ надеюсь! — с жабаскриптом в ближайшем будущем дела не иметь, предпочтительно до самой смерти.

    Давно на Вьюи посматриваю, нравится, и документация на русском от разработчиков. Но освоением нового надо заниматься в спокойной обстановке, а не в угорелом режиме сделай-срочно-вчера-пожалуйста!!!111111

    В моем случае от jQ проблем не вылезало... ну, почти. Всё решалось курением мануала, подзабылось многое с последнего раза — то ли год, то ли два назад.
    (рекомендую, кстати, jquery.page2page.ru — дело даже не в русском языке, организовано куда удобнее, чем оф.дока).

    Интерфейс не особо сложный, но все же понадобилось синхронизировать данные и подсветку ошибок на лету в нескольких родственных формах, спрятанных в переключаемых вкладках bootstrap. Вот с обработкой ошибок потыкался изрядно. Кроме подсветки и синхронизации value в инпутах надо было еще пересчитывать общие данные на основе заполнения форм, и чтоб все синхронно посвистывало и попукивало при переключении вкладок и нажатии кнопок «Рассчитать». Тут чисто ванила, от библиотеки jQ только поиск элементов и манипуляции с атрибутами.

    Слава Б-гу, вовремя вспомнил про атрибуты data-* в html5, сильно облегчило говнокодинг.
     
    Последнее редактирование: 03.07.20
  10. sema

    sema Активный участник

    16.136
    1.777
    upload_2020-7-4_12-35-57.png
     
  11. 027

    027 Активный участник

    9.039
    2.885
    Бред собачий.
     
  12. The Chief

    The Chief Активный участник

    11.697
    946
    @sema, бред. Кстати, 15 лет тому обратно я на PHP очень быстро (за 3-4 дня), не зная до того его вовсе, накидал вполне работоспособный (хотя и очень примитивный) фронтэнд для b2b сайта, интегрированный с 1С (эту часть писал техдир). Нормальный язык вполне.
     
  13. 027

    027 Активный участник

    9.039
    2.885
    Это вы как-то очень сильно в жиквери поверили, чтобы на такое простой либой замахнуться! :)
    Кстати вот потыкал.
    Подкупила методика однофайловых компонентов — по описанию все так здорово, просто песня.
    В реальности компилятор на простую, казалось бы, свистоперделку — слайдер на вьюи-бутстрапе — вывалил прожорливый бандл на пару сотен килобайт (+ около двух мегабайт map.js).
    То ли задачка для конкретного фреймворка неудачная, то ли лыжи на асфальте... Но я уже столько ублюдочного тормозящего дерьма повидал, что как-то в авторы еще одной кучки кала не стремлюсь.

    И как всегда, подходящий плагин нашелся сильно после завершения траходрома. Случайно наткнулся на реактивный костыль для жКвери. Глядишь, пару сотен нервных клеток выжило бы.
     
  14. E13

    E13 Активный участник

    10.793
    1.680
    Не знаю, за что не любят пхп. Обычный С-образный язык, в последнее время с разными полезными свистелками. Разве что, очень не хватает ван-лайнеров: их по чуть сделали, но нужно больше. Ван-лайнеры - благо!

    Скорее по дурости и боязни на чем-то новом писать. Потерял несколько месяцев из-за этого на переделках :)

    Тут пожалуй без вариантов. Вряд ли какой-нибудь реакт даст более компактный код. А если штуки вроде электрона смотреть - там вообще счастье: меньше нескольких десятков мегабайт никак не получится. Даже если приложуха пишет "хелло ворлд" просто.
     
  15. 027

    027 Активный участник

    9.039
    2.885
    Так электрон и есть браузер, задействованный для отрисовки скриптятины на десктопе. Утилизирование толп жабаскриптеров, влюбленных в это одоробло.
    Кстати, есть очень компактная штука «вроде электрона», тикль называется — Tcl/Tk. На нем, помнится, кроссплатформенный клиент мессенджеров был написан, забыл, как называется.
     
  16. The Chief

    The Chief Активный участник

    11.697
    946
    Попинайте меня. PHP. Листает AD, выбирает юзеров и контакты с ip-телефонами, из них делает json для софтфона Acrobits Groundwire.

    Не слишком ли черезжопно я работаю с массивами?

    PHP:
    <?php
    function convertBinToMSSQLGuid($binguid)
    {
            
    $unpacked unpack('Va/v2b/n2c/Nd'$binguid);
            return 
    sprintf('%08X-%04X-%04X-%04X-%04X%08X'$unpacked['a'], $unpacked['b1'], $unpacked['b2'], $unpacked['c1'], $unpacked['c2'], $unpacked['d']);
    }

    $username   'readldapuser';
    $password   '###########';
    $server 'ldap://#####.local';
    $domain '@#######.local';
    $port       389;

    $ldap_connection ldap_connect($server$port);

    if (! 
    $ldap_connection)
    {
        echo 
    '<p>LDAP SERVER CONNECTION FAILED</p>';
        exit;
    }

    // Help talking to AD
    ldap_set_option($ldap_connectionLDAP_OPT_PROTOCOL_VERSION3);
    ldap_set_option($ldap_connectionLDAP_OPT_REFERRALS0);

    $ldap_bind = @ldap_bind($ldap_connection$username.$domain$password);

    if (! 
    $ldap_bind)
    {
        echo 
    '<p>LDAP BINDING FAILED</p>';
        exit;
    }
    else
    {
    // echo 'login successful';
    }

    $base_dn "DC=#######,DC=local";


    $filter ="(&(objectCategory=person)(!(UserAccountControl:1.2.840.113556.1.4.803:=2))(|(ipPhone=*)))";

    $attr = array("sn","givenname","displayname","objectguid","ipPhone");

    $result ldap_search($ldap_connection,$base_dn,$filter,$attr);

    $rescount ldap_count_entries($ldap_connection,$result);

    $data ldap_get_entries($ldap_connection,$result);

    if (
    $data["count"] > 0)
    {
    $array_contacts = array();

    for (
    $i=0$i<$data["count"]; $i++)
    {
    $array_person = array();
    $array_person['contactEntries'] = array ( array(
    "entryId" => "tel:0",
    "label" => "Внутренний",
    "type" => "tel",
    "uri" => ($data[$i]["ipphone"][0])
    ));
    $array_person['contactId'] = convertBinToMSSQLGuid($data[$i]["objectguid"][0]);
    $array_person['countryCode'] = 'ru';
    $array_person['displayName'] = $data[$i]["displayname"][0];
    $array_person['fname'] = $data[$i]["givenname"][0];
    $array_person['lname'] = $data[$i]["sn"][0];
    array_push($array_contacts,$array_person);
    }
    $json json_encode(array('contacts' => $array_contacts),JSON_UNESCAPED_UNICODE);
    header('Content-Type: application/json; charset=utf-8');
    header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
    echo 
    $json;
    }
    else
            {
                echo 
    "<p>No results found!</p>";
            exit;
            }


    ?>
     
    Последнее редактирование: 20.09.20
  17. The Last Winged

    The Last Winged Активный участник

    12.552
    375
    Крайне плохой подход. Без практики теория не усваивается.
    Более того, практики должно быть значительно больше теории, т.к. мотивирует продолжать изучение именно практика.

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

    Ну, слишком, прямо перебор.

    1. Используйте инструменты проверки качества кода: phpcs, phpstan. Пишите тесты. Сразу увидите, что исправлять.
    2. Никогд не используйте ассоциативные массивы для данных с известной структурой. Используйте объекты прописанными полями.
     
    Последнее редактирование: 20.09.20
  18. The Chief

    The Chief Активный участник

    11.697
    946
    Предлагаете классы? Вот для этой микрозадачи?
     
  19. The Last Winged

    The Last Winged Активный участник

    12.552
    375
    Да, предлагаю. С ними проще.
     
  20. The Chief

    The Chief Активный участник

    11.697
    946
    @The Last Winged, больше ООП для бога ООП! Объявить три класса (contactEntries тоже список, пусть пока и из одного подэлемента), которые всё равно будут иметь внутри массивы. Написать сериализацию для класса person, чтобы json_encode правильно работал. Увеличить код раза в 3-4. Вопрос — зачем? Чего я не понимаю в этой парадигме?

    Кстати, а если оставить ООП в стороне, то какие претензии к процедурному коду?
     
  21. The Last Winged

    The Last Winged Активный участник

    12.552
    375
    В языке роль структур синтаксически выполняют классы. Не думайте о них, как о классах. Это НЕ ООП.

    Общее впечатление - "на отвяжись". Просто по всем параметрам. Начните с механических анализаторов, чтобы не отдавать такой код на ревью.
    После их применения будет уже сильно по другому.
     
  22. Иной гость

    Иной гость Активный участник

    22.222
    3.415
    Мне кажется "php" и "красиво" - это понятия практически несовместимые.
    PS. Я бы тоже через класс реализовал. Читается лучше
     
  23. Дмитрий Н

    Дмитрий Н Активный участник

    2.120
    396
    Попытка накинуть на вентилятор детектед :d
     
    027, ski и Иной гость нравится это.
  24. The Chief

    The Chief Активный участник

    11.697
    946
    PHP Code Checker и Phan (c minimum_severety => 0) говорят, что я классный пацан. Другие варианты анализаторов есть?
     
  25. The Last Winged

    The Last Winged Активный участник

    12.552
    375
    Простите, а какие из современных скриптовых языков сейчас лучше?
    Для JS даже костыль в виде TS придумали, который в рантайме импотент, в руби типизация нормальная только в 3 появится, в питоне типы тоже в байткод не собираются. PHP имхо сейчас безальтернативно в топе для крупного бекенда из скриптовых, из компилируемых конкуренты конечно же есть.

    Стандарт PSR12 включите.
     
  26. Дмитрий Н

    Дмитрий Н Активный участник

    2.120
    396
    Вопрос наверное будет в том, что мало кто из присутствующих собственно видел этот "крупный бекенд". PHP в плане ООП как раз практически ничем не отличается от ООП в Java или C# и даже C++ в каких то общих моментах, т.е. берём любую книжку по DDD и смело применяем оттуда приёмы проектирования на омерзительном РНР :d

    А скрипты-наколенники, что выше, не стоят обсуждения в этой плоскости. Там главное отступы соблюдать и придерживаться единого стиля кодирования, чтобы потомкам было проще ковыряться.
     
  27. Иной гость

    Иной гость Активный участник

    22.222
    3.415
    Мне, если честно, страшно представить что можно собрать крупный бекэнд на пхп ) ну правда, все же можно на уровень микросервисов раскидать, а те, например в golang. Фронтенд вообще в идеале статика+CDN+микросервисы опять же.
    Что касается питона, то для базовых вещей он вполне спокойно справляется через докер и масштабирование, а если надо отдельные вещи разогнать (скажем математику), то есть jit / numba например.
     
  28. The Chief

    The Chief Активный участник

    11.697
    946
    Меня пока что интересует код, а не красивые отступы.

    PHPStan прицепился к тайпхинтингу в функции (т.е. хочет
    PHP:
    function convertBinToMSSQLGuid(string $binguid): string
    ), но при этом совершенно не в курсе, какой массив возвращает ldap_get_entries.

    Есть PyPy. Я пробовал, по скорости мне понравилось.
     
  29. The Last Winged

    The Last Winged Активный участник

    12.552
    375
    Самый большой российский форекс, он достаточно большой и на мировом рынке. Там внутренние проекты на PHP, они не микросервисы, но и не монолит. Что-то по 10 человеколет.
    Я думаю, что беспроблемная граница монолита где-то на 6 разработчиках на ухоженном проекте вне зависимости от его длительности. Вполне можно за сотню человеколет такой перевалить, не скатывая в состояние легаси. Мне приходилось работать и на проектах за сотню, и на крошечных сервисах, где набор нескольких сущностей в базе с API - уже отдельный сервис.

    PSR-12 - это не только про отступы.
    Общее впечатление - нечитаемая неподдерживаемая простыня.
     
  30. The Chief

    The Chief Активный участник

    11.697
    946
    Не только, конечно. Оно ещё заставляет в «if else» открывающую и закрывающую фигурные скобки быть на разных позициях, а в function — в одинаковой. При этом, например, не проверяет одинаковость задания литералов (двойные или одинарные кавычки).

    Для меня вот такой код нечитаем и логика индентинга открывающей скобки непонятна:
    PHP:
    function convertBinToMSSQLGuid($binguid)
    {
    // тут тело функции
    }

    // бла-бла-бла

    if (! условие) {
        
    // то что-то сделать
    } else {
        
    // иначе не делать и выйти
        
    exit;
    }
    а вот такой — читаем, да и совпадает с индентингом в function:
    PHP:
    if (! условие)
    {
        
    // то что-то сделать
    }
    else
    {
        
    // иначе не делать и выйти
        
    exit;
    }
    Но это считается неправильным!

    И да, с каких пор функции стало обязательным выносить в отдельные модули?

    У меня такой стандарт вызывает законные вопросы.