24 декабря Архивач восстановлен после серьёзной аварии. К сожалению, значительная часть сохранённых изображений и видео была потеряна. Подробности случившегося. Мы призываем всех неравнодушных помочь нам с восстановлением утраченного контента!
Добро пожаловать. Тут мы по прежнему изучаем язык PHP (а также JS/CSS/HTML/SQL) и учимся делать сайты. Зачем? Кто-то хочет открыть стартап, кто-то заработать на лапшу быстрого приготовления, кому-то просто нечего делать.
Это тред для начинающих. Слово «классы» у тебя ассоциируется только со школой, а в аттестате тройка по математике? Ты наш человек.
Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания JS/HTML/CSS/SQL. Решай их параллельно с задачами выше.
- скачать учебник: зайди на https://github.com/codedokode/phpbook, нажми зеленую кнопку Code -> Download ZIP, распакуй на рабочий стол и открой index.html - что будут спрашивать на собеседовании, если 0 опыта - будут гонять по теории, по официальному мануалу PHP, давать дурацкие задачки на переворачивание строк, гонять по SQL (транзакции, внешние ключи, напиши запрос), по JS (как сделать анимацию при нажатии кнопки), ну погугли, не ленись - сколько времени надо изучать все это? - все зависит от тебя, в районе 12-24 месяцев
>>3128835 > Проебался В следующий раз кати с нормальными картинками сразу. Такие треды очень чувствительные к перекату и вызывают бурление по поводу проблем с шапкой. Если видишь что проебался, то кидай репорт, но только не заруинь больше никогда картинки.
О госпаде. Всетаки втулили в шапку эту простыню из говна. Похоже пыхе реально суждено не выбраться из хуиты с задачками про два стула яблока и калькулятора на хтмле и джейквери
>>3128808 (OP) Нужно импортировать XSLX файл. Как я понимаю без библиотек это можно сделать только при помощи класса ZipArchive. Хотел его использовать, но мне пишут, что 'ext-zip' is missing in composer.json То есть у PHP нет встроенной поддержки работы с Zip? Ну ладно, если честно я не понимаю, может ли установка расширения Zip привлечь к нагрузке к проекту? Я не хочу писать лиду в выходной. Но просто я не знаю о последствиях, которые может привести подключение лишнего расширения. Если это как то затормозит проект, тогда вряд ли позволят его подключить, и я скажу продакту, что использовать буду CSV.
Трейт это набор полей и методов, которые можно добавить в любой класс.
Если ты из трейта обращаешься к методам, которых нет в трейте, и которые должны быть в использующем трейт классе, то, по моему, надо делать их абстрактными в трейте. Чтобы код был понятнее и чтобы находить ошиюки. Но почему-то почти никто так не делает.
>>3130205 Хэш-таблица, она же словарь, она же ассоциативный массив. Если значением поля (ключа) является функция, то оно называется методом. Все просто. Такой же механизм в Lua, но в Js есть еще и наследование. Вот в PHP не знаю, как устроены объекты.
AJAX - с помощью fetch отправляешь на сервер HTTP-запрос (GET, POST и др.), тебе приходит ответ с JSON данными (или ошибка). На хабре все описано: https://habr.com/ru/articles/252941/
>>3129924 >Если ты из трейта обращаешься к методам, которых нет в трейте, и которые должны быть в использующем трейт классе Ужаснулся, какая это свалка должна быть, в жизни бы не стал прикасаться к подобному коду.
>>3129271 Порридж, за вежливостью и нетоксичным общением на хабр или пикабу. А Столяров это местный мем. То, что ты не знаком с его книгами, уже говорит о многом (хотя для PHP'шника это в общем простительно).
JS не такой уж и сложный, если это не твой первый язык, то за неделю основные моменты прочесть и изучить можно. "AJAX" это написание кода на JS, и без знания JS тут никуда.
>>3128808 (OP) Есть задача сделать некий функционал на чистом пхп, без фреймворков. Допустим, наполнить базу товарами, сделать поиск/редактирование/удаление товаров и ещё что-то в таком духе. И нужно сделать это максимально ООП-шно.
Я накидал такую схему: есть index.php, который показывает страницу с кнопками, списками и прочим. По кнопкам срабатывают js-срипты и аяксом дёргают файл-роутер router.php. В нём подгружается класс DB.php (подключение базы), Product.php (вся работа с товарами) и другие. Далее идёт разбор реквеста и определяется, какой метод нужно дёрнуть. В каждом методе свой валидатор (выносить куда-то в конструктор, а то и в отдельные файлы-реквесты и делать ларавелоподобный валидатор будет слишком наворочено, мне кажется). То есть, метод из класса Product валидирует реквест, тут же запрашивает через PDO базу, анализирует ответ и выдаёт echo, которое возвращается аяксом в браузер.
И что-то мне это не нравится. Как бы это всё более феншуйно оформить?
> То есть, метод из класса Product валидирует реквест, тут же запрашивает через PDO базу, анализирует ответ и выдаёт echo, которое возвращается аяксом в браузер.
Ты совмещаешь 3 функции MVC в одном классе:
- управление обработкой запроса (что должен делать контроллер) - внесение изменений в БД (задача модели) - вывод результата (задача представления)
MVC - это как раз идея, как эту свалку кода разделить.
Прочитал. Не совсем понятны отличия разных схем работы с БД, и главное, как это всё применить на живом проекте. Там как будто нет кусков текста. Например, class News extends ActiveRecordBase - в ActiveRecordBase , насколько я понимаю, нужно прописать методы круда.
В первой статье разобран пример >Сначала напишем Контроллер, который будет при обращении к нему выводить список объявлений. Но это один контроллер. На каждый запрос писать свой контроллер, без роутера? Там же всё одинаковое, кроме самого запроса нужного метода. Логично же подгрузить всё нужное, затем выяснить, какой экшен запросили, и вызвать нужный метод нужного сервиса. Правда, получится один контроллер на всё приложение. Но блин, если по контроллеру на каждый запрос писать, они же реально практически не будут отличаться.
>- вывод результата (задача представления) Запросы идут через аякс, следовательно, вью тут у всех одинаковый: просто джисоним то, что нужно отправить в браузер и делаем echo. Разве нет?
Бетмены, можете phar.readonly = Off в php.ini и запустить файл со следующим кодом:
$phar = new Phar('file.phar'); $phar->buildFromDirectory(__DIR__); $phar->stopBuffering(); foreach ($phar as $file) { echo $file->getFilename() . "\n"; }
Можно ещё в папку, в которой будет лежать этот код, кинуть ещё пару файлов. Хоть пустые txt создать. При первом запуске, когда file.phar не существовал и только вот был создан, у вас что-нибудь выводится? Потому что у меня нихуя, хотя, говорят, должно. Если вместо > $phar->stopBuffering(); Сделать переоткрытие > $phar = new Phar('file.phar'); То всё чинится, но, по-моему, это говной какой-то отдаёт. Как мне получить актуальный список файлов в phar-архиве без его переоткрытия, ёпта?
> Не совсем понятны отличия разных схем работы с БД, и главное, как это всё применить на живом проекте. Там как будто нет кусков текста
Там описана идея, а не дается готовый кусок кода. Самая простая реализация это TableDataGateway - когда для каждой таблицы ты делаешь класс, и помещаешь в этот класс все операции над таблицей (например: добавление записи, удаление, поиск и тд).
> в ActiveRecordBase , насколько я понимаю, нужно прописать методы круда.
Да.
> Но это один контроллер. На каждый запрос писать свой контроллер, без роутера?
Да. Вот, например, у тебя есть: 1) просмотр списка товаров, 2) добавление товара 3) удаление товара - это нужно 3 контроллера (но обычно делают не 3 класса, а один класс, а в нем 3 метода).
Что касается роутера, это компонет, который смотрит на URL и решает, какой контроллер вызвать. Он обычно один. В статье про MVC для упрощения роутер не пишется на PHP, а используется возможность веб-сервера делать роутинг.
> Логично же подгрузить всё нужное, затем выяснить, какой экшен запросили, и вызвать нужный метод нужного сервиса.
Нет, не логично. Ты по сути предлагаешь вместо разделения программы на части написать весь код в одном огромном файле. Его будет тяжело читать и поддерживать.
> Там же всё одинаковое, кроме самого запроса нужного метода.
В случае удаления товара и добавления товара, нам приходят разные параметры в запросе, и их по-разному надо парсить. Вот уже различие. Парсить запрос - это задача контроллера. А сервис не должен лезть в $_GET или $_POST.
Если у тебя контроллеры однотипные (например: удаление товара и удаление поста), ты можешь сделать один общий контроллер, просто передавать в него параметр, что именно мы хотим удалить - пост или товар. Так тоже можно. Но объединить в одном методе удаление записи и добавление вряд ли получится.
> Запросы идут через аякс, следовательно, вью тут у всех одинаковый: просто джисоним то, что нужно отправить в браузер и делаем echo. Разве нет?
Это надо делать в контроллере. И скорее всего разные контроллеры должны возвращать разный набор данных и твоя идея сделать один класс не сработает.
По Симфони есть документация на английском, которую надо прочесть в первую очередь. Симфони как раз очень хорошо документирована, хотя иногда и приходится искать ответ в коде.
Phar реализует интерфейс RecursiveDirectoryIterator и является итератором. То есть, его можно перебирать в цикле и в нем есть указатель на текущий перебираемый элемент.
Возможно, что в твоем коде просто этот указатель указывает на самый последний элемент и foreach ничего не выводит. Попробуй сделать $phar->rewind() перед foreach.
Также, Phar реализует ArrayAccess. Если способ выше не заработает, попробуй сдампить, чему равен $phar[0], $phar[1] И так далее.
Также, вроде бы надо вызывать startBuffering перед добавлением файлов.
> Возможно, что в твоем коде просто этот указатель указывает на самый последний элемент и foreach ничего не выводит. Попробуй сделать $phar->rewind() перед foreach.
Авотхуй. Скажу больше > var_dump(iterator_to_array($phar)); Результат > array(0) {}
> Также, Phar реализует ArrayAccess. Если способ выше не заработает, попробуй сдампить, чему равен $phar[0], $phar[1] И так далее. Авотхуй x2, но не совсем. $phar[0] равен нихуя. Но вот $phar["file1.txt"] возвращает object(PharFileInfo), как мне бы того и хотелось. Но проблема в чём? Я не знаю, как при всём при этом сделать что-то типа array_keys($phar). Если я знаю название файла, то да. Но я-то его могу не знать. И как быть? Итератор пустой, поэтому array_keys(iterator_to_array($phar)) не покатит.
> Также, вроде бы надо вызывать startBuffering перед добавлением файлов. Авотхуй x3. Я пробовал, не помогло.
Я не уверен в своих выводах, потому что нуб, читать исходники на C совсем трудно, но сложилось такое впечатление. При вызове Phar::__construct(), создаётся итератор, который Phar. И всё, ёпт. Дальше мы добавляем файлы с помощью buildFromDirectory, например, а итератор не меняется. https://github.com/php/php-src/blob/master/ext/phar/phar_object.c#L1220 Вот, смотри. spl_ce_RecursiveDirectoryIterator->constructor дёргается всего в двух местах, в Phar::__construct() и buildFromDirectory https://github.com/php/php-src/blob/master/ext/phar/phar_object.c#L1735 Но во втором случае, как я понимаю, это итератор, который, собственно, собирает файлы, которые пойдут в Phar-архив. А не сам итератор Phar-объекта. Из чего следует картина, которую я обрисовал выше. Итератор phar-объекта создаётся в момент __construct и больше не меняется по ходу. Хочешь получить актуальный список файлов - пересоздай Phar. Так и задумано.
Решаю задачу, где требуется работать с большим объемом данных. Там массивы с количеством элементов 10к+. И localhost стал подвисать. Ему перестало хватать 30 сек. Что можно тут сделать? Сомневаюсь, что смогу сбавить ему нагрузку.
Есть какие-нибудь библиотеки или типа того для php, чтобы отправлять ajax-запросы? Я не знаю нихуя JS и мне нужно реализовать ajax-запросы в ближайшее время. Либо вместо библиотеки напишите какие именно темы нужно дрочить в JS, чтобы смочь написать ajax-запрос на чистом JS.
>>3134183 Наебалово какое-то. Где тут процедуры? Ты когда $con->prepare() пишешь у тебя в голове ничего не щелкает? Может для приличия загуглишь что такое "процедура"?
Ого, ты даже в Си полез. Но, в одном из случаев найденный тобой объект это не часть объекта Phar, а он всего лишь используется для обхода дерева файлов при вызове buildDirectory().
Я замечу еще, что Phar это не просто "плоский" итератор, а RecursiveDirectoryIterator - то есть, итератор по дереву с подкаталогами. Если попытаться его перебрать, то он возвращает одну странную запись - ключом в ней является путь к phar-архиву, а при попытке поучить значение через $phar->current() мы получаем исключение. Поэтому твой foreach наверно ничего и не показывал. Но если у него вызвать getChildren(), то мы получим итератор по файлам в архиве.
Нету никакой валидации при регистрации - у тебя есть валидация на JS, но ее легко обойти, отключив ее в браузере либо отправив запрос напрямую через curl.
У тебя весь код собран в одном файле - и обработка запроса, и вывод HTML. Это очень плохой подход, так как, например, с таким кодом не может работать верстальщик, не знающий PHP - ему было бы удобнее, если бы отдельно были шаблоны, а отдельно логика. Это описано тут: https://github.com/codedokode/pasta/blob/master/php/templates.md
Также, такой подход не масштабируется - если твое приложение станет сложнее, то файлы станут огромными, запутанными и в них невозможно будет разбираться. Также, из-за того, что у тебя все смешано, неудобно вносить правки - было бы лучше, если бы код был разбит на функции и тогда при правке тебе достаточно было бы изучить и исправить всего одну функцию.
Я тебе предлагаю сделать такие исправления:
- убрать все SQL-инъекции (использовать подготовленные запросы) - убрать все XSS-уязвимости (сделать экранирование при выводе всех переменных) - разбить код на 2 части: в одном файле логика, в другом - HTML-шаблон - добавить валидацию данных при регистрации на стороне PHP
В процедурном подходе я не вижу ничего плохого, но в моем понимании, это когда у тебя есть отдельно файлы с функциями (процедурами), а отдельно шаблоны. И каждая функция выполняет какую-то свою задачу. А у тебя все перемешано в кучу. Если тебе интересно улучшить свой код, можешь писать вопросы, я отвечу.
>>3134239 >Но, в одном из случаев найденный тобой объект это не часть объекта Phar, а он всего лишь используется для обхода дерева файлов при вызове buildDirectory() Ну да, я об этом и говорю. У меня сложилось впечатление, что итератор, который Phar, строится только в момент __construct и далее не обновляется, когда мы добавляем в него файлы.
> Если попытаться его перебрать, то он возвращает одну странную запись - ключом в ней является путь к phar-архиву, а при попытке поучить значение через $phar->current() мы получаем исключение. Поэтому твой foreach наверно ничего и не показывал. Но если у него вызвать getChildren(), то мы получим итератор по файлам в архиве. Хотел было сказать, что ты не прав, но ты прав! И это странно. Один и тот же код:
$phar = new Phar('phar.phar'); $phar->buildFromDirectory('.'); var_dump('первый перебор'); foreach ($phar as $file) { var_dump($file); } var_dump('второй перебор'); foreach ($phar->getChildren() as $file) { var_dump($file); } var_dump('третий перебор'); foreach (new RecursiveIteratorIterator($phar->getChildren()) as $file) { var_dump($file); }
При первом запуске (phar.phar не существует), первый перебор пустой. Второй и третий не пустые. При втором (phar.phar уже есть), первый перебор не пустой. Второй и третий тоже не пустые. Из чего, упрощая, формулирую такой вывод: чтобы получить обновлённые данные о содержимом PHAR, нужно не сам объект итерировать, а его getChildren(). И поскольку оно работает всегда, и при первом, и при втором, и при каком угодно запуске, для получения списка файлов правильно использовать не > foreach ($phar as $f) {} а > foreach ($phar->getChildren() as $f) {} Ну, с поправкой на то, что это бы ещё в рекурсивитераторитератор завернуть, чтобы он ходил по вложенным папкам. Сейчас разговор не об этом. Нихуя не понятно почему так. Типа, при 2+ запусках он же и без getChildren() может получить список файлов. А при первом - только с getChildren(). Это что получается? При первом запуске, когда архива ещё нет, он добавляет в него файлы так, будто $phar - директория, в которой находится директория, в которой находятся файлы. А при последующих, $phar - директория, в которой находятся файлы. И почему тогда > foreach (new RecursiveIteratorIterator($phar)) {} не работает? В смысле, не выводит список файлов актуальный. Он же автоматически должен дёргать getChildren() и любую такую фигню, нет? > Если попытаться его перебрать, то он возвращает одну странную запись - ключом в ней является путь к phar-архиву, а при попытке поучить значение через $phar->current() мы получаем исключение Видимо, по этой причине? Потому что Phar добавляет какую-то свою костыльную магию, и как бы итератор, но не совсем обычный? Видимо, это уже какие-то совсем дебри. Будем считать, что разобрались. Спасибо!
>>3134259 >использовать подготовленные запросы А как сделать сортировку по клику на имя столбца с помощью подготовленного запроса ? Там вроде нельзя подставлять имя столбца в плейсхолдер.
>>3135072 Понятно, а запрос оставить подготовленным или обычным писать ? есть смысл делать подготовленный запрос если у меня нет никаких параметров забинденых ?
>>3135064 Это делается с помощью сервиса со схемой базы, который знает какие должны быть названия таблиц и колонок. Ты получаешь название колонок оттуда, а не подставляешь напрямую. https://3v4l.org/fugVD
А подстановка значений должна работать всегда. Поэтому для соединения с базой всегда используют PDO. Офк никто не делает это руками, а пишут сервис, который делает это за тебя.
>>3135625 >Это делается с помощью сервиса со схемой базы, Это все прекрасно про сервис и про базу, у меня по клику на имя колонки происходит сначала сортировка по убыванию, а по второму клику она меняется на противоположную хуяк и по возрастанию. То есть переключатель такой который работает как ссылка.
Теперь новый прикол - решив вынести это во вью файл началась магия. Через ссылки в html переворот не работает, если рисую ссылки через php echo - все работает.
Грубо говоря мне щас надо в уме, в голове представить как скрещивается пхп код с html, в каком порядке это все выстраивается, выполняется, почему если сверху в body написать скрипт эффект один, если снизу другой, если вынести в верх файла из body эффект третий.
Короче если я во вью файле пишу html код и подставляю в ссылку <?php перменная ?> то она не меняет значение по клику. Если пишу echo '<a> .... ' - заебись все робит.
В ссылку я подставляю query запрос что бы через него изменить вид сортировки в переменной и её уже отправить в запрос.
И разгадка явно кроется в том что я инклюжу view файл в мой основной пхп код он склеивается, а вот что происходит с html парашей не ясно куда и как она лепится.
Подскажите, пожалуйста, у нас в компании автотесты пишутся на phpunit и мне надо подхватить это (я тестер ручник).
Сам пхп знаю на базовом уровне (условия, циклы, как создать функцию, которая число в квадрат там возводит и прочее), короче супер-базовый уровень.
Слышал про ооп, классы, экземпляры классов (даже понимаю, что это такое), но никогда не пробовал.
И вот мне показали код на phpunit и я увидел, что там тесты на нативном пхп идут. У меня был опыт с codeception/cypress, но там всё очень-очень просто, типа такого (для человека, кто базово знает программирование всё очень и очень даже понятно) $I = new WebGuy($scenario); $I->wantTo('Хочу убедиться, что форма скрипта Toupper работает корректно'); $I->amOnPage('toupper.html'); $I->see('Конвертируй меня!');
Так вот, у меня вопрос: стоит ли проговаривать с командой, что пхпюнит будет сложнее и дольше мне осваивать и проще внедрить тот же кодсепшн?
А если я не прав, то за сколько примерно можно подтянуть пхп, чтобы писать код в пхпюнит?
>>3135915 В идеале да, я это понимаю, что должен понимать и знать, но на собесе об этом слова не было. Распрашивали о прошлом опыте автотестов, я так и сказал, что тестил фронт на сайпрессе и селениуме, но там детский код был, а тут чистый пхп с ооп, которого я не знаю, тут получается по-хорошему учить программирование на пхп до уровня джуна как минимум, чтобы писать такие тесты
>>3135948 Хз, я всегда думал, что юнит тесты сами разрабы пишут. Сомневаюсь, что джун может в ди, да и описание моков требует понимание того, что там в коде происходит
>>3135952 Так у нас разрабы и пишут сами эти тесты, просто мне (тестеру) тоже нужно развивать автоматизацию.
Из проектов у нас апи и мобилки. С апи работал только как ручник в постмане. С мобилками ваще не работал.
Хз, надо будет обговаривать походу этот момент. Либо ебашить ещё и пхп.
Сколько кстати просить повышения к ЗП при таком условии, что я с нуля документацию пишу, вкатываюсь в автоматизацию и буду учавствовать в её развитии? Пока что зп 110, через 3-5 месяцев получится убедить их грейднуть мне зп хотя бы до 130-150к?
>>3128808 (OP) Есть какой-нибудь грамотный вариант решения задачки. Допустим есть строки, которые отображают числовые значения Но есть проблема, так как целочисленные значения отображаются вместе с нулем, то есть 64 => 64.0 75 => 75.0 653.34 => 653.34 343.2 => 343.2 Как сделать так, чтобы отобразить эти значения в нормальном виде, то есть 64.0 в виде 64, а 75.0 в 75, а 653.34 отсалось таким же?
Если у тебя линукс и Alt + клик перетаскивает окно, попробуй правый Alt или погугли, как поменять клавишу для перетаскивания (может быть программой вроде Gnome Tweaks, если у тебя Gnome). В моем линуксе окно перетаскивается по Win + клик и проблем нет.
А это нормально что даже решение задачи уровня 2х2 в кодинге вызывает у меня паническую атаку и я в душе не ебу как сопоставить эти закорючки скобочки буковки чтобы получить решение? Думаю даже школьник бы интуитивно догадался, а я не могу Как развить элементарную логику?
Когда вставляешь данные в БД нужны плейсхолдеры. А когда достаешь из БД? Если я сохраню sql-код в БД и запрошу его SELECT, то СУБД просто отдаст его или выполнит?
Отправил POST данные на сервер, при перезагрузке страницы выскакивает уведомление о том, повторить ли отправку формы. Есть способы убрать кроме редиректа?
Какой положняк по switch против множества elseif? Я сначала думал, что круто, а потом узнал, что это аналог == вместо ===, теперь сомневаюсь. Было бы просто синтаксическим вопросом - ок, но ведь и поведение меняется слегка.
А почему Линукс? Может быть, разработчики IDE не учли эту особенность? Она известна уже много лет. Ну и линуксы разные, у меня клавиша Win используется для перетаскивания окон. В твоем Линуксе тоже скорее всего можно поменять эту клавишу. Что у тебя за оболочка, Gnome? KDE?
Плейсхолдеры нужны только при вставки. При их использовании БД правильно экранирует все спецсимволы (вроде кавычек) и в БД вставится ровно тот текст, который ты передал. При получении из БД ты получишь его в точно таком же виде. SQL код, вставленный в БД, не выполнится - можешь проверить и посмотреть, что вставится.
1. > При втором (phar.phar уже есть), первый перебор не пустой. Второй и третий тоже не пустые. Толку от этого примерно нихуя. Он как бы не пустой, но содержит не актуальные данные. Типа, есть у нас phar.phar. Мы запускаем скрипт, добавляя в него какой-то новый файл. Так вот первый перебор этого нового файла в себя не включает, а содержит снимок на момент запуска скрипта. Иначе говоря, вообще нет ситуаций, в которых $phar имело бы смысл перебирать, только $phar->getChildren() может содержать актуальные данные.
2. Допустим, ну и хуй с ним! - скажет мне анон. Я и так пришёл к выводу > нужно не сам объект итерировать, а его getChildren() Ага. Только есть одно но: > И поскольку оно работает всегда, и при первом, и при втором, и при каком угодно запуске Это нихуя не так, лол. С первого взгляда - так, но со второго - нет.
$phar = new Phar('phar.phar'); $phar->buildFromDirectory('.'); var_dump('первый перебор'); foreach ($phar as $file) { var_dump($file); } var_dump('второй перебор'); foreach ($phar->getChildren() as $file) { var_dump($file); } var_dump('третий перебор'); foreach (new RecursiveIteratorIterator($phar->getChildren()) as $file) { var_dump($file); }
Этот код работает. Всё как будто хорошо. Но что будет, если, например, удалить все переборы, кроме третьего? Просто закомментирую их.
$phar = new Phar('phar.phar'); $phar->buildFromDirectory('.'); //var_dump('первый перебор'); //foreach ($phar as $file) { //var_dump($file); //} //var_dump('второй перебор'); //foreach ($phar->getChildren() as $file) { //var_dump($file); //} var_dump('третий перебор'); foreach (new RecursiveIteratorIterator($phar->getChildren()) as $file) { var_dump($file); }
Хуяк! При 2+ запуске будет > Uncaught UnexpectedValueException: RecursiveDirectoryIterator::__construct failed to open dir: operation failed
Какого хуя? Я ничего не менял в коде, просто закомментировал первые два прохода. А что, если... да ну, не может быть... но...
Добавил перед третьим проходом ещё один пустой проход по $phar > foreach ($phar as $f) {} Хуяк! Всё заработало. Того же самого эффекта можно добиться через > $phar->seek($phar->count()); Но если делать так, то при 1 запуске (когда phar.phar ещё нет) будет ошибка. И да, бля, Phar::seek именно на Phar::count(), без декремента. Какого хуя? Мы ведь выходим за границы итератора. А вот) Я нихуя не понимаю, короче. Сейчас, вроде, оно работает именно так, как мне нужно, но почему это работает - хуй поймёшь.
Вот финальный рабочий код:
$phar = new Phar('phar.phar'); $phar->buildFromDirectory('.'); foreach ($phar as $f) {} foreach (new RecursiveIteratorIterator($phar->getChildren()) as $f) { var_dump($f); }
За каким хуем нужен пустой > foreach ($phar as $f) {} Я вообще не понимаю, но он нужен.
>>3137571 Например ты чтобы делать всякое с переменными в которых ты не знаешь что будет лежать? $killToDeathRatio = $kills / $deaths $circleCircumference = $circleDiameter * 3.14159265
>>3137568 Когда ты вводишь циферки просто в программу это называется ЛИТЕРАЛ. Вот у тебя тут ЧИСЛОВЫЕ ЛИТЕРАЛЫ и они присваиваются переменным. Вся идея ЛИТЕРАЛОВ что они всегда должны в программе объясняться где-то рядом с собой. Когда ты значение в переменную записываешь, то понятно становится что обозначает ЛИТЕРАЛ. Но когда ты оперируешь значениями, там не должно быть никаких неоднозначных литералов. Твоя программа должна читаться как инструкция на английском. И в седьмой строке у тебя должно было быть записано правило расчёта курса. А в правиле не должно быть никакой конкретики, литералы в правиле абсолютно непонятно что означают, правило действует для всех долларов и рублей. Поэтому тебе надо было там написать $roubles = $dollars * $exchangeRate; Видишь как в этой строке потерялась конкретика про числа? Ты абстрагировался от конкретики и теперь стал настоящим программистом. Либо я тебя покормил, либо тебя ждёт долгая дорога, типа лет десять до первой вакухи
>>3137571 Это просто наследие ассемблера PDP-11, не обращай внимания. Тогда программировали на перфокартах и надо было каждый символ экономить. Все пиздец к такой записи привыкли и от неё отказываться уже поздно, будешь постоянно в программах встречать.
>>3137571 слушай сюда сынка нах айти это тебе не про комфорт это про сверление тебе в анусай всякой старой хуеты которая просто есть и которую нужно просто принять и затолкнуть поглубже в очко если ты хочешь найти работу
>>3137575 >Поэтому тебе надо было там написать $roubles = $dollars * $exchangeRate; Звучит разумно, по моему я так и написал впервые, но не там где нужно. Сейчас буду решать задачку про кубик! Ждите через пол дня
Это короче писать и нагляднее, по крайней мере для меня:
$x += 10; // сразу понятно, что надо увеличить x на 10
$x = $x + 10; // надо чуть дольше читать чтобы понять, что тут делается
Если же ты имел в виду "почему нельзя написать просто $x = 20", то ответ, иногда мы сами не знаем, чему будет равна переменная, но хотим ее увеличить на 10.
Но тот анон про наследие PDP (компьютер из 70-х), возможно, и прав. Эта конструкция унаследована из языка Си (так что теперь ты заодно знаешь, как увеличивать переменные в Си).
Надо было использовать переменные, а не числа в строчке 7. Сейчас, если ты хочешь узнать, сколько стоят 300 долларов, тебе надо 2 раза менять числа. А желательно, чтобы число 200 было написано только один раз и достаточно было поменять его в одном месте.
>>3137789 > как увеличивать переменные в Си ШОК! СЕНСАЦИЯ! УВЕЛИЧЬ СВОЮ ПЕРЕМЕННУЮ ДО 64 БИТОВ! НАДО ВСЕГО ЛИШЬ В НАСТРОЙКАХ КОМПИЛЯТОРА УКАЗАТЬ ПРОСТОЙ, КОПЕЕЧНЫЙ...
У меня есть сайт, сделанный на Laravel, как теперь его выкинуть на какой-нибудь хостинг? Или лучше, как из локального сервера сделать доступный из интернета сервер? На компе стоит Apache
Что джуна отличает от сеньора? Джун это тоже самое, что и сеньор, только без опыта работы? Или джун это тупой говнокодер, который в будущем должен стать сеньором с чистым кодом?
Теоретически, синьор - это тот, у кого есть какой-то опыт коммерческой разработки, и который типа может самостоятельно предлагать и реализовывать решения. На практике же все очень размыто - есть т.н. "джуны" способные разработать приложение от и до, есть т.н. "синьоры", которые годами кнопки красят. Короче, вся эта дифференциация по цвету штанов в основном нужна как предлог работодателю тебя по зп опустить.
На первую работу выходил как пхпшник. Но спустя неделю стал полноценным фронтендером на Вуе и нуксте. И с тех пор прошло больше двух лет Стоит пытаться вернуться в пхп? Возможно ли это без просадок зарплаты?
>>3142597 Ты даже близко не смыслишь в программировании. Учи любой, кроме пхп - python, c#, haskell. Просто покрути колесо с именами япов и что выпадет то и учи абсолютно без задней мысли.
>>3142687 Ну го заебись. И строго типизированный и компилируемый и популярный и в девопсе юзается и в вебе и можно на мобилки даже че-то склепать, даже игровой движок есть. Выпало лучшее что можно "для себя" изучать. Может только синтаксис не очень понравится, но мозг быстро привыкнет.
Есть тут битриксоиды? Сколько времени на работу тратите из 8 часового рабочего дня? Есть время на саморазвитие (laravel или другие стеки) или только во вне рабочее время получается?
>>3142778 >>3142426 Нашел такой вариант BigDecimal::of($cellValue); number_format() не подходит Но теперь оказывается не совпадение между данными полученными из XLSX файла и CSV файла. Так как XLSX отдает числа с E, а CSV формат числа округляет
Есть какие-нибудь крупные задачи на php и js одновременно? Чтобы в js пришлось писать не только аякс-запросы. Ну и подкиньте идеи какое веб-приложение можно написать, где пригодился бы js. Хочу попрактиковаться.
Соре, за относительный нерелейтед, но все же спрошу. Анон-лапочка в одном из разделов скинул кастомный CSS для макабы, который скрывал все посты, к которым не прикреплены картинки/шебм, а я его пролюбил - помогите плес придумать его заново Помню только логику внутри, типа сначала всем блокам сообщений ставился скрытый статус, а затем те что с медиа раскрывались обратно
В идеале разумеется нужен JS скрипт, который будет встроенный класс post_type_hidden проставлять, тогда будет функционал обратного раскрытия работать и вообще все будет как обычно работать. Но если нужно просто скрыть все навсегда, то и так пойдет.
Если мне надо асинхронные данные загрузить в ларе типо списка фильмов, мне нужно какие то библиотеки подрубать async ? и где это хранить в самой ларе, в отдельном файле ?
>>3142779 Я на битриксе РАБотал, съебал в конце прошлого года. Если в кратце, то это лютая потогонка, никаких сил и времени на саморазвитие не остается
И с помощью ini_set, и с помощью set_include_path, я могу добиться ровно одного и того же. Просто первое более универсальное и как бы более низкий уровень, а второе под конкретную директиву include_path. Правильно понял?
Аноны скорректируйте меня по вкату плз, я разобрался кое как со студентами т.е. понял все составляющие. Так же я полистал книжонку по ларе, типо сделал туду лист, увидел мидллвар, валидацию, языки, аутинфекацию. Потыкал mysql.
Стоит ли пытаться уже вкатываться ? По факту я могу ебаться еще бесконечно долго - пилить более сложный проект на ларе, пойти копаться в слиме, решать литкоды, это может растянуться на год а прокрастинация уже начинает ебать.
Изучение идет в стол, я изучаю вью, перехожу к ларе, начинают забывать вью, потом вспоминаю алгоритмы и структуры, потом другое забываю и так про кругу. И баз тоже дохуя и с запросами можно ебаться.
Ощущение что я вообще не могу все это говно выучить одновременно.
>>3146838 Вот сколько раз замечаю, что любите вы вкатуны пиздеть чего не знаете. Ну если ты не был на собесах никогда, так нахуй ты пиздишь хуйню какую-то выдуманную?
>>3146819 Не будет у тебя никаких собесов. Тебе сначала нужно автофильтры резюме на ХХ пройти. А для этого нужно указать точные теги со стеком, в котором пытаешься найти работу. И правдоподобно напиздеть про хотя бы год реального опыта. Короче грамотное резюме составить. А потом спамить как ебанутому на любую вакансию, с подходящим стеком в течении нескольких месяцев
Только на этом этапе с тобой вообще живые люди разговаривать будут. И офк нужно будет еще не обосраться на тех единицах собесов, на которые тебя ВОЗМОЖНО пригласят. Вот и думай.
>>3146854 >Только на собесах поймешь чего не хватает, учить будешь более предметно Ну вообще, анон, мб прав. Я проходил тестовое. Это, конечно, не собес, но все же. Узнал немного нового. + появилась мотивация JS учить. Щас вот дочитываю учебник. >Не будет у тебя никаких собесов. И все что дальше - согласен. Работодатели вообще пидорасы. 2 раза давали мне тестовое задание, 2 раза я его делал, кидал им и они два раза просто игнорили. Просто игнорили. Джун все равно что пыль для них, раз само величество лид или сеньор не могут написать "Мы уже нашли человека на эту должность" или "Вы нам не подходите".
> Слон, как талисман постгреса был предложен в 1997 году по мотивам произведения Агаты Кристи «Слоны умеют помнить». (Я помню, как на своей страничке гордо вешал логотип Постгреса в виде гепарда). > "Помните детскую сказку про то, как портной-индиец воткнул иголку в слоновий бивень? Нет, конечно, не в бивень, а в хобот. Когда слон в следующий раз проходил мимо, он набрал воды и окатил портного с головы до ног, хотя не видел его несколько лет. Он запомнил, потому что слоны умеют помнить."
> Наш слоник раньше появился
Но он был зеленым, а не синим. Не надо воровать чужих слонов.
Не пишите что сложно - похуй на сложно. Знают ооп, принципы, код симфони не вызывает ужаса, скорее наоборот выглядит далеким от идеалов, особенно длинные функции недекомпозированные. Знаю всю хуйню про контейнеры, атрибуты, всю хуйню с php и тд. Короче код симфони понятен, не пугает. Так что слово сложно можно не писать и на него не ориентироваться.
Вопрос только времени. 1. Что там вообще нужно знать чтобы вот пойти и получить работу? 2. Интересует именно удаленка. 3. Имея опыт с yii / slim framework норм ли напиздеть про опыт с симфони, а то требуют от 3х лет именно с симфони. 4. Если еще DDD навернуть, то нужно Вернона читать или Эванса для начала хватит чтобы работать? 5. И какой стек для Симфони учить? Какой набор инструментов? Стат анализ нужен? Очереди какие? Какая база для работы? 6. И какие проекты на симфе делают? бек с json'ом и rest? Или сайты для домашней выпечки? Какие задачи у вас были? 7. Ну и прав что хочу Симфони выучить? Мол, можно конечно ларавель, но зачем, если можно лучше выучить и иметь норм работу, а не говносайты клепать? Что короче на перспективу?
>>3149861 На перспективу спираль. Во всех вакансиях пишут: фреймворкнейм или любой другой популярный фреймворк. Нахуя тебе учить очередной однотипный фреймворк? Вкатывайся в спираль и роадраннер а потом и в го
>>3149861 На перспективу спираль. Во всех вакансиях пишут: фреймворкнейм или любой другой популярный фреймворк. Нахуя тебе учить очередной однотипный фреймворк? Вкатывайся в спираль и роадраннер а потом и в го
>>3150278 Ты видел доку этого инструмента. Там с ума сойдёшь сколько новых концепций. Это все равно что сейчас хаскель сесть изучать после пхп. Ты с ума сойдёшь уже на рекурсии. Так что не годится. Рекомендуй мне либо ларавел либо симпхони.
>>3150491 Сварку, например. В сварщики вкатиться хотя бы реально. Учить сейчас любой ЯП - это путь в никуда. Есть смысл, только если у тебя есть знакомые, которые помогут с трудоустройством ну или ты порридж студент 1-2 курса, который волчком крутится будет и пробиваться на стажировки.
Я тут подумал, вы извините, не хотел вас демотивировать. Просто реально ощущение такое что про вкат можно забыть. Если 10 лет назад брали с улицы любого бомжа и реально можно было изи вкатится, то сейчас это пиздец. Охуевшие требования, ебучие автофильтры, по 1000 откликов на вакансию.
>>3150658 Люди, которые плачут по поводу требований, ответьте на вопрос: зачем брать человека, знания которого о программировании сопоставимы со знанием школьника 9-го класса, который сел изучать основы любого ЯП?
>>3150755 Да как вы заебали, суки. Я пройду собес на джунскую вакансию. Знаний достаточно. Проблема в том, что на собес еще хуй попадешь, это из разряда фантастики.
>>3150942 Согласен. Все треды по вкату надо закрывать. Заебали еще инфоцыгане, пиздящие везде про то, как охуенно в айтишечке и что на работу устроится можно хоть в 40 лет без опыта с нуля без вышки, после говнокурсов скиллбокса или самообучения даже. Это все пиздеж. На деле ты заканчиваешь свой говнокурс за 200к, тебе дают пдф: Иван Говнов прослушал курс "пхп от бомжа до синьора". Ну либо не дают, если ты самообучался. Дальше ты создаешь резюме на ебаном пидаристическом хх сру. Где, кстати, инфоцыги тоже сидят, вообще вся система найма - это говно ебаное, не только в айти. Там, кстати, на этом хх сру предлагают запилить тебе резюме за бабки, за такую услугу залупляют ценник 10к+. Ну и сидишь ты как долбоеб со своим говнорезюме без опыта или с накрученным (а особо тупые индивиды год обучения в скиллбоксе себе в опыт записывают) и буквально сосешь хуи. На вакансию джуниора в ООО Вектор в мухосрани, у которых у самих весь сайт в рот отъебан и вообще на джумле сделан и отвалился сертификат (тру стори, реальный случай), 200 откликов висит. Звонит тебе хуй, спрашивает сколько ты хочешь денег, говоришь 20 тысяч хочу, а он тебе отвечает: извините, 20 не можем предложить без опыта. А по остальным откликам либо отказ проставляется, либо тишина. И сидишь ты как долбоеб клацаешь отклики во все подряд, а вдруг хотя бы на собеседование пригласят, но везде отказы или игнор и по 1000 откликов на вакансию. Очередь за забором стоит. А если тебе повезло и тебя позвали на собеседование - будут тебя дрочить от 2х часов на позицию стажера за 15к в офисе с отвалившимися обоями, заебывая тупорылыми вопросами, которые не имеют никакого отношения к тому, чем ты будешь заниматься. А ебани-ка алгоритм тасования Фишера-Йетса. Как это ты не знаешь? Ну все, не прошел. И опять все по новой, жмакаешь по кнопкам "Откликнуться" на каждой вакансюльке, надеясь что еще раз повезет и пригласят на собеседование. А там тоже за 2 часа дрочева есть вероятность на каком-нибудь вопросе проебаться. Совсем охуели уже, пидорасы. Не вы, если что, а те, кто вот это все говно устроил с таким дрочевом лютейшим при найме.
Какие хорошие раньше были сайты: http://celnet.ru/OSI1.php Все спокойно, гладко, тихо. Современные сайты в большинстве - тысячи окошек, уведомлений, реклама, которая вылетает и закрывает весь экран. И какой-то 1% мб действительно хороших сайтов.
Как же я заебался из-за одного учебного проекта. Никак не могу добиться желаемого поведения. А самое обидное, что там целый проект, а в треде хуй расскажешь что именно у тебя происходит и чего ты хочешь добиться. Блять, ну за що.
>>3151550 Если без жирноты, то ни разу не приходил случай, чтобы использование анонимных классов было в идее архитектуры. Лично сам его использовал так: сторонняя библиотека хочет принять в функцию класс из собственной библиотеки. Мне нужно, чтобы получился другой результат после вызова этой функции, но создавать целый класс у себя не хочется, поэтому я прямо там динамично создаю анонимный класс наследник и передаю его функции. Поэтому не знаю о других способах использования анонимного класса, кроме как удобного обхода такого рода ограничений. Да вот те же анонимные функции, тоже ведь тема для удобства.
>>3151579 Да тоже сталкиваюсь с этим постоянно. у меня батя системный администратор, но занимаеются абсолютно всей техникой в организации от принтеров до камер и еще сайт им пилит и админит. Постоянно ругается, что я ничего не умею.
>>3152244 Первый год будешь только битриксом заниматься, во второй год можешь выйти на полставки за те же деньги (~40-50к) и по 4 часа задротить норм фреймворк или вообще другой язык и другой стек, через полгода выходишь в отпуск, в отпуске ебашишь по 12 часов и параллельно ищешь работу, обязательно привираешь, если это тру-фреймворк, что уже что-то делал на нём, а если другой стек, то тоже ври, что работал уже с тру-фреймворком.
Ну и вот, спустя 1.5-2 года ты выходишь на норм стек. Правда придётся эти 2 года работать за гроши (~40-50к). Ну и возможно третий год тоже, если не на мидла отсобесишься.
У нас времени мало, мы же люди, подумой, хочешь ли ты полтора-два года своей жизни всрать а бэд практис и на то, что тебе скорее всего никак и никогда и нигде не пригодится в жизни.
Конечно всё познаётся в сравнении. Например, по сравнению с кассиром, оставившим свои мечты далеко позади, ты будешь в более выгодном положении, но ведь ты мог бы лучше, и ты ещё на этапе выбора - можешь или не можешь (не хочешь, выбираешь путь полегче)
Тут мы по прежнему изучаем язык PHP (а также JS/CSS/HTML/SQL) и учимся делать сайты. Зачем? Кто-то хочет открыть стартап, кто-то заработать на лапшу быстрого приготовления, кому-то просто нечего делать.
Это тред для начинающих. Слово «классы» у тебя ассоциируется только со школой, а в аттестате тройка по математике? Ты наш человек.
Предыдущий тред был тут:
Старые треды тут https://2ch.hk/pr/arch/ (искать по слову php), а также на архиваче и в гугле по словам по словам "клуб изучающих PHP".
С чего начать - основы PHP
Наши уроки по PHP собраны по адресу http://codedokode.github.io/phpbook . Это учебник для изучающих с нуля. Там есть задачи, их нужно решать. Но если этот учебник тебе не нравится, можно читать любой другой. Или официальный справочник ( https://www.php.net/manual/ru/langref.php ). Или все сразу.
Если что-то непонятно, запости код и попроси подсказку или поищи задачу в архиве тредов.
Какой редактор использовать
Простые задачки можно решать в онлайн-песочницах вроде https://onlinephp.io/ , https://paiza.io/en/projects/new?language=php , https://www.programiz.com/php/online-compiler/ , но для программ посложнее лучше установить редактор. Есть (дорогая) IDE PhpStorm, есть бесплатный Netbeans и VSCode, условно-бесплатный Sublime Text. Чтобы в последних получить автодополнение для PHP, нужно установить и настроить PHP language server.
Вот инструкции по установке PHP на компьютер: https://github.com/codedokode/pasta/blob/master/soft/php-install.md
Гайд по командной строке: https://github.com/codedokode/pasta/blob/master/soft/cli.md
Что изучать дальше
Зная лишь основы PHP, сайт ты не сделаешь и работу не найдешь. Обычно от начинающего требуют чуть-чуть больше:
PHP, ООП, основы HTTP, HTML/CSS (основы верстки), JS, SQL, PDO, MVC, git, composer, какой-нибудь фреймворк (Laravel или Symfony), основы автоматического тестирования, основы linux, английский.
Вот неофициальный роадмап (карта того, что можно изучать): https://miro.com/app/board/o9J_lbUUBBQ=/
По многим из этих тем у нас есть уроки или задачки:
- для понимания, что такое веб-сервер, прочти урок https://github.com/codedokode/pasta/blob/master/soft/web-server.md
- для понимая MVC, работы с БД и формами, реши задачу про студентов, в ней много полезных советов: https://github.com/codedokode/pasta/blob/master/student-list.md
- далее есть более сложная задача сделать файлообменник на микрофреймворке Slim: https://gist.github.com/codedokode/9424217
- задача, близкая по сложности к реальным задачам на Laravel/Symfony: https://gist.github.com/codedokode/8733007
- после нее можно изучать автоматизированное тестирование https://gist.github.com/codedokode/a455bde7d0748c0a351a
- если ты все решил, переходи к Symfony или Laravel
- почитать про паттерны можно тут https://designpatternsphp.readthedocs.io/ru/latest/ (если ты не изучил ни одного фреймворка, то это будет рановато). Если хочешь увидеть примеры использования паттернов в реальном коде - ковыряй исходники Симфони, например Symfony Forms. Ну и скажем честно, начинающему без опыта, который не видел сложный код, паттерны понять будет сложно.
- для улучшения английского можно читать news.ycombinator.com - там много статей на тему IT.
Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания JS/HTML/CSS/SQL. Решай их параллельно с задачами выше.
- задачи на HTML/CSS: https://github.com/codedokode/pasta/blob/master/html/html.md
- хороший учебник по JS: https://learn.javascript.ru/
- задачи на JS: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
- задача на SPA (сложно): https://github.com/codedokode/pasta/blob/master/js/spa.md
- проверялка решений на JS: http://dkab.github.io/jasmine-tests/
- задачки на SQL: https://www.sql-ex.ru/ (нужна регистрация), https://sql-academy.org/ru/trainer и немного наших задачек: https://github.com/codedokode/pasta/blob/master/db/databases.md
Что еще почитать
- Мануал по PHP — http://www.php.net/manual/ru/langref.php
- https://phptherightway.com/
- Книга: Профессиональное программирование на PHP Джордж Шлосснейгл
- Книга: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
- Про Git: https://git-scm.com/book/ru/v2
- Задачи на алгоритмы: https://codeforces.com/problemset
Дополнительно
- скачать учебник: зайди на https://github.com/codedokode/phpbook, нажми зеленую кнопку Code -> Download ZIP, распакуй на рабочий стол и открой index.html
- что будут спрашивать на собеседовании, если 0 опыта - будут гонять по теории, по официальному мануалу PHP, давать дурацкие задачки на переворачивание строк, гонять по SQL (транзакции, внешние ключи, напиши запрос), по JS (как сделать анимацию при нажатии кнопки), ну погугли, не ленись
- сколько времени надо изучать все это? - все зависит от тебя, в районе 12-24 месяцев