Двач.hk не отвечает.
Вы видите копию треда, сохраненную 25 августа 2018 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Клуб изучающих PHP/webdev #102 /php/ 1199390 В конец треда | Веб
Добро пожаловать в клуб востребованных и популярных людей. Тут мы изучаем язык PHP (а также JS/CSS/HTML/SQL), решаем задачки, печем печеньки и даже делаем простые сайты! Зачем? Кто-то хочет изменить мир, кто-то заработать на лапшу быстрого приготовления, кому-то просто нечего делать.

Да, в нашем треде отвечают почти на все вопросы, только бампайте каждые 5 дней.

Это тред для начинающих. Не написал за свою жизнь ни одной программы и имеешь тройку по математике? Ты наш человек.

Предыдущий тред был тут: >>1174695 (OP) . Остальные треды есть в архиве: https://phpclub.tech/ (там есть поиск, так что можно легко найти обсуждение какой-то задачи или ответы на свой старый пост) или ищутся в гугле по словам "клуб изучающих php" и в архиваче.

Мейлач лежит, админ зверствует? Есть запасной тред на доброчане: /s/res/23225.xhtml#i46467

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

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

С чего начать

У нас есть свои уроки по основам PHP, они собраны и выложены по адресу http://codedokode.github.io/phpbook (вас отредиректит на другой домен, не читайте, не сохраняйте, не запоминайте его, он временный). Это учебник для изучающих с нуля, то есть если ты вообще ничего не знаешь, то можно начать с него. Он простой и понятный. Там есть задачи, их нужно решать (чтобы стать программистом, надо писать код — иначе никак). Пости ссылки на решения в тред, мы их проверим, напишем замечания и дадим советы по улучшению. С другой стороны, если этот учебник тебе не нравится, можно читать любой другой. Или официальный мануал. Или все сразу.

Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Visual Studio Code, Netbeans PHP или PhpStorm (с ним будет удобнее).

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

Ты прошел весь учебник? Молодец, но это были лишь основы языка PHP, этого недостаточно. Вот что в идеале надо изучить еще: ООП, как работает веб-сервер, HTML/CSS, SQL, PDO, работа с таблицами в БД, работа с формами, MVC, git, composer, JS, фреймворки, автоматизированное тестирование.

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

- для начала прочти урок https://github.com/codedokode/pasta/blob/master/soft/web-server.md
- установи Апач + PHP (советы выше и ниже) и читай туториал http://php.net/manual/ru/tutorial.php
- Учи HTML/CSS и SQL, PDO, хотя бы основы
- Далее простая, но полезная задача сделать список студентов, в ней много полезных советов: https://github.com/codedokode/pasta/blob/master/student-list.md
- Более сложная задача сделать файлообменник на микрофреймворке Slim: https://gist.github.com/codedokode/9424217
- Еще более сложная и долгая задача на Yii/Symfony: https://gist.github.com/codedokode/8733007
- После нее можно изучать автоматизированное тестирование https://gist.github.com/codedokode/a455bde7d0748c0a351a
- Если ты все решил, переходи к Symfony 3/Doctrine 2
- Почитать про паттерны http://designpatternsphp.readthedocs.org/ru/latest/README.html (если ты не изучил ни одного фреймворка, то это будет рановато), тут с примерами кода http://designpatternsphp.readthedocs.org/ru/latest/README.html . Имей в виду что без примеров использования их учить бесполезно - не поймешь, хочешь увидеть примеры использования паттернов - ковыряй исходники Симфони, например Symfony Forms. Не заучивай паттерны - смотри код и думай, зачем тут они использованы.

Чтобы делать эти задания, тебе надо установить Апач + PHP (можно заодно сразу и MySQL) на компьютер. Вот полезные инструкции:

https://github.com/codedokode/pasta/blob/master/soft/php-install.md
https://github.com/codedokode/pasta/blob/master/soft/apache-install.md

Может тебе понадобится пользоваться командной строкой, вот гайд https://github.com/codedokode/pasta/blob/master/soft/cli.md

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

Параллельно стоит подучивать английский, на первых порах можно без него, но по мере развития придется все чаще сталкиваться с англоязычными статьями, так что лучше не откладывать. Читать можно news.ycombinator.com - это что-то вроде их хабра. Также можно начинать смотреть фильмы и видео на английском.

Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания JS/HTML/CSS/SQL. Решай их параллельно с задачами выше.

- HTML/CSS: https://github.com/codedokode/pasta/blob/master/html/html.md
- 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/
- MySQL: https://github.com/codedokode/pasta/blob/master/db/databases.md

Что почитать

- Мануал по PHP — http://www.php.net/manual/ru/langref.php
- Сайт phptherightway (перевод на русский: http://getjump.me/ru-php-the-right-way/ )
- По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
- По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
- JS: learn.javascript.ru
- Про Git: https://git-scm.com/book/ru/v1
- Новости IT на англ. https://news.ycombinator.com/
- какой-то древний, устаревший, но большой и на русском справочник по веб-разработке, посоветованный аноном: https://starcat.dp.ua/doc/wdh/

Оформляй код аккуратно!!! — например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492

У ОПа нет аккаунтов и групп вконтакте, в фейсбуке, в твиттере, все "пхп-треды" там поддельные.

Платиновые вопросы

- Почему PHP? Потому что вакансий море, и учить легко.
- Сайт опять упал!!!!! — Не паникуй, а открой http://rghost.ru/6bfCY9lfl и получи личную немного устаревшую оффлайновую копию сайта (можно читать хоть на андроиде без интернета)
- Что надо знать чтобы найти работу - разработчику: PHP, SQL, HTML/CSS, JS, ООП, Git, композер, MVC, фреймворк. Верстальщику - HTML/CSS, JS, jQuery. У нас в треде были люди, которые практически с нуля учились и смогли найти работу.
- Что будут спрашивать на собеседовании если 0 опыта - гонять по теории, по официальному мануалу PHP, давать дурацкие задачки на переворачивание строк, гонять по SQL (транзакции, внешние ключи, напиши запрос), по JS (как сделать анимацию при нажатии кнопки), ну погугли, не ленись
- Можно подробнее про поиск работы, собеседования - нет, ОП писать не будет, но может кто из анонов захочет рассказать. Поищите тред перезвонивших, а также раздел /wrk/
- Сколько времени надо изучать все это? - все зависит от тебя, но не меньше 6-8 месяцев
- Нужен ли ООП, фреймворки, MVC, git, composer? — Да, однозначно. Посмотри любую вакансию.
format-your-code.png59 Кб, 500x644
Ты посмотри на свой код, животное 2 1199392
Код нужно писать не как попало, а аккуратно и по правилам. Почему? Потому, что на неакуратно написанный код не хочется даже смотреть.

Если тебе лень выравнивать код руками, закачай его на http://beta.phpformatter.com/ и нажми «format». Робот исправит выравнивание и отступы в мгновение ока (да, прогресс не стоит на месте). Если ты используешь мощную IDE вроде PhpStorm, там тоже есть функция форматирования кода.

Горячие клавиши для форматирования кода в разных IDE: https://gist.github.com/codedokode/8759492

Вообще, в PHP долгое время не было единого стандарта оформления кода, все писали как попало и было много бардака, но сейчас дело лучше — есть стандарты PSR-1 и 2. Вот как надо оформлять код:

- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults()
- Название функции начинается с глагола, в стиле «сделайЧтоТо»
- не знаешь английский? Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт или slovari.yandex.ru и найди название для переменной там
- в именах классов используется CamelCase, первая буква большая, «_» может использоваться
- мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо из-за обилия точек и кавычек
- мы используем для отступов 4 пробела (можно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)

Вот ссылка на стандарты, где все это описано подробнее и даны примеры оформления:

PSR-1: https://github.com/samdark/fig-standards-ru/blob/master/accepted/ru/PSR-1-basic-coding-standard.md
PSR-2: https://github.com/samdark/fig-standards-ru/blob/master/accepted/ru/PSR-2-coding-style-guide.md
3 1199393
В прошлом треде я ответил на все вопросы, проверил все задачи. Если я кого-то пропустил - напомните о себе здесь.

И да, не разводите флуд.
4 1199405
>>199392

>Ты посмотри на свой код, животное


>животное



неприятно
image.png33 Кб, 721x431
5 1199420
>>1199374

>Для ввода названия предмета мы используем поле ввода, так как набрать несколько букв быстрее


понимаю, просто сам факт того, что там только поле ввода как бы говорит, что учитель может туда ввести, что угодно. Лучше всего будет сделать выпадающи список с поиском.

>Самый сложный момент тут синхронизация данных


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

>>1199377

>Тут админка не особо нужна.


>Доступ к приложению возможен только после регистрации и одобрения администратором.


а где администратор должен давать это одобрение?

>lesson - это занятие в конкретный день или в общем название предмета?


это занятие которое может повторяться
6 1199545
Пачаны, вкачусь, с, наверное, самым классическим и заебавшим всех ИТТ вопросом: хочу зарабатывать хотя бы на кусок хлеба ПОГРОМИСТОМ, сколько времени нужно на освоение основ, необходимых для вката в низшие слои и получения первых рублей?
7 1199555
>>199545
Платина. Мы считаем что 6-12 месяцев при регулярных занятиях если с полного нуля. 2-4 если IQ высок и ты чертовски трудолюбив.
8 1199569
>>199555
Спасибо, буду пытаться и надеятся на то, что мой ICQ на должном уровне.
а то не хочется идти на говноработу, пиздец просто
9 1199631
>>199545
Убил около года на изучение С/C++ C#, и вкатился в php за месяц, больше времени ушло на JS с его конченым синтаксисом и и front-end штуки.
10 1199674
>>199545
ты даже не удосужился прочитать внимательно Оп-пост.
какой из тебя погромист?выпились, даун.
11 1199684
Анон, а сколько именно ты потратил времени на список студентов?
12 1199705
>>199684
За год настроил rewrite в nginx на index.php. А там пхпинфо
13 1199753
Пишу сайт на этой хуте, как тут задекларировать массив? Подобным образом создаётся массив с первым пустым элементом: $array[] = array();
14 1199760
>>199753
где угодно про это написано
15 1199761
>>199760
Где угодно тоесть нигде? Открыл уже 50 ссылок, такое ощущение что в php хуете такого нет.
16 1199762
>>199753

Если ты пришел из другого языка, то не применяй идеи из него к PHP. В PHP переменные не декларируются. Они автоматически создаются при первой записи значения в них. Также, не указывается их тип - переменная может хранить данные любых типов.

Чтобы создать массив, пиши

$array = [1, 2, 3];
$array = [];

Мануал для изучения: http://php.net/manual/ru/language.types.array.php
17 1199788
Порикамендуйте на чем лучше всего практиковаться? Какие задачи востребованы на рынке?
18 1199794
>>199684
Я список студентов делал два раза, и оба раза не доделал. Первый раз сразу после задачек от ОПа, было как-то ну вот сложно, кроме пхп надо было сразу учить и верстку, и основы основ бд, только это заняло у меня пару недель. Потом нашел на хабре пример мвс приложения с роутингом в стиле /controller/method/a/r/g/s, в итоге сделал всё кроме аутентификации. Заняло где-то полтора месяца.
Второй раз решил заново сделать после того как делал файлообменник, ну тут я уже упоролся, написал свой сервис контейнер и нанороутер, сервис контейнер даже мог через Reflection API создавать нужные объекты, но там нужно было допиливать разные фичи, и я опять забил на это все дело, заняло где-то 2 недели, аутентификацию так и не делал. Сейчас хоть бы файлообменник доделать, опять я делаю 80% быстро, а остальные 20% откладываю на потом.
19 1199802
>>199788

Шапку не читал, сори
20 1199810
>>199788
Прокачай алгоритмическое мышление, выполняй базу, чтобы на автомате все делать, пусть и поглядывать в мануалы.
292a617721.png19 Кб, 288x589
21 1199811
Функция preg_match_all выполняемая в цикле, после работы не находя значения по шаблону, все равно записывает пустой массивы в массив. В итоге я не могу вывести сообщение о том результат поиска отрицательный т.к. массив не NULL. Как решить данную головоломку?
22 1199817
>>199811
empty() считает пустой массив пустым
someApprentice 23 1199824
Опять не заметил что предыдущий тред уже закрыт и ответил в него >>1199822
24 1199830
>>1199822
>>199824

> Все они плохо задокументированы. Я разрываюсь между изучением их кода и написанием своего собственного брокера.



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

Писать свое стоит только ради изучения - поиграться немного с кодом, а потом взять нормальную отлаженную библиотеку.

> Больше не буду торопиться и буду больше думать над кодом.



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

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



Это в рамках примера.

> Я имел ввиду, что при задавании таймера сначала выполнится код под ним, а потом, по истечению самого таймера, его код.



Да.

> Т.е. если мы вызовем return после таймаута, то он вернет что-то до его истечения?



Я не очень понял вопрос, но попробую кратко объяснить принцип работы event loop. Тебе стоит глянуть код EventLoop, чтобы понять, как он вообще работает: https://github.com/reactphp/event-loop/blob/master/src/StreamSelectLoop.php

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

Если посмотреть на реализацию, то addTimer() просто добавляет объект-таймер в коллекцию таймеров. $loop->run() в цикле проверяет, есть ли какие-то события, которые мы ждем в будущем (срабатывание таймера, события на потоках), и пока они есть, ждет их возникновения. Если есть потоки ввода/вывода - используется функция stream_select (она блокируется до возникновения события на потоке или истечения таймаута), если мы наблюдаем за потоками, но есть таймеры - просто вызывается usleep().

Соответственно, addTimer() лишь добавляет таймер в очередь, а вызван он будет из $loop->run(), когда придет его время.

Функция $loop->run() завершается и возвращает управление только в 2 случаях: если не осталось событий, которые мы ждем, либо если была вызвана функция явного останова цикла $loop->stop().

> Я плохо знаю низкоуровневые устройства сети, но разве сервер слушает все адреса в интернете?



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

Этот адрес указывает, на каком сетевом интерфейсе (сетевой карте или виртуальном интерфейсе) надо открыть порт. Указывается IP адрес желаемого интерфейса. Кроме того, можно указать значение 0.0.0.0 - что значит, открыть порт на всех сетевых интерфейсах. Например, если ты укажешь 127.0.0.1 - то порт будет открыт на внутреннем loopback интерфейсе и к нему нельзя будет подсоединиться снаружи.

Список сетевых интерфейсов в Windows выводится командой ipconfig, в линуксе ifconfig (или /sbin/ifconfig), или ip link show ( статья: https://www.cyberciti.biz/faq/linux-list-network-interfaces-names-command/ ).

В современном linux, кстати, на 1 сетевой интерфейс можно назначить несколько IP. Это будет выглядеть, как будто у тебя есть несколько сетевых карт, подсоединенных к одной сети.

Если ты хочешь лучше разбираться в сетях, можно погуглить и почитать про протоколы IP, TCP, и сокеты Беркли.

> То есть, если я задам, например, $uri = "google.com:8080", то сервер будет до бесконечности слушать этот адрес, пока google сам не создаст соединение по адресу сервера



Будет ошибка, из-за того что в системе нет сетевого интерфейса с таким адресом.
24 1199830
>>1199822
>>199824

> Все они плохо задокументированы. Я разрываюсь между изучением их кода и написанием своего собственного брокера.



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

Писать свое стоит только ради изучения - поиграться немного с кодом, а потом взять нормальную отлаженную библиотеку.

> Больше не буду торопиться и буду больше думать над кодом.



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

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



Это в рамках примера.

> Я имел ввиду, что при задавании таймера сначала выполнится код под ним, а потом, по истечению самого таймера, его код.



Да.

> Т.е. если мы вызовем return после таймаута, то он вернет что-то до его истечения?



Я не очень понял вопрос, но попробую кратко объяснить принцип работы event loop. Тебе стоит глянуть код EventLoop, чтобы понять, как он вообще работает: https://github.com/reactphp/event-loop/blob/master/src/StreamSelectLoop.php

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

Если посмотреть на реализацию, то addTimer() просто добавляет объект-таймер в коллекцию таймеров. $loop->run() в цикле проверяет, есть ли какие-то события, которые мы ждем в будущем (срабатывание таймера, события на потоках), и пока они есть, ждет их возникновения. Если есть потоки ввода/вывода - используется функция stream_select (она блокируется до возникновения события на потоке или истечения таймаута), если мы наблюдаем за потоками, но есть таймеры - просто вызывается usleep().

Соответственно, addTimer() лишь добавляет таймер в очередь, а вызван он будет из $loop->run(), когда придет его время.

Функция $loop->run() завершается и возвращает управление только в 2 случаях: если не осталось событий, которые мы ждем, либо если была вызвана функция явного останова цикла $loop->stop().

> Я плохо знаю низкоуровневые устройства сети, но разве сервер слушает все адреса в интернете?



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

Этот адрес указывает, на каком сетевом интерфейсе (сетевой карте или виртуальном интерфейсе) надо открыть порт. Указывается IP адрес желаемого интерфейса. Кроме того, можно указать значение 0.0.0.0 - что значит, открыть порт на всех сетевых интерфейсах. Например, если ты укажешь 127.0.0.1 - то порт будет открыт на внутреннем loopback интерфейсе и к нему нельзя будет подсоединиться снаружи.

Список сетевых интерфейсов в Windows выводится командой ipconfig, в линуксе ifconfig (или /sbin/ifconfig), или ip link show ( статья: https://www.cyberciti.biz/faq/linux-list-network-interfaces-names-command/ ).

В современном linux, кстати, на 1 сетевой интерфейс можно назначить несколько IP. Это будет выглядеть, как будто у тебя есть несколько сетевых карт, подсоединенных к одной сети.

Если ты хочешь лучше разбираться в сетях, можно погуглить и почитать про протоколы IP, TCP, и сокеты Беркли.

> То есть, если я задам, например, $uri = "google.com:8080", то сервер будет до бесконечности слушать этот адрес, пока google сам не создаст соединение по адресу сервера



Будет ошибка, из-за того что в системе нет сетевого интерфейса с таким адресом.
25 1199850
ОП хелп. Хочу сделать, что когда любой человек заходит на мой сайт, ему выдают уникальные номер в куки.
Потом, если он создает тест или проходит. Я при нажатие создать тест, или закончить прохождение теста. Создаю анонимного пользователя в дб, у которого в параметрах только уникальый номер кук.
И если он потом регистрируется, то я смотрю, есть ли пользовательи анонимный с таким номером в куки. Если есть, то я просто делаю апдейт и добавляю его логин, почту в этого пользователя и он становится уже не анонимным.

Но вот пара вопросов.
1) Если человек создает тест, после введет свой имеил (не регистрируясь, а просто что бы получать статистику, как я понимаю этот имеил туда же в аноним пользователя я записываю), а потом кто то другой на этом же компе создаст тест, и напишет свой имеил. То он будет получать сообщения за все тесты, которые были сделаны на этом компе. А если он зарегистрируется. То получит все тесты, которые с этим ИД были созданы. И опять же перезапишет имеил, и тот человек который создал тест больше не получит сообщений.
2)А если человек создает пару тестов на разных компах, и везде введет 1 имеил для получения ответов. А потом решит зарегистрироваться с этой почтой. Мне ему все тесты, всех анонимных пользователей с подобным имейлом давать? Или только те кто где уникальный ид, такой же.
3)При создание теста есть галочка скрытые ответы или нет, человек ставит скрытые и после создания теста, я делаю ссылку где можно результаты смотреть. Смотреть их можно по ссылке, то есть любой кто её знает сможет туда заходить и смотреть. Если я не буду выводить просто сылку на эти ответы и она будет заковыристой, это и есть ограничение доступа? Или я должен как то для этого куки еще использовать? Но тогда только на его компе он сможет октрыть эту ссылку.
26 1199893
ОП, еще такой вопрос. Кажись все-таки хуево спроектирова БД. Не могу понять, когда учитель логинится, то видит список групп, выбирая группу видит список студентов которые состоят в группе и свои замечания к ним. Также группе можно добавить занятие какое-то, но проблема в том, что занятие приписанно к группе ведь, получается это занятие будет видно и другим учителям и теоритически учителя смогут видеть оценки выставленные другими учителями,а также редактировать их. Это нормально? Или учителя должны видеть только свои оценки и мочь редактировать только свои?

анон - >>199420
27 1199895
>>199893
хотя можно бы было приписывать занятие к учителю и чтобы только он мог выставлять оценку с этого занятия.
28 1199898
посоны, есть кто по регуляркам? хотел отметать строки с наличием спецсимволов, но какого-то хуя регулярка по ссылке пропускает строку "За©" и не пропускает строку "Против". ЧЯДНТ?
https://ideone.com/9uBZn0
29 1199901
>>199893
да и вообще

>Ну по идее преподаватель может вести разные предметы же. И у разных групп.


получается у одной группы может быть много учителей?

в общем я запутался уже
30 1199903
>>199901
в однйо группе много студентов много преподов и много предметов

препод может вести разные предметы в разных группах
image.png37 Кб, 730x435
31 1199912
>>199903
кароч такая хуйня вышла
3rQuB11CvQ4.jpg103 Кб, 1280x701
32 1199926
Аноны, препод дал два задания для "чтоб ты понял". Но я не понял даже как делать. Нужна помощь, пожалуйста.

Есть пример:
1/2 + 1/4+ 1/6 + ... + 1/100
Нужна сумма этого.

и второе:
y = 1 + x + x^2 + x^3 + ... + x^50, где x - натуральное число.

И вообще. Как получить сумму всех чисел из цикла?
33 1199930
>>199898
Ты забыл добавить в регулярке определение кириллицы /\A[а-яА-Я]*\Z/ui
34 1199950
>>199926

>Как получить сумму всех чисел из цикла?


Создать переменную до цикла. Увеличивать ее в цикле.
35 1200118
>>199926
Совсем нихуя не понял, весь день ломаю голову. Я даже >>199950 не понял как сделать.
36 1200139
>>200118
Либо ты прикалываешься, либо ты так тупишь потому что еще ничего не кодил, либо ты просто не особо доходчив.

объявляешь переменную до цикла равную нулю.

;в цикле увеличиваешь счетчтикчь в порядке последовательности 2, 4, 6 и т.д. до 100

используешь счетчик в качестве знаменателя

каждая итерация считает только свою дробь и плюсует оператором += к той переменной которую ты объявил до цикла.

После цикла в этой переменной результат.

Такой же алгоритм во втором уравнении, только счетчик это степень.
Screenshot719.png35 Кб, 794x554
37 1200150
>>200139
Не прикалываюсь, я действительно туп и до меня не доходит. Как их складывать- то?
38 1200186
>>200150
Че сделал уже?
39 1200190
>>200186
Неа. Не могу сообразить, как складывать значения снизу.
40 1200204
>>200190
А зачем ты каждый раз выводишь значение переменной и увеличиваешь ее на 2?
41 1200208
>>200204
Я убрал $i+=2 после публикации поста, ответы изменились с 2.54.756 на 0.50.750, но все еще не складываются.
42 1200210
>>200150
Не ну я тебе алгоритм описал а если я тебе весь код напишу то ты никогда и не допрешь так. Знаю я таких.
43 1200215
>>200210
Я и так не допру никогда. Что я упускаю? Препод сказал, что это вообще в три строчки делается.
44 1200225
>>200215
Ты ее уже почти решил.
Screenshot720.png9 Кб, 389x394
45 1200229
>>200225
Вот такой ответ?
46 1200234
>>200150
ахахаах бляяя
15147439191370.jpg12 Кб, 439x455
47 1200236
>>200234
Почему я такой тупой? Какое решение вообще? Где я обосрался?
48 1200240
>>200229
Ну поменяй значение x<100 на 10 да посчитай на калькуляторе сам и программой потом, да сравни.
Screenshot721.png13 Кб, 549x457
49 1200252
>>200240
Все получается, благодарю.
Почему тут 1 все время?
50 1200266
>>200252
Потому что var_dump($i) = NULL.
http://php.net/manual/ru/function.pow.php
Там два параметра должно быть. Основание и степень.
51 1200271
>>200266
Почему >>200229 этот пример решился только тогда, когда я вынес $i из цикла?
52 1200279
>>200266
Так, получается?
53 1200290
>>200279
Чот он на два умножает конечный результат. Аноны, почему?
54 1200312
Аноны, а вот такой вопрос: если я в будущем хочу быть погромистом-фрилансером или типа того, мне нужна корочка о высшем? Или и с моим среднеспециальным будет норм?
55 1200314
>>200312
шесть лет отработал не имея вообще никакого образования кроме школы.
56 1200316
>>200314
Кайф, спасибо.
57 1200329
>>199926
Ну заебись, бесконечные сходящиеся ряды
58 1200347
парни завязывайте с этой математикой, мы все-таки в пхп треде
59 1200350
>>200347
я пхп ПРОГРАММИСТ.
60 1200351
netbeans2018-06-0107-21-29.png32 Кб, 619x524
61 1200385
Поясните для дотеров - как проще решить эту задачу с генератором стихов?
62 1200441
>>200385
я ее дедал года пол назад, как и все остальные задачи из базового курса ОПа.
потом я перешел на фреймворки и уже не сделаю ни одну из тех задач
63 1200443
>>200441
Ты так пишешь, что кажется будто фреймворки хуже героиновой зависимости.
64 1200469
Доставьте, плиз, пикчу с перепиской якобы с тней, которая вопрошает о веб-разработке, а потом пишет, мол, "Серьезно, PHP? Сразу нахуй".
65 1200523
>>199390 (OP)

код
<?php
$link = mysqli_connect("127.0.0.1:8080", "root@localhost", "", "123")
or die("Ошибка " . mysqli_error($link));
var_dump ($link);

// закрываем подключение
mysqli_close($link);
?>
ошибка

Warning: mysqli_connect(): MySQL server has gone away in C:\xampp\htdocs\test\ConnectDB.php on line 2

Warning: mysqli_connect(): Error while reading greeting packet. PID=6232 in C:\xampp\htdocs\test\ConnectDB.php on line 2

Warning: mysqli_connect(): (HY000/2006): MySQL server has gone away in C:\xampp\htdocs\test\ConnectDB.php on line 2

Warning: mysqli_error() expects parameter 1 to be mysqli, boolean given in C:\xampp\htdocs\test\ConnectDB.php on line 3
Ошибка
ЧЯДНТ?
66 1200527
>>200523
пс а вардамп забейте его нет там
67 1200532
>>200523

>Warning: mysqli_connect(): MySQL server has gone away


>127.0.0.1:8080


8080 - предположу, что там у тебя висит вебсервер. MySQL сервер по умолчанию на 3306. Где он и будет если ты или ксамп ничего там не наменяли.
68 1200536
>>200532
менял порт для апача с 80 на 8080 ну размер бд увеличил
69 1200549
>>200536
Попробуй так:
mysqli_connect("127.0.0.1:3306", "root", "123")
1470933607193163462[1].jpg35 Кб, 400x320
70 1200566
>>200549
чмок тя в животик
71 1200622
>>200566
ты шо путiн?
72 1200745
>>200549
У меня вообще без порта работает, ой вей.
73 1200749
>>200745
3306 дефолтный порт. Я его явно указал,что бы анончик видел где косяк в его коде.
Вообще все что про порты выше легко гуглится. Учитесь гуглить хлопцы, экономьте свое время
74 1200752
>>200749
Поговорить не о чем будет.
75 1200755
>>200749
Вот тебе вопрос, который не загуглить: >>200290
сам я так и не понял.
76 1200763
>>200755
>>200290
Ты сдумпил, а потом прибавил последний раз. Тут и гуглить не надо.
77 1200815
Аноны, а какой вообще фреймворк надо учить? Я посмотрел вакансии много где написано просто: "знание одного из фреймворков" и там в скобках симфони, Yii. Но чаще всего встречается Laravel. Он какой-то модный-шутливый?
78 1200816
>>200815
любой. учи все что угодно, все равно нужно будет переучиваться
79 1200818
>>200816

> все равно нужно будет переучиваться


Почему?
80 1200821
>>200815
Я тебе самый годный русский курс по ларавелю принес, обмазывайся http://nnm-club.me/forum/viewtopic.php?t=1194405
81 1200839
>>200821
Спасибо анон
82 1200878
Эээх, очередной день без изучения пыха, как же плохо быть ленивым, безвольным хуйлом..........
83 1200892
>>200878
Оставляй контакты, будем изучать вместе! Могу тебя пинать, время от времени.
84 1200912
>>200892
А как далеко ты продвинулся в изучении?
мимо-другой-анон
85 1200919
>>200912
Решаю задачи из раздела "Повторим?", одной лапкой в ООП так сказать.
86 1200939
>>200919
Оставляй почту.
87 1201019
>>199390 (OP)
Хочу в очередной раз сказать спасибу опу и всем примкнувшим. Вы заняты богоугодным делом.
Пользуясь случаем, хочу спросить - какой фреймворк самый распространенный? Я понимаю что изучив один, можно будет понять все остальные, просто с какого начинать?
88 1201055
>>201019
Если не поджимает выход на работу и не нужно готовится под конкретную галеру, я бы начал с Симфони. Он самый аккуратный в плане архитектуры и кода.

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

Юииии популян на просторах СНГ и у азиатских демпингующих галер (как и ларавель).

Зенд не особо популярен сам по себе, НО его компоненты используются в Магенто. А это очень популярная система для интернет магазинов (около 30%) и фриланса и работы на всем этом полно.
89 1201321
>>199390 (OP)
Опчик ты мой золотой, ответь на такой ответ

Мне сейчас чел (фрилансер на пхп со стажем) жостко пояснил что я не прав используя пдо вместо мускли, потому что: "да нет там никакой разницы, че ты выдумываешь фигню, PDO - это надстройка на MySLQi из врапперов"

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

вут зе фак?
90 1201377
>>200763

> потом прибавил последний раз


И как не прибавлять последний раз?
С 49 степенями в моем говнокоде получается результат на 2 меньше, чем в 50 степени на калькуляторе.
Screenshot8.png7 Кб, 1044x150
91 1201386
Почему у меня браузер выводить такой крод, а не результат?
92 1201395
>>201386
В интернетах советуют использовать <?php, а не <?.
И еще:

> Убедитесь, что вы просматриваете файл через веб-сервер, используя URL-адрес, например http://localhost/file.php, а не через доступ к локальному файлу file://localhost/www/file.php

94 1201471
>>199390 (OP)

И еще сколько ты бы дал баллов из 10 за сайт с такими параметрами (в основном самое фатальное и смешное):

Деплой
Полные сорсы вендоров вместе с архивами на продакшене
Код прямо в продакшен
Нет

Код
DRYOLO - DO REPEAT, YOLO - копируем код во все места где он используется, попутно внося корректировки только в некоторые его инстансы;
Повсеместные магические константы;
Комментарии на cp1251 (ну и код);
Полезность комментариев уровня echo $number; // displaying number
Глобалки с объектами вперемешку со статикой
Тестов нет, хотя бы ручных

Пакетный парсер данных
Вызываем метод с массивом данных; в методе вызываем метод обработки одного элемента; и редиректим с оставшимися элементами на себя-же; (эдакая http рекурсия)

Роутинг
Берем и проходим по юри с конца, первый встретившийся элемент, имеющий соответствующий ему файл php - контроллер

Контроллеры-шаблоны
Полностью смешиваем общение с моделью, валидацию и формирование страницы

Шаблонизатор
str_replace по ключам в массиве весь файл в цикле;
Подшаблоны грузим с диска при каждом обращении (в цикле)

Модели, бд
Рид локи на все таблицы даже при чтении;
Не нормализовано;
myisam для числовых таблиц (ну тут всё-еще спорно);
Кодировки в перемешку (cp1251);
Юзер с глобальными правами;
Буквально дублирующие индексы;
Мусорные, неиспользуемые таблицы и поля;
Пересоздаем таблицы из модели при отсутствии, но схема не соответствует нужной (т.е. Была позже отредактирована вручную, без модификации оригинальной схемы)

Локализация
Определяем язык через explode ( “.”, $uri ) [ 1 ]
Делаем локализацию нигде не внося для этого необходимой логики
Разбиваем данные сущностей в таблицах на два языка, но не всех
Для сущностей доступных через имя в uri, делаем транслитерацию кирилицы наживую, получаем мусорную выборку в случае несовпадение транслитерации туда-обратно

Практики
Не юзаются неймспейсы
Не юзается автолоад
Не юзается DI в хоть какой форме
Вроде бы есть интерфейсы к чему-то, но по итогу они ничего не дают

Прочее
Повсеместно голые SQL в коде
Отсутствие экранизации
Прямой доступ на любые скрипты
Отсутствие проверки прав или вообще наличия пользователя
error_reporting( 0 );

Не осилили отправку почты, молчу уже про соц. авторизацию.

Ну и P.S.: сейчас многие вещи исправлены, кроме самых для меня сложных (настроить локальную копию сервера через вагрант и сделать автотесты, ограничиваюсь ручными). Но как думаешь почему когда тот кто всё это делал начинает мне изливать желчь, что якобы сайт был почти готов и я хуй пойми чем занимаюсь, я чувствую себя не комфортно? Обычно на меня провокации и подобная херомантия не работает. В общем суть в том что вот я вроде всё делаю, всё получается, всё работает стабильнее, быстрее и качественнее, а по итогу все-равно какой-то осадочек. Спасибо за вниманиеб
94 1201471
>>199390 (OP)

И еще сколько ты бы дал баллов из 10 за сайт с такими параметрами (в основном самое фатальное и смешное):

Деплой
Полные сорсы вендоров вместе с архивами на продакшене
Код прямо в продакшен
Нет

Код
DRYOLO - DO REPEAT, YOLO - копируем код во все места где он используется, попутно внося корректировки только в некоторые его инстансы;
Повсеместные магические константы;
Комментарии на cp1251 (ну и код);
Полезность комментариев уровня echo $number; // displaying number
Глобалки с объектами вперемешку со статикой
Тестов нет, хотя бы ручных

Пакетный парсер данных
Вызываем метод с массивом данных; в методе вызываем метод обработки одного элемента; и редиректим с оставшимися элементами на себя-же; (эдакая http рекурсия)

Роутинг
Берем и проходим по юри с конца, первый встретившийся элемент, имеющий соответствующий ему файл php - контроллер

Контроллеры-шаблоны
Полностью смешиваем общение с моделью, валидацию и формирование страницы

Шаблонизатор
str_replace по ключам в массиве весь файл в цикле;
Подшаблоны грузим с диска при каждом обращении (в цикле)

Модели, бд
Рид локи на все таблицы даже при чтении;
Не нормализовано;
myisam для числовых таблиц (ну тут всё-еще спорно);
Кодировки в перемешку (cp1251);
Юзер с глобальными правами;
Буквально дублирующие индексы;
Мусорные, неиспользуемые таблицы и поля;
Пересоздаем таблицы из модели при отсутствии, но схема не соответствует нужной (т.е. Была позже отредактирована вручную, без модификации оригинальной схемы)

Локализация
Определяем язык через explode ( “.”, $uri ) [ 1 ]
Делаем локализацию нигде не внося для этого необходимой логики
Разбиваем данные сущностей в таблицах на два языка, но не всех
Для сущностей доступных через имя в uri, делаем транслитерацию кирилицы наживую, получаем мусорную выборку в случае несовпадение транслитерации туда-обратно

Практики
Не юзаются неймспейсы
Не юзается автолоад
Не юзается DI в хоть какой форме
Вроде бы есть интерфейсы к чему-то, но по итогу они ничего не дают

Прочее
Повсеместно голые SQL в коде
Отсутствие экранизации
Прямой доступ на любые скрипты
Отсутствие проверки прав или вообще наличия пользователя
error_reporting( 0 );

Не осилили отправку почты, молчу уже про соц. авторизацию.

Ну и P.S.: сейчас многие вещи исправлены, кроме самых для меня сложных (настроить локальную копию сервера через вагрант и сделать автотесты, ограничиваюсь ручными). Но как думаешь почему когда тот кто всё это делал начинает мне изливать желчь, что якобы сайт был почти готов и я хуй пойми чем занимаюсь, я чувствую себя не комфортно? Обычно на меня провокации и подобная херомантия не работает. В общем суть в том что вот я вроде всё делаю, всё получается, всё работает стабильнее, быстрее и качественнее, а по итогу все-равно какой-то осадочек. Спасибо за вниманиеб
95 1201472
>>201471
*Нет тестов, слово съел
96 1201473
>>201472
Да блять т.е. *Нет VCS
под валерьянкой что-то вообще по пизде пошел
Вывод из MySQL информации друг за другом 97 1201598
Есть база данных и PHP код, который выводит информацию из бд. Нужно чтобы вся эта информация заключалась в каждый отдельный блок. Такие блоки должны располагаться друг за другом.
Должно быть примерно как на картинке. 1
На картинке 2 расположение в данный момент.
<?php

$query = "SELECT FROM tovs ";
$select_tovs = mysqli_query($link, $query);
$a = $tovs ['src'];
echo $a;
$h = 1;
while ($tovs = mysqli_fetch_array($select_tovs)){

if ($result = mysqli_query($link, 'SELECT
FROM tovs where id ='.$h.' '))
?>
<a href="akk.php?note=<?php echo $tovs['id']; ?>">
<?php
{

/1) Выборка результатов запроса /
$data = mysqli_fetch_assoc($result);

/2) Освобождаем используемую память /
mysqli_free_result($result);

}

/3) Получаем значение переменной /
echo $tovs ['name'], "<br>";
$a=$data['src'];

echo "<img src=$a alt='картынко'/> " , "<br>" , "<hr>";

$h = $h +1;
} $note_id = $_GET['tovs'];

?>
Вывод из MySQL информации друг за другом 97 1201598
Есть база данных и PHP код, который выводит информацию из бд. Нужно чтобы вся эта информация заключалась в каждый отдельный блок. Такие блоки должны располагаться друг за другом.
Должно быть примерно как на картинке. 1
На картинке 2 расположение в данный момент.
<?php

$query = "SELECT FROM tovs ";
$select_tovs = mysqli_query($link, $query);
$a = $tovs ['src'];
echo $a;
$h = 1;
while ($tovs = mysqli_fetch_array($select_tovs)){

if ($result = mysqli_query($link, 'SELECT
FROM tovs where id ='.$h.' '))
?>
<a href="akk.php?note=<?php echo $tovs['id']; ?>">
<?php
{

/1) Выборка результатов запроса /
$data = mysqli_fetch_assoc($result);

/2) Освобождаем используемую память /
mysqli_free_result($result);

}

/3) Получаем значение переменной /
echo $tovs ['name'], "<br>";
$a=$data['src'];

echo "<img src=$a alt='картынко'/> " , "<br>" , "<hr>";

$h = $h +1;
} $note_id = $_GET['tovs'];

?>
98 1201617
>>200939
php2ch собака ya.ru
99 1201649
>>201321
Ну более менее продвинутые cms юзают пдо
100 1201653
>>201395
<? это еще и символ xml может и еще гдето используется. Если будешь делать файл смесь с php и xml возникнет путаница.

Я использую <?php для больших блоков и <?= вместо echo
stretched-1366-768-320724.png1 Мб, 1366x768
101 1201676
Скажите мне в чем суть конструкции типа while ( true )? Я имею ввиду, в чем мать её суть пробелов после и до скобок? Есть тут Wordpress-разрабы? В чем суть этой хуйни? Неужели код становится понятней? Скорее наоборот.
102 1201697
>>201377
2 в первой степени это два. А на калькуляторе ты начинаешь с два во второй ( четыре ), поэтому на 2 меньше. По поводу кода: ты выводишь вар_думп до того как осуществляешь сложение, поэтому тебе кажется что он должен быть последним, но он еще раз прибавляет после вардумпа, потом выходит из цикла и прибавляет один. А тебе кажется что должно быть меньше.
103 1201705
>>201697
Благодарю за пояснение. Я не смышлен и в математику не могу.
104 1201715
>>201676
Ну например если цикл должен выполняться по совокупности многих условий которые сложно записать в одну строку, то могли сделать так, а когда нужно остановить то просто brake
105 1201725
>>201705
тут никто не может.
106 1201929
Поясните пожалуйста за автоматизированное тестирование.

Я правильно понял, что "написать автотесты" - это написать скрипт на пхп (как вариант), подключить вебдрайвер, запустить селениум, тот запускает отдельное окно браузера, в котором выполняются тесты, имитируя действия пользователя, и если всё ок, в логи пишется "тест пройден"? Или это делается не так?
107 1202015
>>201321
ПДО придерживается объекто-ориентированного программирования.
мускул коннект хорошо, если у тебя простенький скрипт.
Подключиться к базе, сделать изменения, отключиться.
Если ты пилишь огромное приложение, то потом будут сложности. ТАк как код с подключением и изменениям в базах можно изолировать и переиспользовать.
108 1202029
Только вкатился, и сразу тупой вопрос.

Занимаюсь по книжке Скляра.
Есть форма, что на первом пике, есть пхп-код, что на втором пике. Почему-то при нажатии на submit происходит переход на пустую страницу.

Что я делаю не так? Код от того, что в книжке, не отличается.
123.PNG33 Кб, 1328x594
109 1202032
Имеется такая EXEL таблица(pic) вправо 22 таких(колонки с дисциплины и аудитории) и 7 вниз полностью, могу с помощью сохранить как залить ее таблицей HTML, как брать значения из нее и заливать на сервер что бы в в последующем использовать эти значения.
Я конечно понимаю что там over миллиард переменных но по другому в голову не приходит.
110 1202039
>>202032
гугли comma separated values
Заебешься такую формочку отрабатывтаь.
Лучше все в красивую табличку и там парсить.
111 1202086
>>202015
mysqli тоже ооп
112 1202089
>>202032
можно перегнать в csv и распарсить как текстовый файл с простым форматом, а можно использовать библиотеку phpExcell
113 1202095
>>201055
спасибо, няша, добра тебе
114 1202261
Помогите ньюфагу. Почему у меня нет формы ввода логина и пароля при запуске phpmyadmin? Он сразу переводит к базам данных . Как вызвать эту форму и узнать, какой у меня логин и пароль?
Безымянный.png84 Кб, 662x702
115 1202263
>>202261
Я об этом. Такого у меня нет. Как его вывести?
116 1202290
>>202263
Я полагаю, что либо у тебя этого изначально не было, либо тебя по печенью пускает.
Я не экстрасекс, но с утра было одно из двух.
117 1202294
>>202261
на локалке или на хостинге?
в браузере пароль не сохранял?
Собаки.jpg18 Кб, 592x134
118 1202298
>>199390 (OP)
Няш, что значат эти @ перед комментариями? Зачем их вставляют?
119 1202316

>сначала идет +7 или 8, за ними ровно 10 цифр, между которыми может быть любое число скобок, минусов, пробелов



>ровно 10 цифр, между которыми может быть любое число скобок, минусов, пробелов



Как эту дичь написать? Я блять охуел уже с этими регулярками
120 1202317
>>202316

^((\+[\s]7)|([\s]8))([\s-()][0-9][\s-()]){10}

Такую хуйню сделал, но чет не работает
121 1202321
>>202317
я уже недавно отвечал, откуда ж вы только беретесь
122 1202329
>>202317
Ща бы регулярки строчить. В итоге потом всё равно нагуглишь регулярки в 100500 раз круче и будешь использовать их.
123 1202330
>>202329
за 15 лет не нагуглил ниодной регулярки
124 1202331
>>202330
Ну хз, гугли лучше чтоли.
125 1202346
>>202331
но зачем
126 1202349
Зачем вы ебетесь с регулярками? Перейдите к другим упражнениям/заданиям. Они не будут вам нужны в ближайшее время.
127 1202350
>>202349
Никогда не будут нужны
128 1202352
>>202349
Никогда не будут нужны
129 1202366
>>202350
Не ври
130 1202371
>>202321

А ты мог просто ссылку запостить? Даже меньше печатать же, в этом треде отвечал хоть?
131 1202373
>>202371
может в этом, может в предыдущем, нет у меня ссылки, там длинная регулярка.
132 1202378
>>201929

Ты описал только приемочные тесты, то есть эмуляцию реальных действий пользователя на сайте. Есть еще функциональные тесты, когда мы отправляем http запрос и ожидаем определенный ответ от сервера, без тестирования конкретных классов. И юнит тесты, с помощью которых мы тестируем конкретные классы. При этом такая классификация достаточно условна и все эти вещи могут частично пересекаться. Почитай пару статей на эту тему, установи phpunit или codeception, попробуй написать пару простых тестов.
133 1202391
>>202349
Регулярки нужны, как и все ,что связанно со строками.
Вот что реально не нужно, так это все что связано с математикой
134 1202495
как с помощью PHPEXCEL залить всю таблицу построчно в бд.
Все данные должны пойти в один столбец в базе.
135 1202507
>>202294

>локалке


Там. Его изначально не было, меня сразу к панели управления кидало.
>>202290

>что либо у тебя этого изначально не было


This.
136 1202513
>>202378
вот в этих самых автотестах и написаны эти @ в комментариях. Зачем? Для чего они?
137 1202529
>>202513
Это аннотации. Используются для указания каких ли бо инструкций (генерация кода, документации, параметры хранения в БД и т.п. тысячи их) для IDE , фреймворков и т.д.
Например @route говорит Symfony как мапить URL на контроллер->метод: https://symfony.com/doc/current/routing.html
138 1202539
>>202513
>>202298

Это аннотации. С точки зрения PHP это просто комментарии, но некоторые библиотеки могут их обрабатывать особо.

Это может быть например phpdoc - аннотации для генерации документации к проекте, их синтаксис описан тут: https://docs.phpdoc.org/references/phpdoc/index.html

Это могут быть аннотации Симфони. В Симфони каждая аннотация представляет собой имя класса (с поддержкой неймспейсов), и этот класс описывает, какие в аннотации могут быть свойства, про них написано тут: https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/annotations-reference.html

Это документация по Доктрине, но так как система аннотация расширяемая, то ими пользуются и другие библиотеки Симфони, например роутер: https://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/index.html

В твоем случае, все зависит от фреймворка или библиотеки, который читает эти аннотации. Если там используются аннотации из Симфони, то вверху файла скорее всего будет use с полным именем класса из аннотации, можно перейти к нему и посмотреть что это. Также можно почитать документацию по используемому фреймворку.
139 1202572
В общем такая штука, как бы мне в шаблонах тайпхинтить?
Сейчас юзается шаблонизатор Plates, в целом неплохо.
Но в шаблонах там контекст $this и все переменные шаблона в итоге без тайпхинтов.
Объекты из базы грузятся у меня сейчас тупо как ассоциативные массивы так что хинтить там и нечего как-бы, но я хочу уйти от этого в сторону полноценных объектов для сущностей, но тогда код в шаблонизаторе будет еще хуже выглядеть.
Т.е. если у меня НАПРИМЕР $post['content'] не хинтится ну и ладно, а если будет $post->GetContent() то будет сверху еще и подсветка IDE что типо че за херню я придумал вызывать методы необъявленной переменной...
Если бы можно было как-то обозначить что вот эта переменная отсюда и далее является объектом класса такого-то.
Например, сделать статический класс валидатор сущностей, в шаблоне вызываем его так:
$post = Post::Validate( $post );
и в итоге получаем захинченую сущность, заодно там внутри проверяем правильно ли шаблону передали сущности.
Но это по идее противоречит в какой то степени парадигме MCV, получается вьюшка дублирует кусочек фукнционала модели...
140 1202583
>>202572

Во-первых, из шаблона нельзя вызывать валидатор. Так как задача вью - отображать данные, а не валидировать их.

Во-вторых, для IDE используй аннотацию @var SomeClass $someVar или как-то так в комментарии с 2 звездочками.

Менять архитектуру кода ради IDE неправильно.
141 1202584
Нужно написать контроллер, который сохраняет запрос в базу. А другим запросом его можно получить. Или стереть.
Как это сделать с нуля?
142 1202587
>>202583
Ну я понимаю что неправильно, поэтому и спрашиваю.
Такая аннотация - как раз то что нужно, большое спасибо!
Стоить внимательно изучить стандартные виды аннотаций, не думал что там есть что-то кроме как хинтов для классов.
143 1202620
УФ УФ, бульдозер программирования в пути! За месяц ничегонеделанья я добрался до регулярных выражений!
144 1202659
Кто-нибудь сталкивался с настройкой ImageMagic(imagic) на новых сборках опен-сервера под винду?

Надо что бы вместе с пхп 7.1 всё работало нормально, но из коробки почему-то нету ничего в новых сборках.
145 1202814
есть инфа,что будет в 8 версии?
146 1202881
Великий анон, мне нужно прочекать мой файл на наличие картинок, которые лежат в папке images, в то время как сам файл лежит выше папки images по дереву.

Сделал регулярку (надеюсь, не надо на айдеон кидать)

>"/[images\\\\](([a-z0-9]+.(jpg|png|gif|jpeg)))/"



Названия прогружаются, но сами картинки - нет.
Через file_exist возвращает false.
147 1202888
>>202881
путь в file_exists проверь
148 1202934
>>202881
Как тебе такое?
/images\/.+\.jpg|png|gif|jpeg/

мимоКМСпорегуляркам
149 1202939
>>202888
Спаси юную макаку.. Я немного подправил код, теперь лучше выводит заголовки, но все равно не выводит картинки.
https://ideone.com/w2lE9y
150 1202941
>>202934
Теперь даже заголовки не выводит.
151 1202952
>>202941
Названия файлов в разном регистре? Если да добавь в конец регулярки флаг i
152 1202955
>>202941

>//$pagename = 'index.php';


>//$template=file_get_contents($pagename);



у тебя проиходит поиск, в файле 'index.php'

>preg_match_all($imgreg, $template, $imgmas);

153 1202956
>>202955
бля, я ошибся
154 1202958
>>202952
Да нет, спасибо. Я уже решил проблему.

Короче, я решил проблему тупым гуглением другой регулярки. Как сказал какой-то анон выше:

> Как бы ты не писал регулярку, всё равно найдёшь в инете круче и будешь её использовать.



Спасибо, что пытались помочь, вот регулярка, кому нужно/интересно. Совсем забыл, что можно по тегу <img> искать

>'/<img[^>]?src=\"(.)\"/iU'

155 1202965
Анончик, нормально ли, что я в учебных проектах в работе с базами данных не использую стандартные типы даты и времени мускула, а храню время в БД в юниксовом формате (секунды с 1 января 1970), а преобразование его в человеческий формат и обратно выполняю средствами пыха? Является ли это ересью в реальных проектах?
156 1202969
>>202965
зы. Я понимаю, что моя база не сможет работать с датами до 1970, но если я точно знаю, что в этом не будет необходимости, например, там не будет дат рождения.
157 1202984
>>202965

>преобразование его в человеческий формат и обратно выполняю средствами пыха


Работодателям не показывай, во всяком случае.
158 1202999
>>202965

Зачем? Какая в этом выгода? Ты ведь не можешь например использовать стандартные функции БД для работы с датой. Да и вообще, зачем это нужно, хранить данные не в придуманном для этого формате?
159 1203049
Сап гайсы, че делать с этим?

>session_start(): Cannot send session cache limiter - headers already sent


Структура кода
<? ob_start();
session_start();
<говнокод/>
ob_end_flush();
?>

Хелп анончики
160 1203062
Такой вопрос: как лучше запилить флеш месседжи самому. Как я сделал я: пользователь делает какое-то действие, например удаляет файл, дальше редирект и в урл-е параметр ?message=success. Небольшая проблема в том, что если пользователь перезагрузит страницу еще раз с этими параметрами в урле, он опять увидит сообщение, что он успешно удалил файл. Это является проблемой? Может лучше через сессии сделать?
161 1203101
>>203049

>мааам, я понял как идти, но впереди бордюр, что мне делать?

162 1203322
Пока писал вопрос, додумался до ответа. Спасибо пацаны.
163 1203323
>>203322
Пожалуйста. Всегда рад помочь.
164 1203381
>>199390 (OP)
Быстровопрос 1:
Связка php+,ysql все еще актуальна для небольших околодомашних нужд?
165 1203394
Пачаны!

Развернул на апаче локальный сервер, создал хост, тудым-сюдым, но короче не суть: упражняюсь через ноутпад++, пишу структуру в .php, и обращаюсь к файлу через строку браузера, и смотрю чо же там выведет, но столкнулся с траблом, ни в какую не хочет переносить текст на новую строку через \n. Через br\ переносить и подавна не будет, это ж ХТМЛ.
И так, не подскажете с чем может быть связано? Версия ПХП? Апача? Почему не детектит перенос?
Пример кода, который собственно и не работает, хотя вроде и должен:
<?php

error_reporting(-1);

$a = 1;
$b = 6;
$random = mt_rand($a, $b);
echo "Бросаем кубик... /n";
echo "Выпало: $random /n";

?>
166 1203435
>>203394
Нужно указать браузеру, что мы посылаем простой текст. Для этого нужно отправить http заголовок:
header( content-type: text/plain);
167 1203441
>>203394
а что не так с <br> ?
Screenshot759.png27 Кб, 490x508
168 1203540
Анон, пытаюсь освоить стеки, но у меня не получается. Но у меня не выводит никаких действий. Нужно обозначить стек как массив или что?
169 1203564
>>203540
Что такое ReadingList?
Вот стандартные функции для работы с массивами в пхп:

array_push() - добавляет в конец массива
array_pop() - извлекает последний элемент массива
array_shift() - добавляет в начало массива
array_unshift() - извлекает первый элемент массива

В зависимости от применения твой массив может быть и стеком и очередью.
170 1203570
>>203540

Это баг ideone, он не показывает ошибку сразу, перезагрузи страницу с кодом, чтобы увидеть текст ошибки.
171 1203754
Если вывожу на страничке строку то все нормально, если пытаюсь вывести отдельный символ, например $text[0] то выдает эту ебань - �. Строка на кириллице, в начале ставлю кодировку mb_internal_encoding("UTF-8");
172 1203785
>>203754
Строка - последовательность байт. utf-8 использует для хранения символа 1 - 4 байта (в зависимости от положения символа в таблице). В PHP нет встроенной в движок поддержки utf-8. Соответственно $str[0] вернет только 1-й байт а не первый символ. Используй mb_ функции, в данном случае mb_substr().
173 1203851
Ебался часа два с MySQL и в итоге нихуя не получилось его установить. Какие-то ошибки ебаные, которые хуй загуглишь. Установил в итоге без каких-либо ошибок PostgreSQL. Это же тоже норм? Необязательно же использовать MySQL?
174 1203862
А не. Получилось установить MySQL, правда не последнюю версию, а 5.7
175 1203891
>>203851

Давай разберемся. Что за ошибка?

Раньше иногда была такая ошибка:

> Если в процессе установки вылетает ошибка «произошло исключение DateFormat что-то там такое», то пошли лучи проклятия криворуким разработчикам из Oracle и попробуй в настройках Windows временно поменять формат даты на English (US). Или скачай zip-версию и установи руками как описано тут: http://malwselennaiaru.ru/182-ustanovka-mysql-na-windows.html (этот совет был написан в 2014, может он устарел).

176 1203896
>>203851
Зачем устанавливать mysql? можно же установить open server.
177 1203917
>>203891

>System.NullReferenceException: Object reference not set to an instance of an object.


Вот это мне писало вместе с какими-то логами.
178 1203956
>>203917

>System.NullReferenceException: Object reference



Я мельком погуглил, решения не нашел, тогда (если захочешь) остается вариант ставить из zip файла вручную. Нашел только упоминание похожего бага https://bugs.mysql.com/bug.php?id=78138
179 1203991
Привет ребята.

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

Точнее, я то ее довольно быстро решил, но теперь не могу понять, как реализовать ее при помощи выбора слов из массива в массиве (блядь).

Тут решенная, но хуевым способом задача: https://pastebin.com/t1hB70gc

А тут моя попытка составить правильный массив для более лаконичного решения задачи: https://pastebin.com/51ur26EY

В учебнике написано "Остается только пройти по массиву циклом и сгенерировать стих..", но я, честно говоря, вообще не понимаю как правильно его сделать.

В общем, буду благодарен, если объясните где я туплю, и правильно ли я вообще сделал массив.
180 1203993
>>203991

>А тут моя попытка составить правильный массив для более лаконичного решения задачи: https://pastebin.com/51ur26EY



Почему у тебя тут echo нет?
181 1203998
Все тот же дурачок со стеками в треде.
Работают Push и Pop, но теперь не могу юзать isEmpty.
https://ideone.com/ijt0Jv
Почему при закоменчивании элементов стека она выдает единицу? Первый скрин.
А при заполненном стеке ничего не выдает. Второй скрин.
182 1203999
>>203993
Потому что мне в данный момент нечего выводить на экран - я не понимаю как правильно построить цикл, чтобы он из этих массивов делал рандомный стих.
183 1204011
>>203999
Цикл ненужон

Как получить одну строку с тремя словами?
У тебя есть 5 массивов word со словами, нужно из них рандомно получить одно слово. Потом втрое и третье, между вызовами рандома ставим .' '. для объединения строк в одну и установки межу ними пробела.
Все понятно?
мимодругойанон
184 1204022
>>204011
О, да, понял. Так можно мою первую пасту сделать намного короче, спасибо.

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

Но ладно, пойду дальше.
185 1204037
В пизду. Программирование не мое.
186 1204060
>>204037
минус конкурент
187 1204111
>>203991

В массиве не надо делать подмассивы для строк.

Пуст каждый элемент массива будет массивом вариантов, из которых можно выбирать следующее слово или символ:

$parts = [
['Я', 'ты', 'мы'],
[.....].
["\n"],
....
];

foreach ($parts as $options) {
$option = выбираем случайный элемент из $options;
echo $option;
}

Попробуй сделать так.

В простом варианте решения не надо было заморачиваться с массивами, а просто можно было сразу выводить слова. Так как первые 2 строки формируются одинаково, можно было использовать цикл из 2 шагов вместо копипасты.
188 1204139
Аноны, кто любит алгоритмы, предлагаю задачку, решение которой я сейчас ищу:

- дана длинная строка байт, длиной 1-2 Мб
- в ней есть повторяющиеся куски, длиной не менее minLength (например, 1000 байт)
- надо их найти, их расположение в строку и длину

Сложность тут в длине строки конечно.
189 1204240
Как фиксить?
190 1204256
>>204240
mb_internal_encoding("UTF-8");
Попробуй для начала.
191 1204330
>>204139
Навскидку какая-нибудь хэш-таблица должна смочь.
192 1204332
>>204330
Но это неточно.
193 1204338
>>204256
Без изменений.
194 1204341
>>204338
А это у тебя всё сломалось или ты с 0 пытаешься настроить? Погугли как в этой либе поддержку многобайтных символов сделать, а не только английских. Помню тоже ебался с этим tcpdf, но там уже не помню с чем была проблема, а решение было примерно таким: вместо нормального форматирования - пришлось кормить этой хуйне html сверстанный и что бы она уже его форматила в pdf
196 1204349
>>204341
Сломалось. Гугл выдаёт примерно такие решения,utf-8 поменять на ISO-8859-1,тот же результат,но с другими символами.Ладно,попробую твой метод,вдруг получится.
QR коды + БД + Сайт 197 1204353
Аноны, задача из реальной жизни:
Есть фирма которая делает мебель + дополнительно торгует всякой мелочью +-300 наименований товаров. Сайты-поставщики разные. Товары висят на стендах, цены на товары часто меняются поэтому ценников нет, цену надо спрашивать у продавана, типа идешь к компу, называешь код он тебе говорит цену. Всех эта схема подзаебала.
Я предложил возле каждого товара повесить QR код.

Мои варианты решения проблемы:

Срочная:
1) Спарсить с сайтов ссылки на товары, нагенерировать url qr кодов, развесить. Продаван сканирует код, заходит на страничку товара и сам считает цену ( цена = цена * 0.2)
Посоветуйте парсер, и может есть прога куда можно закинуть файл с сылками и она сразу сгенерирует кучу кодов на A4.
Подольше:
2) Создать сайтик с таблицей куда данные подгружаются с БД. qr код - ссылка на ячейку таблицы с товаром и ценой. В таблице цена автоматически обновляется раз в день.

Посоветуйте инструменты и вообще кто бы как сделал.
198 1204364
>>204353

>цена = цена * 1.2


фикс
199 1204366
Ээээх, еще один день, когда я обещаю себе завтра же сесть за ПХП................
201 1204408
>>204395
Я вот тоже не знаю, каждый вечер ложусь спать с мыслью "ну вот завтра проснусь, и за учебники", а в итоге проснулся, зашел на двачик, посмотрел мемчики, и уже спать пора.
Тру стори.
202 1204419
>>204408
Меня недавно задолбал подобный образ жизни, я сказал себе "Хватит!" и начал усиленно решать задачки, правда появилось ощущение, что скоро выгорю нахуй. Рано или поздно и у тебя будет такое, главное не упусти этот момент. Ты умный мальчик и я верю, что у тебя все получится :3
203 1204422
>>204408
Если потеряешь час с утра, будешь потом искать его весь день.
Заведи второй будильник "на работу".
Уговаривай себя не на подвиг, а только на самое первое действие для начала. Не "надо перемыть гору посуды", а "я сейчас открою кран". Не "надо выучить ПХП", а "я сейчас открою книгу". Не "надо написать ебучий проект", а "я сейчас открою редактор, создам файл". Против такой мелочи тебе самому будет сложно с собой торговаться, искать отговорки.
Ну и помодоро хорошо работает.
https://www.youtube.com/watch?v=H0k0TQfZGSc
https://pomotodo.com/
204 1204435
Платина. Призываю к совету анонов, желательно с картофляндии. Окончил вышку(программист) и работаю на принудительной галере(недопрограммист на некроязыке) - осталось чуть больше года отсидеть. Понимание программирования немного есть, но навыки отсюда вряд ли пригодятся, может только sql немного. В универе пытался вкатиться, процентов 40 кантора освоил и немного пхп с вёрсткой поковырял. Свободного времени тут относительно много, поэтому планирую выучить за это время что-нибудь адекватное. Читаю уже много времени и ваши треды, и треды фронтендеров и не могу разобраться, куда двигаться, чтобы через полтора года не обосраться, одно только понял, что кроме веба за полтора года ничего не успею освоить на уровне джуна, смотрю ещё на питона немного, дайте совет. Пишу сюда, потому что в фронттреде мало адекватов и вопросов по делу, у вас хорошая атмосфера и вроде как все делом занимаетесь.
205 1204454
>>204435
я кидаю тебе за щеку рефералку на хекслет.
Ты её оплачиваешь и начинаешь учиться
???????
PROFIT
206 1204455
>>204454
Я могу в самообучение, мне нужны мнения знающих анонов желательно из рб по поводу того, куда лучше в моей ситуации развиваться
207 1204462
Поясните за функции работы с массивами, а если точнее за параметры этих функций. По какой логике они выстроены?
Вот, например, функция array_keys возвращает массив ключей, да? Первым параметром она принимает массив, а вторым значение, ключи которого(ых), нужно найти.
Тут где-то неподалёку есть функция array_search, которая возвращает первый ключ искомого значения. Но тут она уже первым параметром принимает значение, а вторым - массив.

Казалось бы, две похожие функции, но почему порядок параметров разный? Почему нельзя было все функции этого типа стандартизировать, чтобы, например, везде сначала шёл массив, а затем уже значение?
Почему везде всё по-разному?
Это я чего-то не понимаю, или это просто разработчики php не могут в согласованную работу? В чём сакральный смысл такого поведения?
И это ведь не единственный пример, есть куча функций, которые ищут что-то в чём-то и порядок параметров всегда хаотичный, не подчиняющийся логике.

А это порой жутко неудобно бывает.
208 1204470
>>204462
А нет там никакой логики. PHP за этот пиздец не пнул еще разве что ленивый.
209 1204481
>>204462
Необязательные параметры идут в конце.

>Если указан необязательный параметр значение_для_поиска, функция возвращает только ключи, совпадающие с этим параметром. В обратном случае, функция возвращает все ключи массива исходный_массив.

210 1204483
>>204435

>Окончил вышку(программист)


>и работаю на принудительной галере


>Понимание программирования немного есть


>кроме веба за полтора года ничего не успею освоить на уровне джуна


Ты дно, пили сюда свои проекты.
211 1204484
>>204481
Ну тогда всё встаёт на свои места, спасибо.
212 1204488
>>204462
Все эти функции добавлялись в язык в разных версиях и разными людьми.
213 1204489
>>204484
Хотя, с другой стороны. В любом случае, функции для строк и для массивов имеют разный порядок аргументов.
Для строк сначала идёт haystack, а потом needle (как например в strpos), для массивов наоборот. Хотя оба аргумента обязательные.
Ну и названия методов тоже. array_search vs. strpos. Нелогично? Нелогично!

Я просто ньюфаня, и меня это немного путает (и пугает).
214 1204492
Анон, расскажи за такое действие, как это:
$a -> b;
Что тут происходит?
215 1204495
>>204492
Немного не то.
Задана переменная $a, к примеру.
И запись: $this -> a что означает?
216 1204502
>>204483
Нет
217 1204503
>>204495
$this - это указатель на текущий объект. Хотя, я не уверен, насколько слово "указатель" применимо в контексте php.
В любом случае, эта переменная, содержащая текущий объект.
Нотация -> означает обращение к какому-либо свойству или методу объекта.
Следовательно, $this->a обращается к свойству a текущего объекта .
219 1204507
>>204503
>>204505
Благодарю.
220 1204538
>>204502
Плохова ответ!

>>204489
Первым аргументом идет то что должно выдаться.
array_keys выдает массив.
array_search только первый ключ.
strpos позицию в строке.(Потому первая строка, а не искомый ключ)

>Нелогично?



Я сам нью, только позавчера начал основы читать.
221 1204550
>>204538
О каких вообще проектах ты меня спрашивал?
222 1204551
>>204538
Ну давай разберем по частям, тобою написанное ))

>Первым аргументом идет то что должно выдаться.


Смотрим:
array_search Осуществляет поиск данного значения в массиве и возвращает ключ первого найденного элемента в случае удачи (c php.net)
То есть што делает эта функция? Ищет в массиве искомое значение и возвращает первую позицию его. Да?

Теперь дальше:
strpos Возвращает позицию первого вхождения подстроки

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

Я так и не понял, что ты имел ввиду под

>Первым аргументом идет то что должно выдаться.



И в первой, и во второй функции возвращается int, который характеризует позицию первого найденного значения.

>Первым аргументом идет то что должно выдаться


>array_search только первый ключ


Мы ожидаем от функции индекс первого найденного элемента, поэтому первым аргументом передаём элемент, а вторым массив? Звучит логично.

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

>Первым аргументом идет то что должно выдаться


>strpos позицию в строке


Мы ожидаем от функции индекс первой найденной последовательности, поэтому первым аргументом передаем массив, в котором осуществляется поиск, а вторым уже искомый набор элементом.

>Нелогично?

222 1204551
>>204538
Ну давай разберем по частям, тобою написанное ))

>Первым аргументом идет то что должно выдаться.


Смотрим:
array_search Осуществляет поиск данного значения в массиве и возвращает ключ первого найденного элемента в случае удачи (c php.net)
То есть што делает эта функция? Ищет в массиве искомое значение и возвращает первую позицию его. Да?

Теперь дальше:
strpos Возвращает позицию первого вхождения подстроки

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

Я так и не понял, что ты имел ввиду под

>Первым аргументом идет то что должно выдаться.



И в первой, и во второй функции возвращается int, который характеризует позицию первого найденного значения.

>Первым аргументом идет то что должно выдаться


>array_search только первый ключ


Мы ожидаем от функции индекс первого найденного элемента, поэтому первым аргументом передаём элемент, а вторым массив? Звучит логично.

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

>Первым аргументом идет то что должно выдаться


>strpos позицию в строке


Мы ожидаем от функции индекс первой найденной последовательности, поэтому первым аргументом передаем массив, в котором осуществляется поиск, а вторым уже искомый набор элементом.

>Нелогично?

223 1204584
>>204550
О любых твоих.
Портфолио есть чем наполнить?
Если нет, то пили, попутно что-нибудь поймешь для себя.

>дайте совет


По поводу? Сформулируй вопрос!
Напиши имеющиеся знания.
224 1204614
>>204551

>Мы ожидаем от функции индекс первой найденной последовательности, поэтому первым аргументом передаем массив, в котором осуществляется поиск, а вторым уже искомый набор элементом.


Не массив а строку!
Получаем позицию в строке. Но не подстроку, которую ищем.

array_search пользуемся для работы с искомым значением.
(И конечно же для работы с массивом т.к. значение вложенное в него, но прежде всего со значением)
strpos пользуемся для работы со строкой в которой находится последовательность.
(Прост работаем относительно последовательности)

>Нелогично?

225 1204620
>>204584
В универе батрачил на работе, не связанной с ит. Поэтому сейчас отрабатываю на этой галере 2 года, только сюда без особых знаний взяли . Нету никаких проектов, то что на работе делаю - это пару тысяч строк каких - то костылей на языке, который лет 15 не используют для бухгалтеров и кладовщиков.Знания вроде и есть, а по сути нет. Знаю простые вещи вроде циклов, ресурсий, алгоритмов для строк и сортировок, что такое процедуры, деревья, массивы и тд и тп, по вебу конкретно ничего не знаю кроме универской вёрстки с простейшим вмешательством js, по пхп максимум апач ставил и пару лаб простейших писал, английский pre-intermediate. Хочу совета в том, что лучше учить за эти полтора года, было бы неплохо для белорусских реалий. Может вообще не в веб вкатываться. Какая-то ебанутая простыня получилась, сейчас меня как и большинство платиновых нахуй пошлют.
226 1204650
>>204620

>сейчас меня как и большинство платиновых нахуй пошлют.


С такими вводными данными точно.

>языке, который лет 15 не используют для бухгалтеров и кладовщиков


Ты кроме птичьего знаешь еще какой?

>на работе делаю - это пару тысяч строк каких - то костылей


Разве это не поддержка кода?

>Знаю простые вещи вроде циклов, ресурсий, алгоритмов для строк и сортировок, что такое процедуры, деревья, массивы и тд и тп


Так это же самая основа, разве нет?
Остается только семантику изучить чтобы к ней применять.

>Хочу совета в том, что лучше учить за эти полтора года


Лучше для чего? В чем лучше?

>Может вообще не в веб вкатываться.


Твои знания именно что программистские.
А значит скорее лучше исключить верстку и фронтенд, чтобы не тратить время.
И смотреть как минимум на бекенд.

>было бы неплохо для белорусских реалий.


Устройство трактора?
227 1204654
>>204650
Не поддержка, я их сам пишу. В джсе же тоже все эти основы используются, как и в пхп.
228 1204663
Ещё вопрос во многих вакансиях на пхп пишут в требованиях+ знания вёрстки и js, на каком уровне обычно требуют это?
229 1204664
>>204654
Ты пишешь программы или костыли для программ?
А еще сайты можно плить на питоне!

Ты определился что ты хочешь от проганья или что хочешь прогать?
230 1204671
>>204663

>+ знания вёрстки и js, на каком уровне обычно требуют это?


На уровне чтения и использования в коде.
Пили свой проектик учебный, в процессе придет осознание.
231 1204672
>>204614

>Не массив а строку!


Так ведь строка это и есть массив!
Строка - последовательность символов, массив - последовательность каких-то других данных.
В каком-нибудь C это вообще буквально так и есть.

И первая, и вторая функция используется для поиска значения в последовательности.
И первая, и вторая функция возвращает индекс первого найденного элемента по нашему запросу.

Будь это элемент в массиве или подстрока, какая разница? И там и там возвращается одно и то же.
Чем принципиально отличается индекс массива и позиция в строке? Это такое же число, равное отступу от начала этой последовательности.

Какая разница для чего нам нужна эта функция, если возвращаемое значение и там, и там несет в себе один смысл?

Окей, вот у нас есть строка мышь.
Мы пытаемся найти в ней "ш".

И спрашиваем, какой отступ у символа "ш" в последовательности символов мышь, относительно начала последовательности?
Получаем ответ - 2.

Теперь у нас есть массив ["м", "ы", "ш", "ь"].
Мы пытаемся найти в нём "ш".

И спрашиваем, какой отступ у элемента типа "строка" "ш" в последовательности элементов типа "строка" "м", "ы", "ш", "ь", относительно начала последовательности?
Получаем ответ - 2.

В чём принципиальная разница, которая бы отличала первую функцию от второй настолько, чтобы она стала достойна смены порядка аргументов?

Мы ищем что-то в чём-то. Ищем что-то в какой-то последовательности. Ищем позицию элемента какого-то типа в последовательности, состоящей из элементов данного типа.
Ну а потом, для чего нам может понадобиться узнать позицию последовательности в строке? Ну, например, для того, чтобы убедиться, что она там вообще есть, ну провести какие-то манипуляции с последовательностью.
Но и с массивом то же самое! Мы можем использовать функцию array_search как для того, чтобы убедиться, что массив есть, ну или чтобы провести какие-то манипуляции с этим элементом, т.е. по сути тоже с последовательностью, только состоящей из одного элемента (да и к тому же ничто не мешает использовать функцию для поиска некоего диапазона, чтобы потом работать с ним).

Может быть, я слишком глупый, но я этого не понимаю.
231 1204672
>>204614

>Не массив а строку!


Так ведь строка это и есть массив!
Строка - последовательность символов, массив - последовательность каких-то других данных.
В каком-нибудь C это вообще буквально так и есть.

И первая, и вторая функция используется для поиска значения в последовательности.
И первая, и вторая функция возвращает индекс первого найденного элемента по нашему запросу.

Будь это элемент в массиве или подстрока, какая разница? И там и там возвращается одно и то же.
Чем принципиально отличается индекс массива и позиция в строке? Это такое же число, равное отступу от начала этой последовательности.

Какая разница для чего нам нужна эта функция, если возвращаемое значение и там, и там несет в себе один смысл?

Окей, вот у нас есть строка мышь.
Мы пытаемся найти в ней "ш".

И спрашиваем, какой отступ у символа "ш" в последовательности символов мышь, относительно начала последовательности?
Получаем ответ - 2.

Теперь у нас есть массив ["м", "ы", "ш", "ь"].
Мы пытаемся найти в нём "ш".

И спрашиваем, какой отступ у элемента типа "строка" "ш" в последовательности элементов типа "строка" "м", "ы", "ш", "ь", относительно начала последовательности?
Получаем ответ - 2.

В чём принципиальная разница, которая бы отличала первую функцию от второй настолько, чтобы она стала достойна смены порядка аргументов?

Мы ищем что-то в чём-то. Ищем что-то в какой-то последовательности. Ищем позицию элемента какого-то типа в последовательности, состоящей из элементов данного типа.
Ну а потом, для чего нам может понадобиться узнать позицию последовательности в строке? Ну, например, для того, чтобы убедиться, что она там вообще есть, ну провести какие-то манипуляции с последовательностью.
Но и с массивом то же самое! Мы можем использовать функцию array_search как для того, чтобы убедиться, что массив есть, ну или чтобы провести какие-то манипуляции с этим элементом, т.е. по сути тоже с последовательностью, только состоящей из одного элемента (да и к тому же ничто не мешает использовать функцию для поиска некоего диапазона, чтобы потом работать с ним).

Может быть, я слишком глупый, но я этого не понимаю.
232 1204675
>>204419
>>204422
Спасибо за поддержку, пачаны :3
233 1204680
>>204664
Программы, но они костыльные, так как смысла не вижу углубляться в то, что не буду использовать после этой работы(fox). От программирования хочу работы, а не хобби, поэтому спрашиваю совета у знающих анонов, во что сейчас лучше вложить силы и эти полтора года.
234 1204682
>>204672
В итоге ты ищешь значение не само в себе, а для работы с чем-то.

Ты ищешь ключ значения в массиве для работы со значением.
Ты ищешь позицию в строке для работы со строкой.
235 1204685
>>204680

>хочу работы


у тебя уже есть работа или тебя гонят с нее за говнокод?
Ты так и не написал на чем программируешь.
236 1204686
>>204680

>во что сейчас лучше вложить силы и эти полтора года.


В курсы сантехника!
237 1204689
>>204686
сварщик лучше
238 1204690
>>204682

>Ты ищешь ключ значения в массиве для работы со значением.



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

unset($misch[array_search("ш", $misch)]);
substr_replace($misch, "", strpos($misch, "ш"), 1);

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

И в первом и втором случае меня волнует только позиция значения для того, чтобы удалить её их последовательности. Ничего больше меня не волнует.
239 1204692
>>204690
Ну, вместо unset лучше использовать array_splice, но суть это не меняет.
240 1204695
>>204689
Чем лучше?
Сварщик более вредная профессия.
241 1204696
>>204685
Написал же, на фоксе. Я тут отсиживаю отработку после универа обязательную 2 года, никто не гонит.
242 1204704
>>204696
FoxPro?
Работаешь с СУБД?
Чего не перекатишься в SQL?
243 1204706
>>204690

>Я ищу номер значения, чтобы удалить его из последовательности, например.


В примере ты ищешь позицию, чтобы внести правки в строку.
244 1204707
>>204706
... и в массив
245 1204712
>>204707
У тебя строка и является массивом.
246 1204715
>>204712
Так строка это и есть массив. Что массив, что строка, в обоих случаях мы находим позицию, чтобы удалить элемент из последовательности.
Разницы нет. Нелогичность функций есть.
Не стоит наделять смыслом то, что смысла не имеет. Например, функции принимают аргументы в разном порядке из-за того, что потом со сторокой...
Функцию не должны волновать то, что кто-то будет делать с тем значением, которое она возвращает. Её задача принять параметр, обработать его и вернуть результат. Всё.
247 1204718
>>204704
Да, на фокспро. Тут полный пиздец с советских времен, баз нет, просто тысячи таблиц несвязанных, ебись как хочешь, как пришёл-дали книгу, которая старше меня и такой же компухтер, и я начал костылить на отьебись, так что мои знания отсюда никому не нужны.
248 1204726
>>204715

>мы находим позицию, чтобы удалить элемент из последовательности.


Не обязательно.

Индекс в множестве строк для работы с найденной строкой.
!==
Позиция в строке для работы с этой же строкой.

>Функцию не должны волновать


Функция сама должна волновать своим порядком аргументов.

>функции принимают аргументы в разном порядке из-за


внедренной логики программирования

>Разницы нет.


>Нелогичность функций есть.


>Не стоит наделять смыслом то, что смысла не имеет.


>Всё.

249 1204730
>>204718
Знание семантики рили не нужно, но работа с СУБД разве она будет сильно отличаться?
250 1204736
>>204726

>Не обязательно.


Вот и именно, спасибо, что ты наконец-то это признал. Мы ищем отступ для чего угодно, задача функции вернуть нам этот отступ и всё.

>Индекс в множестве строк для работы с найденной строкой.


>!==


>Позиция в строке для работы с этой же строкой.


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

Концептуально, конечно же, понятное дело, что типы разные.
251 1204740
>>204736
>>204726
>>204715

Хватит засорять тред бессмысленным флудом. Недостатки PHP (и других языков) давно уже собраны и изучены, если хотите их обсудить, перемещайтесь сюда: https://habr.com/post/315152/

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

Также, в PHP строки это массивы байт, а не массивы символов. Например, $a = "абв"; echo $a[0]; в кодировках utf-8 или utf-16 НЕ выведет букву "a", так как строка в PHP это НЕ массив символов.

Соответственно объяснения в посте >>204672 ошибочные и не учитывают этого.

Функции работы с массивами в PHP не будут работать со строками. Например, ты не можешь применить функцию array_sum или in_array к строке. И наоборот, функции работы со строками не работают с массивами.

Функция strpos называется так, потому, что это функция из старой сишной библиотеки работы с однобайтовыми строками и там принят такой стиль наименования. Сейчас в коде надо использовать mb_strpos, а не strpos.
252 1204741
>>204730
Я делаю простейшие вещи из sql, создать курсор, проиндексировать, найти что-то, присоединить, сортировать, изменить,удалить, большая часть ебли с самим воксом
253 1204742
>>204736

>Мы ищем отступ


Нет.

Положение элемента
!==
Положение относительно элемента
254 1204747
Кому не нравятся стандартные функции вплоть до названий - ничто не мешает написать враппер.
255 1204755
>>204718

Нельзя перенести код на нормальную реляционную СУБД с внешними ключами, комментариями и сделать веб приложение?
256 1204758
>>204742

>Положение элемента


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

>>204740

>Соответственно объяснения в посте >>204672 ошибочные и не учитывают этого.


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

>Хватит засорять тред бессмысленным флудом


Я не флудить хочу, а разобраться.
257 1204768
>>204755
Это завод. Тут слишком все запущено, компы эры доса, таблицы никогда не узнаешь где ещё используются, тысячи таблиц с кучей полей и записей, никто не знает где какое поле что значит, даже программы, написанные на вижуал фокс а не на фокспро досовском уже лагают, все со всем связано и от каждого пука ломается, сеть и интернет слабые или почти отсутствуют. Я сам не шарю в этом всем, но то, что я тут вижу- маразм полный, из этого говна уже не вылезти
258 1204772
>>204768
Вообще я единственный кто на вижуал фокс с формами пишет тут, все ветераны программирования до сих пор на матричных принтерах и досе сидят
259 1204776
>>204772
Могу много рофлоф потом рассказать отсюда, но смена кончается и мне надо идти
260 1204779
>>204758

>Следовательно, индекс элемента - это его смещение относительно начала


Короче, походу тут я ошибся. В PHP массив - это не совсем то, чем он является на самом деле. Это по своей сути хеш-таблица, поэтому индексы могут быть любыми.

То есть, не составит труда написать array([231] => "м", [717] => "ы", ...);
Тогда в этом случае, индексы уже ничего не означают.
261 1204782
>>204779
Ой, ну т.е. без квадратных скобочек, естественно.
262 1204786
>>204779
Весь этот пердолинг на старых компах и неэффектинвых системах должен кучу времени отнимать у рабочих, нет денег на новое перейти - что производит завод?
263 1204792
>>204786
Можешь почитать про главного ебаната и понять ситуацию https://antijob.net/black_list/id78489/
264 1204793
>>204786
Ну там ограничение на числа и строки в качестве ключей.
265 1204801
>>204779
Выходит, когда мы используем функцию array_search, мы действительно ищем индекс отдельного элемента. Поскольку он не указывает на смещение относительно начала, единственное, для чего он нам может понадобиться, это для того, чтобы отыскать элемент.

Например, у нас есть словарь, состоящий из 500000 слов и мы хотим найти в нём слово "мышь". Тогда функция вернёт нам индекс элемента.
Правда, не очень понятно, зачем это нужно и как это может пригодиться. Опять же, учитывая, что индекс - это не смещение относительно начала. Ибо будь это не так, я бы нашёл оправдание, т.к. сам столкнулся с ситуацией, когда это нужно (даже, например, для того, чтобы удалить последовательность из массива. Если предположить, что в массиве слова упорядоченны в алфавитном порядке и индексы указывают на смещение, тогда найдя индекс первого слова, которое начинается на букву б и первого слова, начинающегося на букву в, мы можем вырезать все слова, которые начинаются на букву б).
Но мы предполагаем, что индексы в массиве хаотичные. Тогда задача теряет какой-либо смысл.

Вот если бы мы обновляли ключи каждый раз, тогда да. А так, выходит, на ключи в php нельзя полагаться и численный массив является тем же ассоциативным массивом, только за исключением того, что ключами в нём являются целые числа. И всё.

Выходит, я не прав? Ну ладно, entschuldigung.
266 1204814
>>204801
Но строки же тоже могут быть ключами.

А еще элемент с индексом 3 может идти после елемента с индексом 5.

Покопайся в массивных функциях, с помощью какой то можно быстро изменить массив чтобы у него были индексы по порядку с нуля.
267 1204912
>>204758

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

Функции так названы изначально, так как strpos это функция сишной библиотеки с таким именем, а in_array и array_search - написанные специально для PHP функции, причем подозреваю, в разное время. Потому у них разный стиль именования.

Какой смысл обсуждать, правильный в них порядок аргументов или нет? Он от этого не поменяется.

Почему бы тебе не обратиться с такими вопросами в список рассылки, где общаются разработчики PHP? Или хотя бы не устраивать тут чат, а написать все аргументы одним постом и успокоиться?
268 1204957
>>204912
Я не утверждал, что строка и массив в php это одно и то же. Я писал, что строка это массив. И всё. Я даже сделал акцент на этом моменте в одном из своих постов.

>Нет, ты именно флудишь. Какой смысл тут разводить бессмысленный спор на 40 постов?


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

>Какой смысл обсуждать, правильный в них порядок аргументов или нет? Он от этого не поменяется.


Я хотел узнать почему он такой, чем обусловлен. И почему, если авторы функций знали, что они делают, они не стандартизировали именование функций и их аргументы.
Я не рассчитывал на развёрнутый ответ с печатью "истина", я лишь ждал, что какой-то мимокрокодил, если слышал об этом, кинет в меня парочкой словечек.
269 1205004
>>204957
Съеби уже отсюда, чмоха.
270 1205040
>>199390 (OP)
Оппушка и все.
Насколько сильно нужно знать алгоритмы и матеш на самом деле? Нужно ли быть одаренным гением или хватает базовых знаний?
И как на данный момент обстоят дела с вакансиями PHP программиста. На superjob нашел только 4 вакансии, которые не требовали опыт работы. Все, лавочка закрыта?
И еще, сложно ли научиться оптимизации и рефакторингу существующего кода?
271 1205048
>>205040
На hh посмотри.
272 1205063
>>205048
Посмотрел, там побольше будет. Ну а так на чем основана работа PHP программиста? Просто в одной вакансии, в разделе «дополнительные плюшки» увидел решение разных и сложных задач. Я понимаю, что некоторым программистам реально скучно решать одинаковые задачи, но не настолько же, что бы добавлять это в список преимуществ. Вот и интересно, на вакансию PHP программист больше требуется опыт или мозги?
273 1205064
>>205063
ты должен уметь клепать однотипные магазины на вордпессе. Больше работы для пхп программистов нет
274 1205086
>>204957

Я уже писал выше, причины исторические. strpos названа по аналогии с strstr и strchr, которые являются функциями из сишной библиотеки, в таком виде она уже лет 40 существует: https://ru.wikipedia.org/wiki/String.h

Правда, в PHP в итоге их переписали и они сейчас используют какую-то внутреннюю библиотеку работы со строками: https://github.com/php/php-src/blob/5eb1f92f31cafc48384f9096012f421b37f6d425/ext/standard/string.c#L1955

Функции in_array и array_search - из набора функций array в PHP. Они тоже существуют очень давно и почему там такой порядок, я не знаю.

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

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

> Я писал, что строка это массив.



Строку можно представлять как "массив" символов, но полноценным массивом она от этого не станет. Моя цель была лишь объяснить, что в PHP строка и массив это разные типы и один нельзя использовать вместо другого. Чтобы кто-нибудь потом не удивлялся, почему функции для массивов не работают со строкой.

> И почему, если авторы функций знали, что они делают, они не стандартизировали именование функций и их аргументы



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

И о какой стандартизации ты говоришь? На начальном этапе развития PHP его писали несколько человек и если бы они занимались стандартизацией, он бы вообще свет не увидел. А сейчас процесс стандартизации есть - он называется PSR, можешь погуглить и почитать. Но естественно, стандартизовывать то, что уже сделано, поздно.
274 1205086
>>204957

Я уже писал выше, причины исторические. strpos названа по аналогии с strstr и strchr, которые являются функциями из сишной библиотеки, в таком виде она уже лет 40 существует: https://ru.wikipedia.org/wiki/String.h

Правда, в PHP в итоге их переписали и они сейчас используют какую-то внутреннюю библиотеку работы со строками: https://github.com/php/php-src/blob/5eb1f92f31cafc48384f9096012f421b37f6d425/ext/standard/string.c#L1955

Функции in_array и array_search - из набора функций array в PHP. Они тоже существуют очень давно и почему там такой порядок, я не знаю.

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

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

> Я писал, что строка это массив.



Строку можно представлять как "массив" символов, но полноценным массивом она от этого не станет. Моя цель была лишь объяснить, что в PHP строка и массив это разные типы и один нельзя использовать вместо другого. Чтобы кто-нибудь потом не удивлялся, почему функции для массивов не работают со строкой.

> И почему, если авторы функций знали, что они делают, они не стандартизировали именование функций и их аргументы



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

И о какой стандартизации ты говоришь? На начальном этапе развития PHP его писали несколько человек и если бы они занимались стандартизацией, он бы вообще свет не увидел. А сейчас процесс стандартизации есть - он называется PSR, можешь погуглить и почитать. Но естественно, стандартизовывать то, что уже сделано, поздно.
275 1205092
>>205063
Писать/Дописывать/Обслуживать логику какого-либо приложения, например "электронные карточки пациентов" в поликлинике. Приложение в большинстве случаев будет написано на фреймворке.
276 1205096
>>205064
Не обманывай, вот пример студии разрабатывающей приложения на синем слонике для серьезного бизнеса https://task-on.com/
277 1205097
>>205092

>фреймворке


То есть по сути фреймворк сильно облегчает работу?
Чn тогда на вакансиях вопросы задают типа :
Даны две переменные - a и b. Например, они равны a=2; b=3. Необходимо поменять местами эти числа (то есть a=3, b=2). Но не используя третью переменную
278 1205151
>>205097
Ну типо типо, безопастность там, много чего уже написано, все по правилам и т.д. Ты должен знать основы все равно, как ты разберешься в фреймворках не зная основ языка на котором они написаны? А уебанские говнозадачи нужны для проверки твой смекалочки.
279 1205186
>>205097
file_put_contents('a.txt', $a);
file_put_contents('b.txt', $b);
$a = (int)file_get_contents('b.txt');
$b = (int)file_get_contents('a.txt');

Пойдет?
280 1205205
>>205186
a=a+b
b=a-b
a=a-b
281 1205211
>>205205
Вообще фантазии у людей нет. Самое очевидное решение же. Обычно такие вопросы задают с целью услышать несколько вариантов решения, поэтому можно смело начать с самых странных и дебильных, пока интервьюер не задолбается и не сформулирует более четкое тз.

-----
$a = explode('KUKUYOPTA', $a . 'KUKUYOPTA' . $b);
$b = $a[0];
$a = $a[1];
-----
use KukuyoptaLib/VariableMixer;
VariableMixed::mixVars($a, $b);
-----
$a = [$a, $b];
$b = $a[0];
$a = $a[1];
-----
eval('use third variable here');
-----
list($a, $b) = [$b, $a];
282 1205212
Вопрос нуба: зачем нужны иммутабельные объекты?
283 1205213
>>205212
Когда тебе нужна иммутабельность.
284 1205243
>>205211
$a=+=$b-$b=$a
285 1205272
>>205097
$a ^= $b;
$b ^= $a;
$a ^= $b;
286 1205426
>>205211
Ты всерьёз думаешь, что большинство соискателей смогут решить эту задачу хоть одним способом? Расскажи эйчарам, посмеши. Я про соискателей на начальные позиции, ну и про тех, кому "вышка не нужна"
287 1205463
>>205426

>вышка не нужна


Высшее образование в России - это профанация.

Ты же имел в виду простых деревенских ребят, у котрых "смекалочка".
Таких полно среди пыхеров, 1с-ников и прочих верстальщиков.
288 1205498
Аноны, недавно начал учить пхп по гайду из оп-поста
Очень долго ебался с задачей на рандомный ответ, смог наговнокодить только так, через var_dump выводил номер нарандомленного ответа, а не сам ответ
Подскажите, как это можно реализовать без костылей?
https://ideone.com/B4EjTK
289 1205516
>>205498

Функция array_rand возвращает ключ случайного элемента массива. Как, имея массив и ключ, получить значение элемента с этим ключом?

значение = массив[ключ]

Попробуй квадратные скобки. Это же основа работы с массивами, видимо, в учебнике это плохо объяснено, так как не первый раз задают этот вопрос.
290 1205683
>>205516
Спасибо анон, все сразу получилось
15283317221440.jpg28 Кб, 500x549
291 1205915
>>205426

>"вышка не нужна"


В 90% случаев хуета и бесполезная трата времени. Ты сейчас напоминаешь служивых петушков, которые год чистили вилкой и присаживались на бутылку, а после кичатся званием "настоящий мужык".
292 1205926
>>205915
Лично я за 4 года бакалавриата понял чем хочу заниматься в жизни(не по специальности)
В 17, когда поступал в уник, единственное чего я хотел- не попасть в армию. За 4 года подрабатывал,купил военник, заинтересовался программированием и жизнь стала куда интереснее
мимо-другой-анон
293 1205943
Помогите далбаебу. В базе данных есть таблица (пик 1).
Как мне вывести значения, чтобы имя не дублировалось, примерно как на пике 2?
294 1205946
>>205943
преобразовать полученные данные перед вывоводом
295 1205947
>>205943
сделать массив с массивами
296 1205954
>>205943
array_map
297 1205962
>>205926

>понял чем хочу заниматься в жизни


Просто ты повзрослел.
298 1206013
>>205212

Хороший вопрос. Давай подумаем, какие есть у них плюсы и минусы:

- если ты передаешь иммутабельный объект в функцию, ты на 100% уверен что она с ним ничего не сделает. В случае мутабельных объектов глядя на код, нельзя на 100% сказать, что тут происходит:

$money = new Money(300, 'USD');
$user->setMoney($money);

doSomething($user);

// если функция делает $user->getMoney()->setAmount(150), то вполне возможно
// что там уже другая сумма и в сообщении будет не "300 USD"
echo "Вам добавлено {$money->getAsString()} денег\n";

В случае, если бы объект Money был иммутабельным, то мы можем гарантировать, что сообщение будет выведено корректно и будет содержать сумму 300 USD.

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

- если в переменной хранится иммутабельный объект, то очень легко и быстро проверить, изменилась она или нет:

$oldValue = ...;
$currentValue = ....;

if ($currentValue === $oldValue) {
echo "Данные 100% не изменились\n";
} else {
// сохранить изменения
}

В случае с обычными объектами так не выйдет.

Но есть и минусы:

- для любого изменения надо создавать новый иммутабельный объект, что может быть помедленнее и требовать больше памяти

Также, я решил погуглить, и почитать что другие люди пишут по теме, вот например: https://hackernoon.com/5-benefits-of-immutable-objects-worth-considering-for-your-next-project-f98e7e85b6ac?gi=5ea2ddd2d229
298 1206013
>>205212

Хороший вопрос. Давай подумаем, какие есть у них плюсы и минусы:

- если ты передаешь иммутабельный объект в функцию, ты на 100% уверен что она с ним ничего не сделает. В случае мутабельных объектов глядя на код, нельзя на 100% сказать, что тут происходит:

$money = new Money(300, 'USD');
$user->setMoney($money);

doSomething($user);

// если функция делает $user->getMoney()->setAmount(150), то вполне возможно
// что там уже другая сумма и в сообщении будет не "300 USD"
echo "Вам добавлено {$money->getAsString()} денег\n";

В случае, если бы объект Money был иммутабельным, то мы можем гарантировать, что сообщение будет выведено корректно и будет содержать сумму 300 USD.

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

- если в переменной хранится иммутабельный объект, то очень легко и быстро проверить, изменилась она или нет:

$oldValue = ...;
$currentValue = ....;

if ($currentValue === $oldValue) {
echo "Данные 100% не изменились\n";
} else {
// сохранить изменения
}

В случае с обычными объектами так не выйдет.

Но есть и минусы:

- для любого изменения надо создавать новый иммутабельный объект, что может быть помедленнее и требовать больше памяти

Также, я решил погуглить, и почитать что другие люди пишут по теме, вот например: https://hackernoon.com/5-benefits-of-immutable-objects-worth-considering-for-your-next-project-f98e7e85b6ac?gi=5ea2ddd2d229
299 1206020
Почему всегда слева вверху выводится значение хранимое в сессии? Я то его в коде нигде не вывожу
300 1206135
>>206020
нет выводишь
hqdefault.jpg14 Кб, 480x360
301 1206418
>>204675
Как успехи?
Снимок экрана от 2018-06-09 20-22-28.png21 Кб, 390x208
302 1206642
Почему не получается читать файл? Функции file_exists и file_size показывают правильный результат. В переменой пути лежит ./subfolder/filename, а сам файл имеет имя filename и лежит в соседней папке от пхп скрипта. это значит файл на том месте где скрипт его ищет Но функции fread, file и get_file_contents срабатывают без ошибок возвращая пустой результат. Как заставить скрипт прочитать файл?
303 1206658
>>206642
нашёл что-то в error.log там сказано у скипта нет прав для доступа к файлу. Уже гуглю как исправить проблему. Вопрос снят
304 1206659
>>206642
Хуй знает чего ты колхозишь, но используй FilesystemIterator.
305 1206909
>>206418
Бухаю третий день, мемчики не смотрю, мне кажется это прогресс. :с
306 1207274
>>206642
Подключи его через include
307 1207291
Учусь по книге ОПа, но что то перенос строки с помощью \n не работает. Работает только если самому набрать
echo "<br>", но тогда код страницы не очень смотрится. Это можно как нибудь пофиксить
1.jpeg48 Кб, 800x600
308 1207306
309 1207317
>>207291
header('Content-Type: text/plain');
310 1207334
Пытаюсь вывести рандомный элемент массива через "echo", но что-то не очень получается. Не подскажете как тут изменить можно, при условии что потом надо будет еще раз вызвать какой-то рандомный элемент данного массива?
http://codepad.org/90MOd1RB
311 1207335
>>207334
Упс, вот эта ссылка
http://codepad.org/Hwq87ZPi
312 1207350
>>207335
echo "$word1[mt_rand(0, count($word1) - 1)]";
Перенеси просто логику в отдельную переменную, зачем такое делать?
<?php

error_reporting(-1);

$word1 = array('Чудесных', 'Суровых', 'Занятных', 'Внезапных');

$i = mt_rand(0, count($word1)-1);
echo "$word1[$i]";
?>
313 1207355
>>207334

Вместо mt_rand, используй array_rand.
$новаяПеременная[array_rand($имяМассива)];
В echo лучше вставлять уже готовое решение в виде переменной.

Пример: https://ideone.com/SihzCp
314 1207659
>>207291
Еще можешь выводить код в теге <pre>
Untitled.png3 Кб, 187x71
315 1208106
Штука в том что без аннотации хинтер тут бы вывел ошибку.
Поясню за структуру: есть статический массив с ключами-регулярками и значениями-функциями, я беру урл и прохожусь по ключам, беру фукнцию с матченой регуляркой и ей паршу дом полученный из этого урла, все оч просто.
Теперь думаю как более правильно в понимании сурьёзного программирования это следует оформить. Получается, нужно например сделать интерфейс для парсера, и парсеры для раных ссылок делать его имплементациями, а потом... что? Вот сам выбор нужного парсера как грамотно организовать? Все мои мысли сводятся к чему-то типо того-же роутинга и в итоге никакого выйгрыша ни в скорости ни в декомпозиции кода не видится. Т.е. получается так-же статически связано как и один массив, только больше кода. Может, можно вообще по другому сделать всё, но задача стоит тупо для разных ссылок вызвать разные фукнции.
316 1208110
>>208106
Ну и на всякий случай поясню что да можно было бы например call_user_func использовать и без аннотации но это тоже самое по сути (а между тем есть данные что это медленнее работает) и суть проблемы не в этом
317 1208119
Думаю что пришел с классической проблемой.

В общем есть 1 селект, и нужно получается для корректной пагинации узнать количество всего что он выдает. Но прикол в том, что селект большой и с кучей джойнов, а еще в нем много фильтров задействовано, на каждом столбике в таблице на сайте есть условный фильтр и сортировка и всё это падает в where'ы.

Пока что этот селект прогоняется в цикле из двух итераций.

На первой итерации собирается весь поиск и прогоняется селект с целью подсчета строк.

На второй итерации добавляются уже лимит и оффсет для получения собственно самих строк.

Как разрешить эту задачу и избавиться от дублирования запроса в базу в этой ситуации?
318 1208161
А почему никто не использует and, or вместо ||, &&? Удобнее же их набирать чем символы.
319 1208196
Поясните зачем нужен PDO, если в фрейворках свои методы работы с БД?
320 1208202
>>208161
&&, ||, трушнее по сишному

у and и or приоритет ниже
321 1208265
>>208196
Хуевые значит фреймворки. PDO быстрее и проще.
1512179375200 (1).png99 Кб, 680x521
322 1208551
Продублирую вопрос из закреп-треда.
Пацаны, завалил задание на собеседовании, подскажите пожалуйста ответ.
Имеется ассоциативный массив.
$a=array("John"=>array("test_id"=>1, "student_id"=>2, "mark"=>3), "Peter"=>array("test_id"=>1, "student_id"=>4, "mark"=>1), "Hans"=>array("test_id"=>1, "student_id"=>3, "mark"=>1), "Helen"=>array("test_id"=>2, "student_id"=>2, "mark"=>5));
Задача отсортировать массив в порядке возрастания элементов подмассивов с ключом "mark" НЕ ИСПОЛЬЗУЯ стандартные функции сортировки PHP(usort и прочие).
Я пробовал пузырьком через цикл фор, но из-за ассоциативного массива с именами он не видит элементы. Форич тоже криво работал.
323 1208560
>>208196
они реализуются через PDO
324 1208568
>>208551
Самое простое разбить на 2 индексированных массива. Ключи и значения по отдельности.
$ak = array_keys($a);
$av = array_values($a);
Главное не забыть переставлять элементы в обоих массивах. Потом склеить array_combine($ak, $av);

Если честно, то array_combine я без мануала не вспомнил бы.
325 1208614
>>208551
Начал сам решать
но этот анон оказался быстреее>>208568

Я вот так сделал, но без справочника я бы точно нихуя не сделал, на собесе можно инетом пользоваться или нет?
327 1208627
Ебантизм конечно имея юсорт сортировать пузырьком например, может еще ответ браузеру отдать не использвуя стандартные функции вывода??? Типа открываешь блять стрим и пишешь туда ну вот нахуя такое делают ебаный ВРОТТЕНБЕРГ МИНУС ЖОПА
Гораздо коректнее занести имена в колонку и сортировать как человек а не как жывотное, еще uasort есть

А еще гляньте на этих ебобо - имена людей в ключах!! ТИПО НЕБЫВАЕТ НА СВЕТЕ ДВУХ ДЖОНОВ БЛЯТЬ АГА!!!!!!
И АЙДИ СТУДЕНТОВ БЛЯТЬ СМОТРИ ТАМ ПЕРЕСЕКАЮТСЯ
КАКОГО ХУЯ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
сори за спам.
328 1208655
>>208615
Не.
Поменяй стартовые значения оценок на 4 3 2 1 и посмотри результат https://ideone.com/ua9rlh У простых алгоритмов сортировки(пузырек, перестановками, вставками и т.д.) сложность n^2. Значит должен быть второй вложенный цикл.
329 1208659
>>208627
Норм задание на самом деле. Видно знает ли подопытный как устроены массивы в php и может ли реализовать простой алгоритм. Если бы попросили in-place Quicksort накатать, то наверно можно было бы взбугуртнуть.
330 1208760
>>199420

> понимаю, просто сам факт того, что там только поле ввода как бы говорит, что учитель может туда ввести, что угодно. Лучше всего будет сделать выпадающи список с поиском.



Можно сделать так, можно сделать поле ввода с возможностью ввода новых значений, отсутствующих в списке.

>>Доступ к приложению возможен только после регистрации и одобрения администратором.


> а где администратор должен давать это одобрение?



Тогда админка нужна. Но в начале можно наверно обойтись и без нее, просто вбив список пользователей в базу.

>>199893

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



Когда учитель логинится, он видит, я думаю, список ближайших занятий (12 марта - физика у гр. 1234, 13 марта- математика у 1235). Замечания ставятся в рамках определенного курса. Например, только относящиеся к лабораторным по физике.

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



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

>>199811

Он и не должен быть null. С чего бы? Число совпадений можно узнать по числу, которое вернет функция, или посчитав элементы в массиве внутри одной группы.
331 1208761
>>199850

Ты вообще заметил правильную вещь. С анонимной регистрацией действительно есть проблемы:

- если человек создал тест, а позже кто-то другой с того же компьютера зарегистрировался, получается, он получит доступ к тому тесту?
- если человек создал тест, получил куку, а потом внезапно залогинился, что делать? Склеивать эту куку и все тесты с нее с его аккаунтом или же "забыть" эту куку и потерять доступ к управлению тестами?

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

Потому мне сейчас пришел в голову другой вариант: при создании теста генерировать специальную куку для доступа к тесту, действительную только для этого теста и никак не мешающую другим тестам и логину/регистрации. Если речь о куках, то это может быть например кука owner[12345]=xxxx или owner_12345=xxxx. Также, если пользователь даст почту, то выслать на нее специальную ссылку, дающую доступ к управлению именно этим тестом (которая как раз будет ставить такую куку на какое-то время).

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

Это не исключает возможности регистрации потом, можно после создания теста показывать ссылку вида /register?from=test_12345, которая привяжет этот тест в аккаунт. Также, можно сделать второй вариант, если человек открывает ссылку из почты для управления тестом и он залогинен, предложить добавить тест в аккаунт.

То есть попробуй продумать все такие сценарии, какие возможны проблемы. Все-таки возможность создавать тесты без регистрации довольно важна и может увеличить число пользователей.

> Если человек создает тест, после введет свой имеил (не регистрируясь, а просто что бы получать статистику, как я понимаю этот имеил туда же в аноним пользователя я записываю)



Лучше привязывать email только к тесту, а не к анонимному пользователю.

> А если человек создает пару тестов на разных компах, и везде введет 1 имеил для получения ответов. А потом решит зарегистрироваться с этой почтой. Мне ему все тесты, всех анонимных пользователей с подобным имейлом давать? Или только те кто где уникальный ид, такой же.



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

> Если я не буду выводить просто сылку на эти ответы и она будет заковыристой, это и есть ограничение доступа?



Так и надо сделать. Ссылка с каким-то трудноподбираемым токеном, дающая доступ к тесту.
331 1208761
>>199850

Ты вообще заметил правильную вещь. С анонимной регистрацией действительно есть проблемы:

- если человек создал тест, а позже кто-то другой с того же компьютера зарегистрировался, получается, он получит доступ к тому тесту?
- если человек создал тест, получил куку, а потом внезапно залогинился, что делать? Склеивать эту куку и все тесты с нее с его аккаунтом или же "забыть" эту куку и потерять доступ к управлению тестами?

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

Потому мне сейчас пришел в голову другой вариант: при создании теста генерировать специальную куку для доступа к тесту, действительную только для этого теста и никак не мешающую другим тестам и логину/регистрации. Если речь о куках, то это может быть например кука owner[12345]=xxxx или owner_12345=xxxx. Также, если пользователь даст почту, то выслать на нее специальную ссылку, дающую доступ к управлению именно этим тестом (которая как раз будет ставить такую куку на какое-то время).

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

Это не исключает возможности регистрации потом, можно после создания теста показывать ссылку вида /register?from=test_12345, которая привяжет этот тест в аккаунт. Также, можно сделать второй вариант, если человек открывает ссылку из почты для управления тестом и он залогинен, предложить добавить тест в аккаунт.

То есть попробуй продумать все такие сценарии, какие возможны проблемы. Все-таки возможность создавать тесты без регистрации довольно важна и может увеличить число пользователей.

> Если человек создает тест, после введет свой имеил (не регистрируясь, а просто что бы получать статистику, как я понимаю этот имеил туда же в аноним пользователя я записываю)



Лучше привязывать email только к тесту, а не к анонимному пользователю.

> А если человек создает пару тестов на разных компах, и везде введет 1 имеил для получения ответов. А потом решит зарегистрироваться с этой почтой. Мне ему все тесты, всех анонимных пользователей с подобным имейлом давать? Или только те кто где уникальный ид, такой же.



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

> Если я не буду выводить просто сылку на эти ответы и она будет заковыристой, это и есть ограничение доступа?



Так и надо сделать. Ссылка с каким-то трудноподбираемым токеном, дающая доступ к тесту.
image.png59 Кб, 830x100
332 1208949
Есть джва сайта, которые физически лежат в разных директориях на одном и том же сервере, но один из сайтов является поддоменом другого.
То есть расклад такой:

http://domain.ru
http://sub.domain.ru

Иногда при открытии обоих этих сайтов в одном браузере на одном из сайтов возникает ошибка как на пикрелейтед.

Правильно ли я понимаю, что ошибка возникает из-за невозможности перезаписать существующий файл php сессии?
Как сделать так, чтобы при заходе на поддомен всегда создавалась отдельная от основного сайта сессия?
333 1208951
>>199390 (OP)
Опушка, родной ты мой, зашел я тебе передать привет и моё искреннее спасибо.

Начинал учить PHP по твоим тредам еще в 2014, в 2015 вкатился на первую работку, помню еще много тупых вопросов по собесам тут задавал.

Ну а сейчас я уже мидл-хуидл, в Хрякове, с зп в 1500.

В общем, спасибо, опчик, тебе огромное. Добра!
334 1208953
>>208951
Спасибо в кармане не булькает. Задонать ОПу. На сайте есть ссылки.
335 1208955
>>208953

>На сайте есть ссылки.



Где, на каком сайте? Сайт появился? Оп растёт
336 1208961
>>208949
есть сессионная функция которая позволяет задать настройки сессионного кука, и там есть настройка поддомена, погугли
337 1208963
>>208951
А вам там не нужны еще кодеры?
338 1208965
>>208961
Это где делается? В настройках сервера или сайта?
339 1208980
>>208965
В пхп коде. Найди эту функцию в документации в разделе про сессии.
340 1209094
>>208949

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

Исправить это можно попробовать в настройках сессий (в php.ini или через ini_set), задав домен для кук так, чтобы он не включал поддомены. Либо задав разные папки для разных поддоменов.

Настройки сессий описаны в мануале: http://php.net/manual/ru/session.configuration.php
341 1209101
>>208955
>>208953

Никаких таких ссылок нет. Все сайты перечислены в шапке треда.
342 1209145
>>209094

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


Да. Так и есть.

>Исправить это можно попробовать в настройках сессий (в php.ini или через ini_set), задав домен для кук так, чтобы он не включал поддомены.


Я пытаюсь это сделать через .htaccess так как это единственный доступный мне вариант сейчас. Остальные варианты потребуют создания таска для системных администраторов хостинга. Делаю я так
php_value session.cookie_domain domain.ru (без точки перед доменом)
Если я правильно понял, точка перед именем домена означает, что кука будет использоваться на этом домене и на всех его поддоменах. А мне нужно, чтобы она использовалась только на этом домене и на поддоменах была недоступна?
Но в инструментах разработчика кука сессии всё равно устанавливается такая .domain.ru (с точкой)
Не подскажешь, в чём может быть проблема? Если что AllowOverride All установлен и сервер читает .htaccess. Это понятно хотя бы потому, что я настраивал в htaccess переадресацию и она работает.

>Либо задав разные папки для разных поддоменов.


Ты имеешь в виду разные папки для файлов сессий у каждого сайта? А как это сделать?
Спасибо заранее.
Безымянный.png8 Кб, 640x234
344 1209385
Как? Да, я тупой, очень. Но хочется начать развиваться, а споткнулся о самую простую задачу
345 1209395
>>209385

А какую часть задачи ты можешь сделать? Например, вывести

1x1 =
2x2 =
3x3 =
...

можешь?

Для этого просто надо сделать цикл от 1 до 9 и внутри цикла сделать вывод переменной.

Если ты не знаешь, как получить результат умножения, то тут ответ простой: создаешь новую переменную и записываешь в нее шаг цикла, умноженный сам на себя. И затем выводишь эту переменную. Это конечно надо делать внутри цикла.

Спрашивай, если что-то непонятно.
346 1209411
лол, какого это писать на мертвом языке?
347 1209501
Почему scandir () помимо имен файлов возращает ., .. ? Для чего это было придумано?
348 1209510
>>209501
Дебил не знает про указатели на текущую директорию и уровень выше, спешите видеть.
349 1209514
>>209501

Кратко: чтобы перемещаться по файловой системе и чтобы cd .. работало без допиливания операционной системы или команды cd.

scandir() лишь возвращает то же, что возвращает низкоуровневая функция ОС для чтения каталога. В Линуксе каждая директория, даже пустая, содержит 2 записи, с именами . и .., ссылающихся на себя и родительскую директорию.

В этом легко убедиться, выполнив команду ls -la в пустой директории: она покажет эти 2 записи.

Почему так сделано, можно поискать в ответе тут: https://unix.stackexchange.com/a/153640

Создатели unix хотели иметь возможность как-то ссылаться на текущую или родительскую директорию (и писать пути вроде ../file.txt - файл, лежащий на 1 уровень выше текущей директории). Но при этом они не хотели делать специальные правила или синтаксис для этого. Вместо этого они просто решили при создании новой директории помещать в нее эти 2 записи. И точка или 2 точки не имели какого-то особого значения, это просто были имена ссылок.

И юникс тех времен интерпретировал ../file.txt как "найди каталог с именем .. в текущей директории, зайди в него и найди там файл file.txt".

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

Позже это было стандартизовано в стандарте POSIX (который описывает базовые вещи, общие для unix, linux итд): https://superuser.com/questions/804162/why-does-the-root-directory-have-a-reference-to-its-parent/805175#805175

То есть scandir() под линуксом ничего от себя не добавляет: она просто возвращает список файлов, который ей предоставила ОС.

Не знаю, как это работает под Windows, не исключаю, что там такого нет и PHP просто "подсовывает" эти 2 записи в список. Проверить можно в исходном коде PHP на гитхабе.

Интересно, что командами вроде rmdir (удаляет пустой каталог) эти записи удалить нельзя:

$ mkdir -p /tmp/1/2/
$ ls -la /tmp/1/2/
. xxxxxxxxxxxx
.. xxxxxxxxxxxx
$ rmdir /tmp/1/2/.
rmdir: failed to remove ‘/tmp/1/2/.’: Invalid argument
$ rmdir /tmp/1/2/..
rmdir: failed to remove ‘/tmp/1/2/..’: Directory not empty

rmdir использует системный вызов rmdir и в мануале по нему про точку написано отдельно:

http://man7.org/linux/man-pages/man2/rmdir.2.html

> EINVAL pathname has . as last component.



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

Кстати, у объекта-итератора файлов в каталоге есть опция для пропуска этих файлов: http://php.net/manual/en/class.filesystemiterator.php#filesystemiterator.constants
349 1209514
>>209501

Кратко: чтобы перемещаться по файловой системе и чтобы cd .. работало без допиливания операционной системы или команды cd.

scandir() лишь возвращает то же, что возвращает низкоуровневая функция ОС для чтения каталога. В Линуксе каждая директория, даже пустая, содержит 2 записи, с именами . и .., ссылающихся на себя и родительскую директорию.

В этом легко убедиться, выполнив команду ls -la в пустой директории: она покажет эти 2 записи.

Почему так сделано, можно поискать в ответе тут: https://unix.stackexchange.com/a/153640

Создатели unix хотели иметь возможность как-то ссылаться на текущую или родительскую директорию (и писать пути вроде ../file.txt - файл, лежащий на 1 уровень выше текущей директории). Но при этом они не хотели делать специальные правила или синтаксис для этого. Вместо этого они просто решили при создании новой директории помещать в нее эти 2 записи. И точка или 2 точки не имели какого-то особого значения, это просто были имена ссылок.

И юникс тех времен интерпретировал ../file.txt как "найди каталог с именем .. в текущей директории, зайди в него и найди там файл file.txt".

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

Позже это было стандартизовано в стандарте POSIX (который описывает базовые вещи, общие для unix, linux итд): https://superuser.com/questions/804162/why-does-the-root-directory-have-a-reference-to-its-parent/805175#805175

То есть scandir() под линуксом ничего от себя не добавляет: она просто возвращает список файлов, который ей предоставила ОС.

Не знаю, как это работает под Windows, не исключаю, что там такого нет и PHP просто "подсовывает" эти 2 записи в список. Проверить можно в исходном коде PHP на гитхабе.

Интересно, что командами вроде rmdir (удаляет пустой каталог) эти записи удалить нельзя:

$ mkdir -p /tmp/1/2/
$ ls -la /tmp/1/2/
. xxxxxxxxxxxx
.. xxxxxxxxxxxx
$ rmdir /tmp/1/2/.
rmdir: failed to remove ‘/tmp/1/2/.’: Invalid argument
$ rmdir /tmp/1/2/..
rmdir: failed to remove ‘/tmp/1/2/..’: Directory not empty

rmdir использует системный вызов rmdir и в мануале по нему про точку написано отдельно:

http://man7.org/linux/man-pages/man2/rmdir.2.html

> EINVAL pathname has . as last component.



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

Кстати, у объекта-итератора файлов в каталоге есть опция для пропуска этих файлов: http://php.net/manual/en/class.filesystemiterator.php#filesystemiterator.constants
350 1209516
>>209501

Кстати, раз уж зашла речь про файловые системы, расскажу еще про inode. В старых юниксовых файловых системах файлы и их имена были отделены друг от друга.

Была специальная таблица - список записей (inode), в которой каждая inode соответствовала одному файлу. В записи хранился размер файла, сектора, которые он занимал на диске, владелец и права доступа, но не было имени файла. То есть идентификатором любого файла был просто номер inode.

Чтобы у файлов были имена, на диске также имелись каталоги - как минимум 1 корневой каталог и при желании, дополнительные. Каталог был просто списком, который содержал имена и номера inode:

имя | inode
. | 100
.. | 14
file.txt | 123
file.jpg | 123
dir | 145

При этом один и тот же файл мог содержаться в разных каталогах или даже в одном каталоге под разными именами (в примере выше это файл с номером 123). Это называлось "жесткие ссылки", то есть ты мог создать на один файл несколько ссылок в разных каталогах и этот файл был доступен под несколькими именами.

При удалении файла удаляется только ссылка на файл в каталоге. Сам файл удаляется только если на него не осталось ссылок ни в одном каталоге и он не открыт ни одной программой. Это иногда используют для создания "временного" файла, который виден только одной программе и удаляется при ее завершении: программа создает файл, открывает его и удаляет. При этом файл исчезает из каталогов, но не удаляется, пока программа не закроет его или не завершится.

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

Википедия: https://en.wikipedia.org/wiki/Inode

Кроме "жестких" ссылок, в линукс есть "символические ссылки". Они работают по-другому и просто хранят путь к файлу, на который стоит ссылка.

В общем, советую почитать любой учебник по линуксу, там много интересного.
350 1209516
>>209501

Кстати, раз уж зашла речь про файловые системы, расскажу еще про inode. В старых юниксовых файловых системах файлы и их имена были отделены друг от друга.

Была специальная таблица - список записей (inode), в которой каждая inode соответствовала одному файлу. В записи хранился размер файла, сектора, которые он занимал на диске, владелец и права доступа, но не было имени файла. То есть идентификатором любого файла был просто номер inode.

Чтобы у файлов были имена, на диске также имелись каталоги - как минимум 1 корневой каталог и при желании, дополнительные. Каталог был просто списком, который содержал имена и номера inode:

имя | inode
. | 100
.. | 14
file.txt | 123
file.jpg | 123
dir | 145

При этом один и тот же файл мог содержаться в разных каталогах или даже в одном каталоге под разными именами (в примере выше это файл с номером 123). Это называлось "жесткие ссылки", то есть ты мог создать на один файл несколько ссылок в разных каталогах и этот файл был доступен под несколькими именами.

При удалении файла удаляется только ссылка на файл в каталоге. Сам файл удаляется только если на него не осталось ссылок ни в одном каталоге и он не открыт ни одной программой. Это иногда используют для создания "временного" файла, который виден только одной программе и удаляется при ее завершении: программа создает файл, открывает его и удаляет. При этом файл исчезает из каталогов, но не удаляется, пока программа не закроет его или не завершится.

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

Википедия: https://en.wikipedia.org/wiki/Inode

Кроме "жестких" ссылок, в линукс есть "символические ссылки". Они работают по-другому и просто хранят путь к файлу, на который стоит ссылка.

В общем, советую почитать любой учебник по линуксу, там много интересного.
351 1209652
>>209395
Было бы понятнее, если бы ты пикчу с решением прикрепил
WHY.png6 Кб, 372x332
352 1209669
Как можно вызывать метод push, я, вроде, понимаю - конечный элемент является массивом, возвращаемый "результат" функции обратится к ней(?) Но как можно обращаться к свойству length, которого еще нет?
353 1209671
arr.push(...).length
354 1209675
>>209669
ну так перед использованием ты же создаешь массив

>var s = fibonacci_series(n-1)


начальный массив появится когда ты задашь первые два элемента без использования длины.

Ты что скопипастил код не понимая как он работает?
355 1209677
>>209510
Я знал, что это указатели, мне просто интересно, зачем они там, даже на винде.
>>209514
>>209516
Спасибо за ответ!
356 1209715
>>209671
>>209675
Да чёт ступил, "смотрю в книгу, вижу фигу". Надо пойти пробздеться, наверно.
357 1209736
Здравствуйте. Как на php запустить shell-скрипт от рута и возможно ли это вообще сделать нормально? Варианты с гугла либо не помогают, либо делают систему абсолютно беззащитной. Кто-нибудь сталкивался с такой задачей?
358 1209737
Здравствуйте. Как на php запустить shell-скрипт от рута и возможно ли это вообще сделать нормально? Варианты с гугла либо не помогают, либо делают систему абсолютно беззащитной. Кто-нибудь сталкивался с такой задачей?
359 1209754
>>209737
Смотря что за задача. Если модифицировать системные файлы, то тут только «дыра». Если в какой-то определенной папке, то это и как бы «дыра», но в то же время и не совсем «дыра».
360 1209764
>>209754
Главное, чтобы обычный юзер не мог ничего поломать. Вообще можно пользователю www-data в /etc/sudoers сделать nopasswd all? Хотя, у меня функция exec в таком случае все равно не работает.
361 1209804
>>209754
Вот по этой инструкции:

>Открываем файл /etc/sudoers


>Добавляем строку: www-data ALL=NOPASSWD: /path/to/script


>Пробуем выполнить



В exec() работают простые команды типа sudo touch, sudo fdisk -l и т.д. Запись потока в файл через > , например, уже не отрабатывает. Какого, спрашивается, хрена?
362 1209820
>>209804
Так ведь команды перенаправления потока типа >, < etc. это всё инструкции для bash. Ты пробовал выполнять гонять эти команды через bash -c 'твоя команда'?
363 1209823
>>209820
Точно, спасибо. А shell-скрипты так можно запускать?
364 1209950
Вообщем, я решил сделать еще раз студентов, но на этот раз в виде SPA. Как лучше - на чистом js, если это возможно, или на реакте? Я довольно смутно представляю, как SPA делаются.
365 1209956
>>209950

Хорошо, но в чем ты видишь преимущество использования SPA для этой задачи? У меня ощущение, что это только усложнит жизнь, так как надо будет писать 2 приложения (клиентское + серверное API + очень желательно документацию по API).
366 1209992
С каждым днем возникает всё больше архитектурных вопросов.

Допустим у меня есть модель с конфигом, сейчас у меня я так понимаю далеко не лучшим образом работает - ей инжектится модель конфигурации и внутри из неё берутся значения, а наверное лучше все конфигурируемые переменные вынести в поля и конструктор и устанавливать в контейнере при инстанциировании, уже там вытаскивая значения из конфигурации?
Еще не понимаю как лучше делать модели для сущностей занимающих более одной таблицы или имеющих сложные отношения.
Сейчас у меня для минорных сущностей все действия содержатся в модели основной сущности, а перекрестные действия - в той модели к которой они семантически больше подходят (всякие работы с many2many и проч.), выглядит неоптимально.
Еще интересный вопрос который не дает мне наконец то абстрагировать сущности в объекты (по итогу в коде работаю с ассоциативными массивами да) - как поступать когда мне нужна лишь часть данных о сущностях и как правильно организовывать догрузку нужных данных (или догрузка вообще неправильный подход и для всех случаев нужно иметь свой отдельный метод выборки).
Вот думаю почитать как там в доктрине все делается но боюсь не найти нужных ответов, особенно в плане частичной загрузки и еще пары вещей.

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

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

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

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

Но, например, в бутстраппере стоит путь к файлу конфига и от этого уже никак не избавиться, получается тут константу можно не трогать.
366 1209992
С каждым днем возникает всё больше архитектурных вопросов.

Допустим у меня есть модель с конфигом, сейчас у меня я так понимаю далеко не лучшим образом работает - ей инжектится модель конфигурации и внутри из неё берутся значения, а наверное лучше все конфигурируемые переменные вынести в поля и конструктор и устанавливать в контейнере при инстанциировании, уже там вытаскивая значения из конфигурации?
Еще не понимаю как лучше делать модели для сущностей занимающих более одной таблицы или имеющих сложные отношения.
Сейчас у меня для минорных сущностей все действия содержатся в модели основной сущности, а перекрестные действия - в той модели к которой они семантически больше подходят (всякие работы с many2many и проч.), выглядит неоптимально.
Еще интересный вопрос который не дает мне наконец то абстрагировать сущности в объекты (по итогу в коде работаю с ассоциативными массивами да) - как поступать когда мне нужна лишь часть данных о сущностях и как правильно организовывать догрузку нужных данных (или догрузка вообще неправильный подход и для всех случаев нужно иметь свой отдельный метод выборки).
Вот думаю почитать как там в доктрине все делается но боюсь не найти нужных ответов, особенно в плане частичной загрузки и еще пары вещей.

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

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

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

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

Но, например, в бутстраппере стоит путь к файлу конфига и от этого уже никак не избавиться, получается тут константу можно не трогать.
367 1209996
>>209992
И если на всё перечисленное я еще как-то представляю как можно поступить, то как делать работу моделей с мультиязычными данными, когда бывает нужда работать сразу с несколькими языками (в админке например) - уже теряюсь окончательно. Для юзера всё оч легко, т.к. юзаются ассоц. массивы просто беру данные с аффиксом локали и всё, а когда нужно селектить релевантные локали вещи - выборку из базы тоже делаю с афиксом.
Но в итоге в адмике эти методы уже не работают, получается для неё нужно в эти же методы добавлять ручной выбор локали и вызывать дважды, либо делать отдельные методы которые не будут её учитывать - в любом случае выглядит как излишнее жирение.
368 1210033
>>209956

>Хорошо, но в чем ты видишь преимущество использования SPA для этой задачи?


Я просто хотел себе задачу с js-ом и сложным фронтендом, чтобы его изучить лучше. Наверное преимуществ у SPA здесь нет, но это же учебная задача.
369 1210037
>>209992

>Модель с двумя и более таблицами



Делаешь разные модели для каждой таблицы, затем делаешь еще одну модель которая инкапсулирует все остальные. Если грамотно настроить область видимости свойств и методов будет круто.
370 1210039
>>209992

>Процедуры



Я так понимаю здесь идет речь о каких то общих действиях которые не особо относятся к конкретным объектам. В фреймах для этого делают статические классы (в yii2 это хелперы, в laravel это фасады)
371 1210057
>>209996

>то как делать работу моделей с мультиязычными данными, когда бывает нужда работать сразу с несколькими языками (в админке например)



Я делаю базовые абстрактные модели, потом от них модели фронтенда и модели админки, так как поведелние и функционал могут отличаться.
372 1210061
Мне сегодня приснилось, что я делал список студентов, потом выложил его в тред и какой-то анон мне написал что-то вроде: Верстка дивами сажа скрыл. Пиздец, додвачевался блядь.
373 1210065
>>210061
а чем блять верстать? таблицами?
374 1210074
>>210065
А хуй знает, во сне же было.
375 1210087
>>210074
Может ты там вообще всё дивами сверстал.
376 1210106
>>210037

> инкапсулирует все остальные


Но тогда получится же просто свалка из функций многие из которых между собой не связаны?

> В фреймах для этого делают статические классы


Т.е. по сути ничего плохого в этом нет

> Я делаю базовые абстрактные модели, потом от них модели фронтенда и модели админки


Надо подумать о таком варианте, спасибо.
377 1210145
>>210106
но фреймверки обычно имеют механизмы свойств, например в yii2 методы getMyProperty setMyProperty работают как свойство myProperty, уверен в ларавеле тоже есть чтото подобное
378 1210146
>>210106

>Но тогда получится же просто свалка из функций


>>210145
379 1210170
Двощ, есть две таблицы - subscribers и tariffs. У каждого subscriber есть выбранный tariff_id. Надо вывести, сколько подписчиков на каждом тарифе.
Написал такое:

[code]
SELECT t.name,
COUNT(s.id) AS subscribers_qty
FROM tariffs AS t,
subscribers AS s
WHERE t.id = s.tariff_id
GROUP BY t.name
ORDER BY t.price;
[/code]

Проблема в том, что этот запрос не показывает тарифы с нулем подписчиков, а надо. Я понимаю, что если никто не выбрал такой тариф, то и join c такими строками не происходит. А как по-другому тогда?
380 1210171
>>209516
В старых?
У меня так на VPS с фряхой 11 иноды кончились, когда я нагенерировал малюсеньких превьюшек целую гору.
381 1210172
>>210170
Тебе нужно написать явно LEFT JOIN
тогда получишь все тарифы даже те у которых нет подписчиков.

Могу быть не прав но твой запрос неявно использует INNER JOIN где все наоборот.
382 1210173
>>208951
На каком этапе изучения начал искать работу?
383 1210176
>>208161
Выполни этот код:

$x = 'Alice';

true || $x = 'Bob';
echo 'Hello, ' . $x . '<br>';

true && $x = 'Bob';
echo 'Hello, ' . $x . '<br>';

Затем почитай мануалы, чтобы понять почему код ведет себя по разному и больше не позорься.
384 1210177
>>210176
Ять! Не тот пример придумал.

Вот смотри на такой код:
$x = 'Alice' && false;
echo 'Hello by _&&_ ' . $x . '<br>';

$x = 'Alice' and false;
echo 'Hello by _and_ ' . $x . '<br>';

Он, конечно, выглядит экзотично, но при формировании сложных условий в ифах, не зная этой механики, можешь упереться в код, который не работает по непонятным тебе причинам. Хотя в некоторых коллективах за присвоение внутри условия могут оторвать руки.
385 1210186
Офицальный sql-тред с концами пропали?
Ладно, не важно. Спрошу тут.
Собираюсь вкатиться в sql по книге SQL за 10 минут. Какие подводные?
386 1210187
>>210186
Тебе что, жалко 10 минут потратить и узнать?
387 1210189
>>210187
На самом деле эту книгу не прочитать за 10 минут
15268838768720.jpg18 Кб, 604x438
388 1210193
Хочу пересесть с Битрикса(5 лет опыта в офисе/веб-студиях и удалёнка + фриланс) на Laravel и делать на нём мелкие сайты клиентов. Дальше планирую отказаться от местных клиентов и вкатиться на Upwork.
Сейчас беру по 1000/час и это по сути потолок для моего уровня и уровня моих клиентов, дальше только галерный(не свободный) вид работы - без продления дедлайнов, без ошибок и т.д.. Хочется большей з/п при таком же уровне свобод.

Какие подводные камни?
389 1210204
>>210193
вроде взрослый дядя, а с такими вопросами приходишь
390 1210207
>>210204
Треда про UpWork давно не нахожу, интересно мнение тех, кто там работает именно по Laravel, т.к. везде были восторженные отзывы всяких Нодо/Реакто-пидоров.
rcMERwGo3UI.jpg131 Кб, 960x960
391 1210225
>>210172
Ух ты, работает, спасибо!
392 1210239
>>210170
У меня еще вопрос про нормализацию.
Подписчик может быть физлицо или юрлицо. Тарифы тоже для физлиц и юрлиц.
Избыточно ли иметь ENUM колонку subscriber_type и в таблице subscribers, и в tariffs? Чисто теоретически сейчас тип клиента можно узнать по выбранному тарифу, но мало ли что, вдруг в будущем можно будет не выбирать тариф, например.
393 1210255
>>210193

>на Laravel и делать на нём мелкие сайты


Мелкие сайты лучше и проще делать на микрофреймворках - меньше зависимостей, больше свободы.
394 1210256
подскажите нубу, если в базе хранятся цифровые значения, но из значения на страницу нужно выводить только кол-во миллионов и через запятую кол-во десятков тысяч, отбрасывая "хвост" которые менее 10 тысяч ( т.е цифра из базы 9 678 300 , должна выводится на страницу как 9,67 ) - как это сделать?
395 1210262
>>210256
три секунды в гугле
https:// www.w3schools.com/sql/func_mysql_round.asp
396 1210340
>>210239
В этой ситуации делаешь ENUM колонку. В дальнейшем когда у разных типов будут появляться рахные поля и связи просто сделаешь еще отдельные таблицвы, одну с доп инфой для физлиц другую для юрлиц.
397 1210349
>>210189
Наверное, не очень хорошая книга, если врет уже с обложки.
398 1210381
>>210177
Ну во первых, то что ты нарисовал, в реальной жизни бывает? Во вторых, в оф. документации написано, что эти операторы различаются приоритетом, но примера различий не приведено. В третьих, тебя лично никто не спрашивал, не думаю, что ответы в таком тоне кому - то помогут
399 1210397
>>210255
Да мне бы руку набить, посмотреть что можно и нельзя.
А Ларавель разве такой большой?
400 1210399
>>210397

>мне бы ебало набить


Поправил.
мимо преподаватель
401 1210410
>>210397
Начинать лучше с yii2
402 1210454
>>210340
Не, я имел в виду не грешно ли такое дублирование, когда и в таблице subscribers написано, что у нас subscriber_type юрлицо, и в таблице tariffs тоже. Сейчас это точно излишество, но в будущем может пригодиться.
403 1210456
>>210410
А зачем мне yii2, если я не хочу учить очередной проходняк, а потом переучиваться на Laravel?
>>210399
Сам учитель кстати по информатике, иди нахуй.
404 1210471
>>210454
типо тариф только для юрлиц?

тогда это нормально, одно поле говорит что за подписчик, другое что за тариф. У них может отличаться набор значений, например тариф может быть для всех.
405 1210475
>>210456
Блять и я тоже)
406 1210648
Давайте не устраивать тут чат и обсуждать на полтреда, какой фреймворк лучше. Написали пару сообщений и хватит.

>>210239

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

Или представь, что появится тариф, доступный любым видам клиентов.

Все-таки тип клиента - это свойство клиента и должно быть указано в его таблице.

>>210256

Погугли функции PHP round() и number_format().

>>210255

Если ты делаешь сайты на потоке, то большой фреймворк + свои библиотеки может быть лучше, так как там не надо например тратить время на интеграцию Доктрины, а достаточно пару опций в конфиг дописать.

>>208161

Используй, если тебе удобнее. Но помни, что у них другие приоритеты ( мануал http://php.net/manual/ru/language.operators.logical.php ) и может понадобиться ставить скобки.

>>210176

Не надо так писать, "не позорься". Ничего позорного, чтобы задать вопрос, нету.

Писать такой код точно не стоит из-за его непонятности: true || $x = 'Bob';

> $x = 'Alice' and false;



Это конечно уже косяк в проектировании PHP, что такой код воспринимается как ($x = 'Alice') and false. Ужасный стиль написания, не стоит так писать.
406 1210648
Давайте не устраивать тут чат и обсуждать на полтреда, какой фреймворк лучше. Написали пару сообщений и хватит.

>>210239

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

Или представь, что появится тариф, доступный любым видам клиентов.

Все-таки тип клиента - это свойство клиента и должно быть указано в его таблице.

>>210256

Погугли функции PHP round() и number_format().

>>210255

Если ты делаешь сайты на потоке, то большой фреймворк + свои библиотеки может быть лучше, так как там не надо например тратить время на интеграцию Доктрины, а достаточно пару опций в конфиг дописать.

>>208161

Используй, если тебе удобнее. Но помни, что у них другие приоритеты ( мануал http://php.net/manual/ru/language.operators.logical.php ) и может понадобиться ставить скобки.

>>210176

Не надо так писать, "не позорься". Ничего позорного, чтобы задать вопрос, нету.

Писать такой код точно не стоит из-за его непонятности: true || $x = 'Bob';

> $x = 'Alice' and false;



Это конечно уже косяк в проектировании PHP, что такой код воспринимается как ($x = 'Alice') and false. Ужасный стиль написания, не стоит так писать.
407 1210650
>>210170

SELECT FROM tariff LEFT JOIN subsc ON ... GROUP BY t

Надо использовать LEFT JOIN вместо INNER JOIN, как у тебя.

>>209992

На всякий случай напишу, что у меня есть урок про паттерны работы с БД: https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md

> Допустим у меня есть модель с конфигом, сейчас у меня я так понимаю далеко не лучшим образом работает - ей инжектится модель конфигурации и внутри из неё берутся значения, а наверное лучше все конфигурируемые переменные вынести в поля и конструктор и устанавливать в контейнере при инстанциировании, уже там вытаскивая значения из конфигурации?



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

> Еще не понимаю как лучше делать модели для сущностей занимающих более одной таблицы или имеющих сложные отношения.



Тут есть варианты. Допустим, у нас есть Пост, с Автором и Комментариями. Вот что можно сделать:

- сделать у Поста свойства Автор и Комментарии, и при загрузке из БД Постов подгружать в них Авторов и все Комментарии. Это будет затратно по ресурсам, так как у Комментариев могут быть например Автор, Лайки, у Автора тоже какие-то связи итд.
- сделать то же самое, но при загрузке Постов не подгружать в них связанные сущности, а вставлять вместо них прокси-объекты, которые не содержат данных, а подгружают их при первом обращении к объекту. Ну то есть они работают так:

$user = $db->loadUser($userId);
$userProxy = new UserProxy($userId, $db);
echo $user->getId(); // 1234
echo $userProxy->getId(); // 1234
echo $user->getName(); // Иван
echo $userProxy->getName(); // в этом месте прокси подгружает объект User из БД и передает вызов ему, возвращая "Иван"

Чтобы прокси можно было использовать вместо реальных объектов и они проходили тайп-хинты, они должны наследоваться от них.

Это стоит делать только из желания разобраться, если такого желания нет, то проще взять доктрину

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

Что точно не стоит делать - это делать так, что в Посте может быть объект Автор, а может не быть. Это будет создавать ужасную путаницу и будет постоянным источником ошибок.

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



По моему, мы разные вещи называем моделями. Я называю моделью Пользователя объект, который представляет одного пользователя и содержит информацию о нем. А не класс, который позволяет искать пользователей в БД, добавлять и тд.

> как поступать когда мне нужна лишь часть данных о сущностях и как правильно организовывать догрузку нужных данных (или догрузка вообще неправильный подход и для всех случаев нужно иметь свой отдельный метод выборки).



Есть такие варианты:

- сделать поля специальными объектами, которые загружают данные только при обращении к ним:

$post->body = new LazyText($postId, 'body', $db);
echo $post->body->getValue();

- сделать этот функционал на уровне класса модели:

public function getName()
{
// обычное поле
return $this->name;
}

public function getText()
{
// ленивое
return $this->lazyLoad('text');
}

- разбить сущность на несколько объектов в сочетании с ленивой загрузкой:

public function getName()
{
// обычное поле
return $this->name;
}

public function getText()
{
// ленивое
return $this->postDetails->getText();
}

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



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

> Например, в модель енъекцируются зависимости от бд и конфигурации или еще чего-то - это всё абстрагировано через интерфейсы. А саму модель? Ну вроде нет.



Трудно понять этот вопрос без примера кода.

> Еще байда с контроллерами, сейчас у меня все контроллеры - маленькие функции вызывающиеся по роутам, но в фреймворках я видел что их выносят в классы



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

> Подход с функциями у меня отлично работал до тех пор пока не нужно было начать выводить правильные хттп коды и заголовки для разных роутов



Вообще, это не проблема при использовании объекта Response:

$response->setCode(204);
$response->headers->add('x-header', '12345');
return $response;

Или проблема в чем-то другом?

> Опять же выделив их в классы можно будет тогда их автоматически тестировать.



По идее тестировать можно и коллбеки в фреймворке, если они возвращают объект Response.

> Затем, у меня есть такая херня как процедуры - тупо завернутые в классы функции которые выполняют разные действия с участием моделей и других систем, там же идут запросы к сторонним сервисам например итд. Выглядит тоже херово



Стоит сделать сервисы.

> Еще постоянный вопрос стоит на какой стадии можно использовать константы,



Чаще всего они используются для обозначения вариантов выбора:

class Order
{
// типы доставки
const DELIVERY_POST = 'post';
const DELIVERY_PICKUP = 'pickup';
const DELIVERY_COURIER = 'courier';
}

Иногда еще для кодов ошибок: ERROR_ORDER_NOT_FOUND. Иногда для каких-то реальных констант: GRAVITY_EARTH = 9.81

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



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

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

> Нужно либо делать модель для работы с шаблонами



Ты по моему все классы почему-то называешь моделями. Модель - это объект, который является моделью чего-то. Например, объект, который в программе является моделью реального товара.

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



Зачем усложнять? В конфиге указывают только то, что пользователь может поменять. Если пользователю не надо менять имя шаблона, то не надо зря загромождать конфиг. Это плохо, чем больше опций, тем сложнее разбираться.

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

В конфиг выносят только то, что надо менять пользователям (то есть тем, кто устанавливает твое приложение). Чтобы им не надо было лезть в код. Если твои пользователи не просят возможность что-то поменять, то это не должно быть в конфиге.

> Но, например, в бутстраппере стоит путь к файлу конфига и от этого уже никак не избавиться, получается тут константу можно не трогать.



Тут не нужна константа. Просто прописать имя файла и все.
407 1210650
>>210170

SELECT FROM tariff LEFT JOIN subsc ON ... GROUP BY t

Надо использовать LEFT JOIN вместо INNER JOIN, как у тебя.

>>209992

На всякий случай напишу, что у меня есть урок про паттерны работы с БД: https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md

> Допустим у меня есть модель с конфигом, сейчас у меня я так понимаю далеко не лучшим образом работает - ей инжектится модель конфигурации и внутри из неё берутся значения, а наверное лучше все конфигурируемые переменные вынести в поля и конструктор и устанавливать в контейнере при инстанциировании, уже там вытаскивая значения из конфигурации?



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

> Еще не понимаю как лучше делать модели для сущностей занимающих более одной таблицы или имеющих сложные отношения.



Тут есть варианты. Допустим, у нас есть Пост, с Автором и Комментариями. Вот что можно сделать:

- сделать у Поста свойства Автор и Комментарии, и при загрузке из БД Постов подгружать в них Авторов и все Комментарии. Это будет затратно по ресурсам, так как у Комментариев могут быть например Автор, Лайки, у Автора тоже какие-то связи итд.
- сделать то же самое, но при загрузке Постов не подгружать в них связанные сущности, а вставлять вместо них прокси-объекты, которые не содержат данных, а подгружают их при первом обращении к объекту. Ну то есть они работают так:

$user = $db->loadUser($userId);
$userProxy = new UserProxy($userId, $db);
echo $user->getId(); // 1234
echo $userProxy->getId(); // 1234
echo $user->getName(); // Иван
echo $userProxy->getName(); // в этом месте прокси подгружает объект User из БД и передает вызов ему, возвращая "Иван"

Чтобы прокси можно было использовать вместо реальных объектов и они проходили тайп-хинты, они должны наследоваться от них.

Это стоит делать только из желания разобраться, если такого желания нет, то проще взять доктрину

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

Что точно не стоит делать - это делать так, что в Посте может быть объект Автор, а может не быть. Это будет создавать ужасную путаницу и будет постоянным источником ошибок.

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



По моему, мы разные вещи называем моделями. Я называю моделью Пользователя объект, который представляет одного пользователя и содержит информацию о нем. А не класс, который позволяет искать пользователей в БД, добавлять и тд.

> как поступать когда мне нужна лишь часть данных о сущностях и как правильно организовывать догрузку нужных данных (или догрузка вообще неправильный подход и для всех случаев нужно иметь свой отдельный метод выборки).



Есть такие варианты:

- сделать поля специальными объектами, которые загружают данные только при обращении к ним:

$post->body = new LazyText($postId, 'body', $db);
echo $post->body->getValue();

- сделать этот функционал на уровне класса модели:

public function getName()
{
// обычное поле
return $this->name;
}

public function getText()
{
// ленивое
return $this->lazyLoad('text');
}

- разбить сущность на несколько объектов в сочетании с ленивой загрузкой:

public function getName()
{
// обычное поле
return $this->name;
}

public function getText()
{
// ленивое
return $this->postDetails->getText();
}

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



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

> Например, в модель енъекцируются зависимости от бд и конфигурации или еще чего-то - это всё абстрагировано через интерфейсы. А саму модель? Ну вроде нет.



Трудно понять этот вопрос без примера кода.

> Еще байда с контроллерами, сейчас у меня все контроллеры - маленькие функции вызывающиеся по роутам, но в фреймворках я видел что их выносят в классы



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

> Подход с функциями у меня отлично работал до тех пор пока не нужно было начать выводить правильные хттп коды и заголовки для разных роутов



Вообще, это не проблема при использовании объекта Response:

$response->setCode(204);
$response->headers->add('x-header', '12345');
return $response;

Или проблема в чем-то другом?

> Опять же выделив их в классы можно будет тогда их автоматически тестировать.



По идее тестировать можно и коллбеки в фреймворке, если они возвращают объект Response.

> Затем, у меня есть такая херня как процедуры - тупо завернутые в классы функции которые выполняют разные действия с участием моделей и других систем, там же идут запросы к сторонним сервисам например итд. Выглядит тоже херово



Стоит сделать сервисы.

> Еще постоянный вопрос стоит на какой стадии можно использовать константы,



Чаще всего они используются для обозначения вариантов выбора:

class Order
{
// типы доставки
const DELIVERY_POST = 'post';
const DELIVERY_PICKUP = 'pickup';
const DELIVERY_COURIER = 'courier';
}

Иногда еще для кодов ошибок: ERROR_ORDER_NOT_FOUND. Иногда для каких-то реальных констант: GRAVITY_EARTH = 9.81

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



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

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

> Нужно либо делать модель для работы с шаблонами



Ты по моему все классы почему-то называешь моделями. Модель - это объект, который является моделью чего-то. Например, объект, который в программе является моделью реального товара.

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



Зачем усложнять? В конфиге указывают только то, что пользователь может поменять. Если пользователю не надо менять имя шаблона, то не надо зря загромождать конфиг. Это плохо, чем больше опций, тем сложнее разбираться.

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

В конфиг выносят только то, что надо менять пользователям (то есть тем, кто устанавливает твое приложение). Чтобы им не надо было лезть в код. Если твои пользователи не просят возможность что-то поменять, то это не должно быть в конфиге.

> Но, например, в бутстраппере стоит путь к файлу конфига и от этого уже никак не избавиться, получается тут константу можно не трогать.



Тут не нужна константа. Просто прописать имя файла и все.
408 1210651
>>209996

Либо делается по несколько копий каждого поля (titleRu, titleEn, titleJa), либо делается отдельная таблица с локализованными данными вида:

ид поста | язык | название | текст

1 | ru | Привет мир | ...
1 | ja | こんいちは 世界 | ...

Выбор при этом можно сделать за счет методов, в первом варианте:

public function getPostTitle($lang)
{
if ($lang == 'ru') {
return $this->titleRu;
} elseif ($lang == 'ja') {
return $this->titleJa;
} else {
throw ...;
}
}

Во втором варианте:

public function getPostTitle()
{
// язык в localizedData выбирается в момент загрузки сущности
return $this->localizedData->getTitle();
}

В админке выводишь либо несколько полей, либо делаешь в форме несколько вкладок с языками.

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



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

>>210057

ты по моему тоже делаешь ошибку, когда называешь "моделью" объект, который не представляет (не является моделью) какую-то одну сущность.
408 1210651
>>209996

Либо делается по несколько копий каждого поля (titleRu, titleEn, titleJa), либо делается отдельная таблица с локализованными данными вида:

ид поста | язык | название | текст

1 | ru | Привет мир | ...
1 | ja | こんいちは 世界 | ...

Выбор при этом можно сделать за счет методов, в первом варианте:

public function getPostTitle($lang)
{
if ($lang == 'ru') {
return $this->titleRu;
} elseif ($lang == 'ja') {
return $this->titleJa;
} else {
throw ...;
}
}

Во втором варианте:

public function getPostTitle()
{
// язык в localizedData выбирается в момент загрузки сущности
return $this->localizedData->getTitle();
}

В админке выводишь либо несколько полей, либо делаешь в форме несколько вкладок с языками.

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



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

>>210057

ты по моему тоже делаешь ошибку, когда называешь "моделью" объект, который не представляет (не является моделью) какую-то одну сущность.
409 1210653
>>210039

Статические классы бывают разные. Если простым методам не нужен this - это Utility Class ( https://en.wikipedia.org/wiki/Helper_class )

Некоторым они не нравятся:

- http://www.ralin.net/blog/oop-anti-patterns-utility-or-helper-classes.html
- https://www.yegor256.com/2014/05/05/oop-alternative-to-utility-classes.html

То, что в Ларавеле - это просто копия идеи с Ruby on Rails, где полфреймворка сделано на статических методах. Не очень хорошо, у меня описано почему: https://github.com/codedokode/pasta/blob/master/arch/di.md .

>>210033

Хорошо, тогда попробуй сделать. Тебе надо сделать клиентское приложение с использованием одной их технологий:

- React (+ опционально Redux)
- Vue
- Angular (это фреймворк, а не библиотека для view)
- Knockout

Ты можешь почитать общий обзор вариантов реализации MVC на клиенте тут: https://github.com/codedokode/pasta/blob/master/js/minesweeper-mvc.md

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

Также, тебе надо будет спроектирвоать серверное API (я советую описать его с помощью файла YAML в формате Swagger 2.0/OpenAPI 3.0. Swagger позволяет генерировать такую документацию с возможностью отправки запросов прямо из нее: http://petstore.swagger.io/ . А также там есть такой удобный редактор для просмотра результата сразу: https://editor.swagger.io/ )

Вот первый найденный в Гугле русскоязычный пример сделанной на Swagger документации: https://www.1gb.ru/api-doc/

Вот пример подробного описания API, не на Swagger, просто для сравнения: https://tech.yandex.ru/disk/api/concepts/about-docpage/

После проектирования API его надо реализовать, например, на микрофреймворке вроде Slim.

Вообще, задача про студентов слишком простая для SPA. Я бы советовал взять что-нибудь посложнее, или TestHub (сложное редактирование тестов - самое то для SPA) или адскую задачу на SPA из оп-поста или придумать какую-то свою идею. У тебя есть идея какого-то приложения, которое хотелось бы сделать? Управление чем-нибудь, редактирование чего-нибудь, планирование или организация чего-нибудь. Ну или можешь сделать клон твиттера или инстаграма, например. Или защищенный мессенджер. У нас тут есть someApprentice, который его неспешно пилит.
409 1210653
>>210039

Статические классы бывают разные. Если простым методам не нужен this - это Utility Class ( https://en.wikipedia.org/wiki/Helper_class )

Некоторым они не нравятся:

- http://www.ralin.net/blog/oop-anti-patterns-utility-or-helper-classes.html
- https://www.yegor256.com/2014/05/05/oop-alternative-to-utility-classes.html

То, что в Ларавеле - это просто копия идеи с Ruby on Rails, где полфреймворка сделано на статических методах. Не очень хорошо, у меня описано почему: https://github.com/codedokode/pasta/blob/master/arch/di.md .

>>210033

Хорошо, тогда попробуй сделать. Тебе надо сделать клиентское приложение с использованием одной их технологий:

- React (+ опционально Redux)
- Vue
- Angular (это фреймворк, а не библиотека для view)
- Knockout

Ты можешь почитать общий обзор вариантов реализации MVC на клиенте тут: https://github.com/codedokode/pasta/blob/master/js/minesweeper-mvc.md

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

Также, тебе надо будет спроектирвоать серверное API (я советую описать его с помощью файла YAML в формате Swagger 2.0/OpenAPI 3.0. Swagger позволяет генерировать такую документацию с возможностью отправки запросов прямо из нее: http://petstore.swagger.io/ . А также там есть такой удобный редактор для просмотра результата сразу: https://editor.swagger.io/ )

Вот первый найденный в Гугле русскоязычный пример сделанной на Swagger документации: https://www.1gb.ru/api-doc/

Вот пример подробного описания API, не на Swagger, просто для сравнения: https://tech.yandex.ru/disk/api/concepts/about-docpage/

После проектирования API его надо реализовать, например, на микрофреймворке вроде Slim.

Вообще, задача про студентов слишком простая для SPA. Я бы советовал взять что-нибудь посложнее, или TestHub (сложное редактирование тестов - самое то для SPA) или адскую задачу на SPA из оп-поста или придумать какую-то свою идею. У тебя есть идея какого-то приложения, которое хотелось бы сделать? Управление чем-нибудь, редактирование чего-нибудь, планирование или организация чего-нибудь. Ну или можешь сделать клон твиттера или инстаграма, например. Или защищенный мессенджер. У нас тут есть someApprentice, который его неспешно пилит.
410 1210654
>>209737

Прописываешь путь к скрипту в /etc/sudoers. Почитай мануал по нему. Ну например, если ты хочешь разрешить пользователям перезапускать нгинкс, то делаешь скрипт /usr/local/bin/restart-nginx и прописыаешь разрешение на его запуск от sudo.

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

>>209764

Тогда www-data сможет запускать что угодно от рута. Надо вписать конкретные команды. Почитай мануал по sudoers.

>>209804

Впиши перенаправление в скрипт и дай права на запуск скрипта.

>>209820

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

>>209652

Мы не даем решения, но отвечаем на вопросы, если что-то непонятно.
411 1210659
>>208119

Тут есть разны варианты. Например: не указывать число страниц, а дать только ссылки первая/предыдущая/следующая/последняя. Или использовать фичи MySQL вроде SQL_COUNT_ROWS.

Также, можно допилить код, чтобы выполнение 2 запросов не вызывало проблем. Заодно при подсчете можно убрать часть джойнов, сортировок и тд.
412 1210662
>>210654
Странный ты человек, отвечаешь на уже отвеченные вопросы, наверное чтобы простыни выглядели больше а ты умнее.
413 1210679
Опчик! Помоги! Есть ли возможность ебашить условную функцию проверки по времени. Типа если сейчас меньше 5 вечера, то возвращает 1, если больше, то возвращает 0? Вне зависимости от даты, то есть в любой день.
15261580096422.jpg508 Кб, 2448x3264
414 1210690
>>210471
>>210648
Спасибо!

Я воткнулся в новую проблему.
К таблице subscribers у меня еще есть таблицы subscriber_phones и subscriber_links. В них хранятся контактные телефоны и ссылки на социальные сети.
В запросе я все это LEFT JOIN, и при трех телефонах и трех ссылках, я получаю 9 записей одного подписчика, в каждой разное сочетание телефона и ссылки. Я понимаю, что mysql не может вернуть мне вложенные таблицы.
Что делать? Мудрить обработку одинаковых записей? Не выеживаться и просто посылать отдельные запросы в БД?
Использую PDO. На выходе хочу получить массив параметров подписчика и вложенные массивы с телефонами и ссылками.
415 1210694
>>210690
получаешь subscribers, собираешь их id, получаешь разом все телефоны и потом все ссылки WHERE subscriber_id IN (....)
416 1210695
>>210694
А как потом это обработать?
Пройтись по телефонам и ссылкам foreach и положить их в subscribers?
417 1210696
>>210695

>положить их в subscribers


Внутрь массива нужного подписчика, я хотел сказать.
418 1210712
>>210696
ага, в любом случае нужно пройтись по массивам после получения данных. В первом случае у тебя много лишних повторяющихся значений во втором больше запросов.
419 1210739
>>210650
Да небольшая путаница понятий вышла, судя по всему то что я называл моделями вернее называть сервисами. Именно моделей у меня по итогу вообще до сих пор нет (!).
Под константами имелись ввиду не `const` а, ну, кароче захардкоденые значения. Почему-то кажется в корне неверным внутри сервисов хардкодить пути к каким-то файлам и тому подобное.

Про догрузку полей я имею ввиду сущности которые именно сами размазаны по разным таблицам (может, все 1:1 поля лучше слить в одну? `денормализовать` типа). Суть в том что там довольно много может получаться данных и я так думал что правильнее за раз брать только те что нужны в конкретном случае.

> прокси объекты, ленивая загрузка


Я понял. Для начала конечно придется сделать модели. Но меня беспокоит вопрос об эффективности этого. Вот допустим есть сущностей, я их для отображения страницы беру по 100 штук, а потом к ним через 1:many добираются еще другие. В случае ленивой загрузки я получу сверху еще сотню запросов к бд, тогда как сейчас я беру сразу все согласно их айди и потом в коде распределяю.

Т.е. как второй вариант который ты описал (ну только без собственно моделей).

Я думал уже делать объект для ответа. Проблема контроллеров как функций вместо объектов, ну вобщем не проблема даже наверное. Надо еще подумать чтобы сформулировать.

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

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

Насчет перевода, да там и так несколько полей под языки. Вообще так-то нет проблем с реализацией чеголибо, просто выглядит неказисто как-то.

Спасибо за ответ!
419 1210739
>>210650
Да небольшая путаница понятий вышла, судя по всему то что я называл моделями вернее называть сервисами. Именно моделей у меня по итогу вообще до сих пор нет (!).
Под константами имелись ввиду не `const` а, ну, кароче захардкоденые значения. Почему-то кажется в корне неверным внутри сервисов хардкодить пути к каким-то файлам и тому подобное.

Про догрузку полей я имею ввиду сущности которые именно сами размазаны по разным таблицам (может, все 1:1 поля лучше слить в одну? `денормализовать` типа). Суть в том что там довольно много может получаться данных и я так думал что правильнее за раз брать только те что нужны в конкретном случае.

> прокси объекты, ленивая загрузка


Я понял. Для начала конечно придется сделать модели. Но меня беспокоит вопрос об эффективности этого. Вот допустим есть сущностей, я их для отображения страницы беру по 100 штук, а потом к ним через 1:many добираются еще другие. В случае ленивой загрузки я получу сверху еще сотню запросов к бд, тогда как сейчас я беру сразу все согласно их айди и потом в коде распределяю.

Т.е. как второй вариант который ты описал (ну только без собственно моделей).

Я думал уже делать объект для ответа. Проблема контроллеров как функций вместо объектов, ну вобщем не проблема даже наверное. Надо еще подумать чтобы сформулировать.

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

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

Насчет перевода, да там и так несколько полей под языки. Вообще так-то нет проблем с реализацией чеголибо, просто выглядит неказисто как-то.

Спасибо за ответ!
420 1210741
>>210739
Даже не сервисами, а гейтами (ну сервисы там тоже есть)
421 1210752
>>210712
Понял, спасибо!
Снимок.PNG76 Кб, 1892x235
422 1210956
нашел такой тред на /b
давайте поможем парню!
https://2ch.hk/b/res/177779333.html (М)
423 1210971
>>210956
Это жир, довер
424 1211018
>>210971
Так это ты сейчас повелся на жир, дурочок.
425 1211093
>>210225
Хуя у нее плечи
426 1211341
>>211093
Это просто ракурс такой.
427 1211450
Кто-нибудь работал с google sheets api?
Нужна помощь в том, что бы писать инфу в разные листы.

Пока научился писать в 1 лист. Но например мне надо писать в разные листы. Где это выставлять? И как проверить есть ли условынй "Лист1" или "Лист2" в нашем документе, перед тем как пытаться в него писать.
428 1211524
>>199390 (OP)
Почему в учебники для решения задачи "Сумма прописью" вы не рекомендуете использовать функцию strlen? Она считает вполне правильно и это удобно, зачем мне писать свой велосипед?

"Некоторые делают ошибку, пытаясь работать с числами строковыми функциями вроде mb_substr() или mb_strlen(). Это неправильно."

Заранее спасибо!
429 1211530
>>211524

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

echo 123456789012345 . "\n"; // 1.2345678901234E+14

Если ты от такого числа попробуешь взять первые 3 символа, то получишь 1.2, а не 123.

Безопаснее работать с числами математическими методами.

Опять же, если тебе надо найти последнюю цифру, и у тебя случайно оказалось немного дробное число, то строковые методы тебя подведут:

echo (12.000000009 % 10) . "\n" ; // 2

А если использовать строковые методы, то последняя цифра будет 9.
430 1211535
>>211530
Понятно, пасиба!

Еще вопрос. Можно ли для подчета количества чисел использовать подобную конструкцию?

$count = preg_match_all('/\\d/', $number);
431 1211538
>>211535

Конечно, нет, по тем же причинам. Если число целое, то проще всего посчитать количество цифр с помощью десятичного логарифма.

Логарифм - это операция, обратная возведению в степень. Например, 10 в 3 степени = 10 x 10 x 10 = 1000. А логарифм(x) позволяет узнать, в какую степень надо возвести 10, чтобы получить x. Потому log10(1000) = 3.

Вот еще пара примеров:

log10(999) = 2.99956549
log10(1001) = 3.00043408

log10(99) = 1.9956351
log10(100) = 2
log10(101) = 2.00432137

В общем, поломай голову, как это использовать. Логарифм можно вычислить, если вбить выражение вроде log10(100) в Гугл.
432 1211539
>>211538
Спасибо, постараюсь решить.
433 1211592
>>210653

>Вообще, задача про студентов слишком простая для SPA. Я бы советовал взять что-нибудь посложнее, или TestHub (сложное редактирование тестов - самое то для SPA) или адскую задачу на SPA из оп-поста или придумать какую-то свою идею. У тебя есть идея какого-то приложения, которое хотелось бы сделать?


Идей много, но я плохо js знаю, поэтому думаю мне spa студентов на данный момент хватит. СДобра за ответ!
077c61cdde258e7255b453ecd222a6d0.jpg46 Кб, 710x492
434 1211728
Утро неслышно ступает по коду,
И за компом
Безмятежная спишь ты
PHP улыбаясь в рассветном блаженстве
Самая лучшая в мире программа
ПУСТЬ ТЕБЕ ПРИСНИТСЯ
ЭЛЕМЕНТ В МАССИВЕ
В ЦИКЛЕ ИЛИ В ФАЙЛЕ
ЛАСКОВЫЙ ОБЪЕКТ
ИЛИ В ПЕРВОМ СКРИПТЕ
ЭХО У ЗАПРОСА
Только, чтобы вместе,
Был у нас с деплой
Capture.JPG20 Кб, 588x418
435 1211781
Опушек, возникла острая необходимость использования WebSQL. Что ты можешь рассказать про нее в 2к18? Не нашел пока никакой вразумительной инфы, где-то даже писали, что поддержка закрылась за ненадобностью, но я вижу ее в инструментах разработчика значит не мертво. Или?
436 1211831
Спецназовцы, у меня возникла проблема, я должен отправить запрос в базу данных, но искомый элемент должен быть в кавычках, в любых, как сформировать правильный запрос в таблицу? или просто добавить кавычки в переменную? И то и другое я не умею, подскажите!
Запрос у меня такой:'SELECT COUNT (*) FROM students WHERE email = :email
естественно делаю через холдеры и не могу понять как мне экранировать эти долбанные ковычки, помогите знатоки
437 1211846
>>211831
backslash
438 1211866
Поясните за видимость файлов лежащих в корне? Например если я сложу рядом с index.php условный db_config.php, то могут ли его как-то скачать, прочитать, заинклудить в конце концов? Лучше в папочку на уровень ниже хотя бы складывать?
439 1211892
>>211866
не могут, если ты не сделаешь ничего в эхе
если никакие переменные извне не будут использоваться.
безопаснее например кинуть в соседнюю папку с /www
и обращаться к файлу через ./db_config.php сидя в публичной папке
440 1211894
>>211831
строку запроса в пхп всегда обрамляй двойными кавычки, названия таблиц и полей обрамляй косыми кавычками, одинарные кавычки строк в запросе не вызывают проблем, так как запрос берется в двойные.

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

Ю':email'
441 1211922
>>199390 (OP)

>Что почитать


> ...


>- По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл



А оно в 2018 ещё актуально?
442 1211923
>>211892
Там на сервере кажется все папки публичные, так что успокоило.

А вот что делать с config.json
Я сейчас пытаюсь как раз решить проблему с тем, что мне надо закинуть этот самый конфиг куда-то, а он сука если его запросить в адресной строке тупо эхается всей инфой наружу.

Думаю уже как-нибудь в строку захардкодить прямо в пхп, и эту строку дергать, только вот пока не могу разобраться с форматом. Наверное стоит обычный массив создать и потом конвертнуть его в json?
443 1211924
>>211922
Неактуально. Лучше Котерова рнр7. В книге куча классных вещей рассмотренно.
444 1211957
>>211894
Все перепробовал, не могу сделать функцию проверки наличия email'a в бд, где я обосрался?
https://github.com/Lolodin/htdocs/blob/ilii4/Model/User.php
51 строка
445 1211970
>>211957

>https://github.com/Lolodin/htdocs/blob/ilii4/Model/User.php


$result->fetchColumn(); // вот тута мы извлекли единственную строку (если такой емаил нашёлся) и сразу её потеряли
if ($result->fetchColumn()) // вот тута мы пытаемся извлечь следующую строку (которой нет, ибо емейлы у нас уникалные) — и благополучно получаем ответ false
return true;
else
return false;

Ну и аккуратнее было бы сделать так:
return (bool) $result->rowCount();
446 1211977
>>211970
Благодарю, светоч разума
447 1212085
>>211923
>>211866

Надо выносить все лишнее за корень сервера, как описано тут: https://github.com/codedokode/pasta/blob/master/student-list.md#Выносим-код-за-корень-сервера

Вообще, это нездоровая идея, что все файлы надо класть в публично доступную папку. Должно быть не так - все файлы по умолчанию недоступны, а те, что доступны, мы кладем в отдельную папку.
image.png543 Кб, 1440x860
Проблема с регистрацией 448 1212132
Делал регистрацию первый раз по видеоуроку,но вылазят ошибки как на пикче,в инете не нашел инфы почему так,прошу помочь
ссылка на код https://pastebin.com/raw/BJEtSsVb
449 1212144
>>212132
Оно тебе прямым текстом говорит. Нужен объект mysqli, а не ресурс. Ты используешь mysql_connect который возвращает ресурс, а потом пихаешь этот ресурс в функцию имя которой я отказываюсь произносить. Тебе бы например:
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
А еще лучше использовать PDO. А еще лучше не учится по устаревшим на 10+ лет урокам. Если прямо хочется по видео то ищи видео от profit. Лучше на русском я не видел.
450 1212146
>>212132
Ты уже спрашивал неделю назад.
451 1212168
Bump
452 1212169
Bump
453 1212170
Bump
454 1212185
>>212085

>https://github.com/codedokode/pasta/blob/master/student-list.md#Выносим-код-за-корень-сервера


Так а что делать если там есть типа public_html - в которой тупо лежит вся цмс со всеми внутренними папками. Этот самый public_html на популярных хостингах и есть та самая публичная папка как я понимаю? При том что слкладывать надо на 1 уровне с ней и всё будет нормально работать изнутри, но недоступно из вне?
455 1212240
>>212185

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

Если CMS так сделана, что ее надо целиком класть в публичную папку то тогда сиди и жди, когда кто-нибудь тебя взломает.

Я когда-то, когда делал сайты на CMS, поступал так: CMS клалась на отдельный домен, полностью закрытый HTTP-авторизацией (без пароля на него не зайти), а на основном домене был итнтерфейс на PHP, который просто брал данные из БД и отображал. Соответственно о безопасности CMS можно было не беспокоиться, но при этом мы имели возможность экономить на написании админки.
456 1212297
В первом уроке с гитхаб есть пример Произвольные URL в самом низу. И я уже не знаю куда себя деть. Почему оно работает как надо при вводе path вида /hello или /latest-news через встроенный в пхп сервер, но если запустить через apache то начинает вот это Error 404. А если через apache напрямую обратиться к news.php то скрипт срабатывает и он говорит мне что я дебил. Проверял одновременно с апачем на одном порту и встроенном на другом, на одной одной и той же папке с файлами.
457 1212328
Че как идет вкатывание, анончики? Я месяц позанимался этой хуйней и чет меня заебало. Сначала было интересно, когда учебник ОПа проходил, но на студентах обосрался, ибо вообще не знал как делать. Потом пошел посмотрел какой-то видеокурс на английском и щас ваще не хочется этим заниматься.
458 1212357
>>212328
Прохожу на хекслете.
Скоро уже месяц.
Зависимость есть.
Screenshot8.png16 Кб, 315x827
459 1212371
Анончики, знающие ларавель, или просто шарящие в фреймворках, подскажите, будьте добры, как быть. Ситуация такая:
Готовится довольно крупный проект в плане количества кода, наша контора купила готовую платформу на ларавель, которая покрывает процентов 60 нужного нам функционала, остальное нужно переделывать/делать. В самой платформе часть функционала вынесена в плагины.
Ознакомившись с кодом выяснил, что код платформы вынесен отдельно.
Сам я с ларавель не работал, только yii2, поэтому мне не помешал бы совет как правильно организовать работу, как с архитектурной точки зрения правильно работать с уже имеющимся кодом и как добавлять новый.
Ещё нужно добавить, что на саму платформу часто выходят обновления и не хотелось бы что-то менять в коде платформы, дабы избежать гемора.
Пробовал наследовать контроллеры/модели и менять их функционал, но во первых гемор в неймспейсах, во вторых нужно вносить в код платформы(роутеры).

Структура на пикрил.
Заранее благодарю!
460 1212383
>>212371
через композер подключи платформу как зависимость и пили свой код.
Если боишься, что платформу обновят, то зафиксируй версию например на 3.5.x
https://semver.org/lang/ru/
461 1212594
>>212240
Как думаешь, можно ли взломать такое?

RewriteCond %{REQUEST_URI} .
RewriteRule .
index.php

Я вижу только вариант через запихивание вредоносного хтацесс куда-нибудь еще, но если какая-то уязвимость на сайте позволяет ложить любые файлы куда угодно, то тут, по моему, проблема будет уже не в том где какие файлы лежат. Разве что немного обойти запретив выполнение скриптов из паблик папки впринципе.
462 1212599
>>212594
Блин * за разметку сошло, ну вобщем "вобще всё реврайтим на индекс"
463 1212622
Ребят значит такая проблема. Есть старый говносайт на цмс, тот самый с открытыми папками, но это похуй.

К нему надо прикрутить google-sheet апи, в папке с сайтом даже есть композер, но какой-то старый видимо, потому что есть composer.json, но папки vendor при этом нету. И собственно в чем проблема. Когда я попробовал накатить гугло-апи через композер, то на сайте какие-то аяксовые перделки пошли попизде.

Я даже не понял сразу что всё сломалось, ведь сайт работал, но отвалились чисто какие-то там аякс-бронирования и прочие расписания событий которые тоже аяксом тянутся.

Проблема в том, что я даже файлов На сайте не трогал и нигде не инклудил автолоад композера - как такое возможно?

И как можно накатить подобного монстра (гугло апи) в ручную что бы ничего не сломать?
Если я просто себе заведу на локалке пустую папку и накачу в неё композером это самое апи, а потому в ручную накачу папку vendor на этот сайт, потом например переименую, что бы не конфликтовала с поделками будущих поколений несчастных работяг которые будут за этим сайтом потом присматривать и просто заинклужу где мне надо из этой папки автолоад, то запустится ли подобным образом гугло-либа?
464 1212627
>>212622
в папке вендор под автолоадинг классов индекс создается, так что переименовать не получится точно, на счет скопировать перенести тоже не уверен.

на сайте небыло вендора потому что пакеты композера не устанавливались, а когда ты гуглапи ебнул, то все пакеты из composer.json подгрузились, перебашили тебе автолоадинг классов и все попизде пошло.

Просто сделай сайт заново и не парься.
465 1212648
>>212627

>Просто сделай сайт заново и не парься.


?
466 1212684
Бля, я нихуя не понимаю ООП. Вот я разобрался как объявлять класс, наследования-хуедования и все такое. Как это использовать на практике, так сказать?
467 1212696
>>212684
Класс — это пользовательский тип данных.
468 1212709
>>212684

Одно из применений объектов - это представлять в коде модели каких-то реальных сущностей. Ну например, Номер, Гостя или Бронь.

Попробуй решить задачу про Гостиницу или Вектор для начала.

Гостиница тут: https://phpclub.tech/pr/res/1082507.html#1097078

Вектор тут: https://phpbooktest2.ga/l1/pasta.html

Как решишь, скидывай решение. Если что-то непонятно, задавай вопросы.

Классы еще используют, чтобы делать сервисы, но тебе надо сначала с основами разобраться.
469 1212730
>>212622
Бля, я рили что-то не понимаю в этом дерьме.

Значит сутки назад я делал изменения на сайте, сегодня утром мне сказали, что часть функционала на сайте легла, ну ок, я сделал из панели управления хостингом откат к бекапу на 2.5 суток назад, на позавчерашнее утро то бишь. Функционал встал на место всё работает всё ок.

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

ЛИБА СТОИТ В ВЕНДОРЕ И ДАЖЕ РАБОТАЕТ. Видимо вся поломка была чисто в файле composer.json - в нем теперь ничего нет, кроме каких-то кусков для cms

И да, предостерегаю всех кто вкатывается, не работайте с ебаным modx - эта срань может и имеет право на жизнь, но явно не стоит дальше передавать это следующим поколениям, пусть спокойно себе доживает.
Сравнение фреймворков 470 1212764
Как пояснить за выбор PHP-фреймворка?
Например, пишу проект на Laravel, но с легкостью, например на дипломе могут спросить, а почему не Yii2?
Функционал у них примерно одинаков, синтаксис тоже, разве что Yii2 чуть быстрее.
Подскажите пожалуйста весомые аргументы в пользу Laravel(если таковые вообще есть)
471 1212768
>>212764
Great community, abundance of learning material, dominance on foreign freelance markets.
Fast development and deployment of small to middle size projects.
изображение.png48 Кб, 734x409
472 1212772
>>212764
Если бы я был студентом, то приплетал бы всякое тупое говно из разряда какие там парадигмы используются, как с секьюрностью и всё такое. В общем чем меньше шаришь, тем большую хуйню несешь. Сейчас с опытом в 3 года в вебе я ты твердо и четко на твоем месте привел сорт оф пикрил в своей презинтации, а еще если говорить о yii, то ключевым минусом является то, что он перестал обновляться, а это в современном мире веба смерти подобно. Ты ведь хочешь в процессе обучения в вузике освоить инструмент который даст тебе возможность быть востребованным на рынке труда.
473 1212822
>>212768
ну, по поводу abundance of learning material, в частности доки, у Yii2 насколько я знаю она намного лучше, чем у Laravel, но для Laravel есть laracasts, безумно крутая вещь, относительно комьюнити и фриланс бирж не примут такой аргумент, я сам сдаю диплом сейчас, и нужно будет обосновать именно относительно диплома. Суть диплома в обучении людей разработке или языкам программирования/технологиям, что-то типа codecademy
474 1212825
>>212772
я заканчиваю шарагу, при этом год уже работаю в одной конторе фуллстак раз(раб)ом, пишу лару, аутсорс, но никогда не задумывался над такими вещами как выбор фреймворка, точнее такими близкими как Laravel И Yii2. Да, по поводу обновления это точно, Laravel постоянно обновляется, при этом использует все новшества PHP, то есть самые последные версии, вот в Laravel 5.6 уже используется PHP7.2, и меньше нельзя. Кстати, это его минут, то есть версии лары обратно несовместимы.. И вроде в Yii2 блейда нет и уровень абстракции меньше
475 1212826
>>212822
Ты слишком паришься, если в твоем вузе еще курсе на третьем не вербуют во всякие яндексы и прочее, то в любом случае дипломом можно подтереться, да и в тех что вербуют, можно собственно на этапе вербовки дропать вуз и идти нормально работать + учиться сразу на бою. Дрочи чисто скиллы, а не думай как на такие ебанутые вопросы отвечать.
476 1212828
>>212825
*минус - самофикс
477 1212834
>>212826
у меня college(!), но понятно что говно (там даже инета нету, но он якобы лучший в области), работаю уже год, но больше тянет к железу, а пока веб это изимани, но все равно интересно довольно, веб тоже довольно сложно пилить
Не знаю даже где в яндексы вербуют, но точно не у нас, хотя, если на защите видят что ты хоть как-то шаришь, то могу захантить. У меня просто пиздец сейчас, я из-за работы проебал дохуя времени, и у меня продукт готов процентов на 30 максимум, но при этом опыту меня уже есть, я хз че делать, походу меня изнасилуют
jackdaniels.PNG104 Кб, 552x881
478 1212987
>>199390 (OP)
Кому поллитру?
479 1213051
Никогда бы не догадался как решить задачку про банкомат не используя жадный алгоритм.
Все оче плохо?
480 1213053
>>213051
Забей, если ты будешь делать сайты на php, то забудешь вообще все алгоритмы и вообще это слово забудешь
481 1213167
>>213051
Но знать алгоритмы надо
Screenshot from 2018-06-20 00-54-54.png211 Кб, 1920x1080
482 1213430
Сап, пхписты. Только начал изучать это говно. Возникла проблема. В файле index.php есть функция web_page. Она отображает html-код готовой страницы. Но получается так, что даже не вызвав саму функцию, браузер комментит весь php код до тега <html> и начинает просто отображать весь код после. Как это исправить?
483 1213442
>>213430
Бамп
484 1213467
>>213430
Сам ты говно.
image.png17 Кб, 397x312
485 1213468
>>213430
потому шо строки в одинарных кавычках нельзя переносить

для этого есть специальные строковые метки которые выглядят как понос динозавра.

лучше сделай так
486 1213469
>>213468
Но ведь ты сделал ещё хуже, дебич.

>>213430
Используй heredoc/nowdoc или конструкцию для переменных ${variable} внутри кавычек.

Но откровенно говоря, не страдай хуйней. То что ты делаешь полный бред. Ты хочешь сделать шаблонизатор, а там все совсем по другому работает.
487 1213471
>>213469
чем это хуже? разрыв пхп блока внутри функции выебал твой мозжечек?
488 1213525
>>213167
Лолчто? Алгоритмы? Это вообще что? Я знаю алгоритм пузырьковой сортировки. Этому тебя в ВУЗе учат?
489 1213529
>>213471
Ты чёрт. Это было во-первых. Во-вторых, то что ты привёл на своём скриншоте - так никто не пишет, вернее это говнокод уровня ванички из 2Б. Опездоо ты малолетний, ты кого из себя строить тут вздумал ебеныть?
490 1213593
Акутального треда по фреймворкам типа Yii или Laravel нет?
или тут можно спрашивать?
491 1213694
Лев, мы с тобой виделись на собеседовании в Un* с месяц назад. Ты мне оставил почту и телефон, но я где-то прошляпил листочек с ним. Если вспомнил, напиши на nnenter na гуглпочту.
492 1213809
Блядь, я уже начал учить ПХП и идти к своей мечте, но внезапно погряз в адской пучине онлайн-игр. Ну пиздец, пять лет, сука, держался.
Жизнь боль.
493 1213963
ОП еще проверяет большие задачи? Есть список студентов сюда постить?
494 1213965
>>213809
Так ты совмещай изучение с онлайн-играми!
495 1213976
>>213963

Проверяет, но может быть придется подождать, пока дойдет очередь. Так что пости, иногда заглядывай и бампай.
496 1213991
Аноны, а кому-нибудь из вас удалось вкатиться с нуля?
497 1214020
>>213991
Мне.
498 1214033
без английского стоит пробовать?
499 1214056
>>213991
Куда вкатиться? В язык? Вкатился по урокам опа 3.5 года назад.
3 года назад уже работал на первой подработке по 4 часа в день за 12к

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

Ща вот вроде бы устроился в место где будут платить 50к (новосиб), а мой знакомый из яндекса говорит что я пиздец тормоз и за 3 года люди строят норм карьеру в прогании, а я типа пиздец слоупок.

По навыкам:
Студентов всяких до сих пор не начинал еще делать, всё пытался в свободное время начинать осиливать, но до сих пор толком не знаю ооп, регулярки, мускуль, js, css и прочие тонкости.
500 1214100
>>213991
Я гуманитарий (работа совсем с ит не связана), пару лет в треде сижу. Ходил пару раз на собеседования ради лулзов, меня брали, но зарплату предлагали ниже чем на моей нынешней работе, на которой я ничего не делаю. Еще один раз после тестового звали на собес в веб отдел студии Лебедева, лол, но я не поехал (я не из ДС).
501 1214108
>>213965
Как это сделать, я ща просыпаюсь в 4 часа дня, и сразу же дружаня звонит и такой "го покатаем)))" и я такой "ок)))" мы такие катаем, и вот уже 6 утра, и пиздец.
502 1214166
>>213991
поясни, что значит вкатиться не с нуля
baka.jpg23 Кб, 550x550
503 1214334
Чет подзаебался с задачей "сумма прописью", аж дропнул и несколько дней играл в дотку, но таки сделал, реквестирую критики и все такое.
https://pastebin.com/uPnbA3Jw
504 1214339
>>214108

Зато у тебя есть опыт в играх, ты знаешь как прокачивать персонажа, как абузить имбу и тащить на скиле, вот это вот все, можешь стоять по хардкору.
505 1214366
>>213809
Не имей свободного времени, получай по жопе, расставляй приоритеты.
506 1214442
Бля, какой же я тупой. Пол часа ебался с задачей про кубик, а оказывается написал error с одной r.
507 1214465
>>214442
в голосину с дебиса) нахуй ты такой уродился???
508 1214468
>>214465
Да вообще блять, сам не знаю.
509 1214478
Вопрос по задаче про ООО Вектор.
В процессе обдумывания как сделать классы, я пришел к двум путям:
1)
класс компания, в ней поле департаменты (массив)
класс департамент, в нем поле сотрудники (массив)
2)
класс сотрудник, в нем поле департамент (объект)
класс департамент в нем поле компания (объект)

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

Сам сделал вторым способом.
А как правильно с точки зрения ПРОФЕССИОНАЛЬНОГО ПОГРОММИРОВАНИЯ делать? Или тут без разницы?
510 1214504
>>214478

Обычно делают классы для каждой сущности, а именно:

- класс Сотрудник
- класс Департамент, содержащий массив нанятых Сотрудников
- класс Компания, содержащий список Департаментов

Этот вариант удобен тем, что вся компания засовывается в одну переменную, которую можно куда-то передать. А также, можно передать только Департамент со всеми сотрудниками.

Это позволяет например в Департаменте сделать метод вроде "получить сумму расходов по департаменту", а в Компании "получить сумму по всей компании".

Но конечно, возможны и другие подходы.

Советую запостить свой код на проверку. Если ты хочешь посмотреть предыдущие проверки этой задачи, то пожалуйста, можно поискать тут https://phpclub.tech/search/?q=вектор&page=1
14950969081830.jpg27 Кб, 534x370
Коця 512 1214582
Привет, котики
hqdefault[2].jpg38 Кб, 480x360
513 1214602
>>214582
милости прошу, к нашему шалашу
514 1214653
Собираюсь стать программистом, начать решил с гайда из оп-поста, а уже потом решать куда дальше вкатываться и че делать. Завтра же начну учить.
515 1214760
Не хочу вкатываться в программирование. Что делать?
516 1214784
Бля в треде какая-то параша. Неужто школьники повыпускались из школ и думают о БУЩУЮЩИЕМ?

Нахуй идите с такими тупыми вопросами.
517 1214789
>>214653
Начни с html/css лучше в кокодемии.
518 1214835
Поясните за потоки. Может есть какая нибудь годная статья, чтобы почитать? В мануале сейчас смотрю, как происходит отдача файла сервером, но что то ничего не понимаю.
519 1215065
Анон, обязательно ли знать/пользоваться Linux? Есть кто на работе пользуется Windows?

Я сижу на Ubuntu уже несколько месяцев и это какой-то пиздец. Когда просто сервишь инетик еще терпимо.

Вот потрачую я пол дня на настройку этой хуний. Но сделает ли это меня лучшим программистом? Получ ли я какие-то полезные навыки, кроме гугления в копи-паста в консольку.
520 1215066
>>215065
Хотел прикрепить скриншот с проблемой, но не смог этого сделать скриншот)))
521 1215069
>>215066
Просто не сохранился скриншот на рабочем столе. Очередна gnuППРПШНАЯ УТИЛИТА. unix way. Wi-fi тоже постоянно отваливается.
522 1215073
>>215065
Вывод терминала
awd@awd-ThinkPad-T420:~/Рабочий стол/student$ php index.php
PHP Warning: PHP Startup: Unable to load dynamic library 'mysqlnd.so' (tried: /usr/lib/php/20170718/mysqlnd.so (/usr/lib/php/20170718/mysqlnd.so: cannot open shared object file: No such file or directory), /usr/lib/php/20170718/mysqlnd.so.so (/usr/lib/php/20170718/mysqlnd.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library 'mysqli.so' (tried: /usr/lib/php/20170718/mysqli.so (/usr/lib/php/20170718/mysqli.so: cannot open shared object file: No such file or directory), /usr/lib/php/20170718/mysqli.so.so (/usr/lib/php/20170718/mysqli.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library 'pdo_mysql.so' (tried: /usr/lib/php/20170718/pdo_mysql.so (/usr/lib/php/20170718/pdo_mysql.so: cannot open shared object file: No such file or directory), /usr/lib/php/20170718/pdo_mysql.so.so (/usr/lib/php/20170718/pdo_mysql.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0

Какие-то сошки нужны. А поч такое гавно?
Php устанавливал командой:
sudo apt-get install php
523 1215131
>>215073
Ну так установи еще и расширения.
524 1215242
>>215131
Ой все. Я уже в докере запустил.
sage 525 1215381
Стоит ли очищать урл перед использованием? Ну, там теги удалять и прочее.
У меня урл используется для маршрутизации - разбивается, затем части используются для конроллеров/экшенов/всяких слагов.
Также я удаляю все спецсимволы из получившихся строк. Но сейчас подумал, а нужно ли?
Даже если юзер напишет что-то левое - всё равно, это используется только для маршрутизации. Просто нужный файл будет не найдет, а пользователь увидит ошибку 404.
А если для слагов - общение с базой через пдо с подготовленными запросами с отключенной эмуляцией, посему тут проблем тоже быть не может.

Но моя паранойя не даёт мне убрать эту штуку. Что делать?
526 1215402
>>215381

Если ты на 100% уверен что на твоем сайте не бывает спецсимволов в URL, то можно при их обнаружении выдавать подходящую по смыслу 4xx ошибку.

Лучше конечно писать код так, чтобы ничего не ломалось от любых символов в URL. B,j d query string после знака вопроса могут быть почти любые символы.

Удалять спецсимволы не стоит, так как тогда у тебя страница будет доступна под несколькими разными URL, а это плохо с точки зрения SEO, и вообще, у страницы должен быть ровно один URL.
527 1215417
Кароче, пачаны, что мне нужно уметь чтобы вкатиться на низшие уровни ИТ?
528 1215419
>>215417

Для начала, ты пробовал зайти на сайты вакансий вроде hh.ru и посмотреть вакансии без опыта? Там обычно пишут требования. Если что-то в них непонятно, то спрашивай.
529 1215424
>>215402
Нет, там есть спецсимволы. Логика (упрощенно) такая:
Есть класс Router, отвечающий за маршрутизацию, и есть класс System, где собраны разные системные функции и данные.
В классе System есть метод getRoute(bool $clear = true), который по-умолчанию очищает строки и возвращает массив.
Класс Router использует этот метод именно в этом виде.
А есть еще класс Request, который отвечает за обработку post/get запросов. Он уже не использует метод getRoute, а получает инфу из суперглобальных массивов типа $_POST.

Поэтому маршрутизация происходит по одному сценарию, а работа с get-параметрами - по другому. Поэтому этот метод никаким образом не влияет на то, с чем работает класс Request.

>Удалять спецсимволы не стоит, так как тогда у тебя страница будет доступна под несколькими разными URL, а это плохо с точки зрения SEO, и вообще, у страницы должен быть ровно один URL.


Вот это хорошая мысль, я даже об этом не подумал. Спасибо.
530 1215433
>>215419
Кстати да, намного показательней так смотреть, чем гуглить отдельно языки и сравнивать общие значения, js все говорят, а по вакансиям без опыта в моем городе пхп и sql почти везде
531 1215438
Задача про вектор. Вроде работает, но мне кажется я там обосрался 10000 раз.
http://sandbox.onlinephpfunctions.com/code/1c1605f4a96ed9907dcc6909759858b2749c051b
532 1215440
>>214100

>зарплату предлагали ниже чем на моей нынешней работе


Сколько предлагали? Что на собесах спрашивали по тех.части?
533 1215491
Аноны, работающие в пхп, приходится ли вам верстать, а особенно додумывать дизайн? Задачи из оп поста нравятся, но вот этим заниматься на будущей галере совсем не хочется
534 1215496
Всех приветствую. Ребят, не подскажите возможно ли коннект с помощью php к сетевому оборудованию по rlogin? хочу скрипт для снятия логов, а как сделать не знаю. Если можно то скиньте ссылку как это сделать.
image.jpeg85 Кб, 464x229
535 1215519
>>215491

Ну мне дают макет формы. И я хуярю его с помощью одной из жс-библиотек. Какую форму нахуярю - такой и будут пользоваться. Простора для полёта фантазии не особо много. Пикрилейтед.
536 1215523
>>215519

А, ну и этим приходится заниматься только когда прилетает задача на новую йоба-тулзу. В основном-то ковыряю няшный пхп-говнокод.
537 1215525
>>215523

...Ну и занимаюсь фронтендом я только если интерфейс простой. Если что-то хитрожопое — всегда есть доступ к телу фронтендеров из дружественных подразделений.
538 1215596
>>199390 (OP)

> Верстальщику - HTML/CSS, JS, jQuery.


В 2018 можно устроиться зная эти вещи? Или теперь только вкупе с РНР можно заниматься версткой, типа всё делаешь и бек и верстку и жиквери прикручиваешь?
539 1215698
>>215596
Если JS знать на уровне, то почему бы и нет?
540 1215719
>>215698
То есть таки можно, просто используя жс, без Реакта, Вью и Ангуляра?
541 1215726
>>215719

Версталой мб и устроишься. Фронтендером — вряд ли. Хотя бы с одним популярным фреймворком стоит познакомиться.
542 1215728
>>215726
Просто я думал, что верстальщики вымерли. Ибо вакансий не видно, либо фронтендер с тремя фреймворками и нодой, либо РНР, HTML, CSS, JQuery. Плюс верстка-тред исчез и остался только фронтенд-тред.
543 1215730
>>215728

У нас в конторе около 50-60 программеров.
Верстальщиков всего несколько.

Верстальщики нужны только там, где делают сайты. Программеры нужны везде.
544 1215731
>>215728

Ну и верстку я бы рассматривал лишь как перевалочный пункт на пути к становлению фронтендером. Больше возможностей для развития.
545 1215740
Часто вижу методы с такой сигнатурой:
public function set(Foo &$foo){};

Но зачем писать &
Разве объекты не по умолчанию передаются по ссылке?
546 1215759
>>215740

> Разве объекты не по умолчанию передаются по ссылке?



В пхп так было не всегда. Скорее всего, эти примеры кода написаны в бородатые времена.
547 1215773
>>215438
http://sandbox.onlinephpfunctions.com/code/8feb1f81f61c768a598a43ff3571385b3774858b
Переделал. Вроде сейчас получше. Хотел еще использовать константы вместо переменных в департаментах, но тогда у меня функция для создания работников переставала работать.
548 1215908
Почему пхп скрипты не минифицируют?
549 1215970
ОП, спасибо что обновил репозиторий ссылками на гисты. Предлагаю поправить описание репозитория с "Уроки и черновики для изучающих PHP" в "Уроки и черновики для изучающих web-разработку" или что-то в этом духе? В репозитории очень много общей информации, не привязанной к языку, так описание будет лучше отражать содержание.

>>215908
Потому что в этом нет смысла. Минификация актуальна для фронтенда, так как минифицированный код будет меньше весить и пользователь его быстрее скачает. Ещё такой код сложно читать (тем не менее такой код можно деобфусцировать прямо в браузере, но изначальных имён переменных там, конечно же, не будет).

На бекенде не нужно минифицировать код, так как он и так не доступен пользователю, а что до оптимизаций - это экономия на спичках. При наличии opcache - то вообще никакой экономии.
550 1216065
Возможно ли выучить ларавель, не зная php?
551 1216066
>>216065
нет
552 1216088
>>199390 (OP)
Котаны, котаны, вы КОТАНЧИКИ!

Посоветуйте пиздатый туториал по Laravel :3
I beg you!
410-552 Вектор 553 1216144
>>215773
>>215438

Задача про Вектор.

Если ты используешь PHP7 (я надеюсь, что используешь), то нужно расставить тайп-хинты для аргументов функций и возвращаемых значений.

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

Мануал: http://php.net/manual/ru/functions.arguments.php#functions.arguments.type-declaration

Обрати внимание, что php7 усовершенствовал систему тайп-хинтов - теперь можно в их качестве указывать примитивные типы вроде int/string, а в php7.1 стало можно указывать тайп-хинт для возвращаемого функцией значения: https://habrahabr.ru/post/267799/ , причем можно указать тип void, значащий, что функция ничего не возвращает.

Тут в функции серьезная проблема:

> function getSalaryAndCoffee(){


> ...


> $this->salary *= 1.25;



Вызов этой функции изменяет значение поля salary. Если мы вызовем ее несколько раз, то она каждый раз будет возвращать все увеличивающееся значение зарплаты. Это неправильно. Функция вида getX() не должна менять состояние (значения полей) объекта.

Далее, ты использовал наследование для того, чтобы сделать классы Manager, Engineer и тд. По задумке, наследники должны задавать значения базовой зарплаты, потребления кофе итд. Но это никак не документировано и никак не проверяется. Соответственно, если кто-то захочет добавить новую профессию, они могут просто не догадаться об этом. Это можно исправить тем, что для определения базовых значений зарплаты вместо полей использовать абстрактные методы:

abstract public function getBaseSalary();

Тогда их нельзя будет забыть переопределить.

> function getEmployeers($department){



Тут очень много какой-то копипасты, нехорошо заставляють людей все это читать. Плюс логика работы этого метода не понятна. Мы получаем какой-то объект $department неизвестного класса, и зачем-то ищем в нем непонятные поля вроде engineer_1. Увы, понять логику работы этого метода тяжело. Да и вообще, непонятно, зачем он нужен в классе Department, если он ничего из этого класса не использует.

Единственное, что можно понять, что тут стоило использовать массивы. Вместо объекта с полями engineer_1, engineer_2 логичнее было сделать массив вида $x['engineer'][0]. Массивы специально придуманы для хранения наборов данных, и поиска их по индексу.

> function getTotalInfo($department){


> $a = self::getEmployeers($department);



Здесь странно, что мы в объект Департамент передаем какой-то еще департамент. Было бы логичнее сделать так:

$x = $department->getSomething();

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

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

Также, функция getTotalInfo() добавляет в объект поля, которых в нем изначально не было. Это плохо. В такой ситуации нужен массив, а ты используешь объект, как будто это и есть массив. Это не ООП-подход, конечно же. Недостаток тут в том, что эти поля могут быть, а могут не быть, и ты не можешь нормально работать с объектом, так как не знаешь, есть они или нет. Ты не можешь посмотреть на заголовок класса и узнать, какие в нем есть поля, для этого тебе надо разбирать весь код класса.

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

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

То есть вот это плохой паттерн:

$object->calclulateSomething();
...
echo $object->x;

Лучше делать так:

$result = $object->calculateSomething();
echo $result->x;

Это гарантирует, что ты всегда получаешь актуальный результат.

> class DepartmentOfAdvertising extends Department{



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

С классом Company та же проблема, что в нем не хранится никакой информации о компании. Также, вывод данных лучше сделать вне класса. Твой код никак нельзя повторно использовать - например, нельзя как-то получить и сохранить в переменную суммарную зарплату по компании. Если бы ты сделал вместо этого отдельный метод getTotalSalary(), то тогда его результат можно было бы использовать где-то еще.

Потому вывод данных лучше вынести из объектов.

Задавай вопросы, если что-то непонятно, если понятно, то ждем исправленные версии + доработки по второй части задачи.
410-552 Вектор 553 1216144
>>215773
>>215438

Задача про Вектор.

Если ты используешь PHP7 (я надеюсь, что используешь), то нужно расставить тайп-хинты для аргументов функций и возвращаемых значений.

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

Мануал: http://php.net/manual/ru/functions.arguments.php#functions.arguments.type-declaration

Обрати внимание, что php7 усовершенствовал систему тайп-хинтов - теперь можно в их качестве указывать примитивные типы вроде int/string, а в php7.1 стало можно указывать тайп-хинт для возвращаемого функцией значения: https://habrahabr.ru/post/267799/ , причем можно указать тип void, значащий, что функция ничего не возвращает.

Тут в функции серьезная проблема:

> function getSalaryAndCoffee(){


> ...


> $this->salary *= 1.25;



Вызов этой функции изменяет значение поля salary. Если мы вызовем ее несколько раз, то она каждый раз будет возвращать все увеличивающееся значение зарплаты. Это неправильно. Функция вида getX() не должна менять состояние (значения полей) объекта.

Далее, ты использовал наследование для того, чтобы сделать классы Manager, Engineer и тд. По задумке, наследники должны задавать значения базовой зарплаты, потребления кофе итд. Но это никак не документировано и никак не проверяется. Соответственно, если кто-то захочет добавить новую профессию, они могут просто не догадаться об этом. Это можно исправить тем, что для определения базовых значений зарплаты вместо полей использовать абстрактные методы:

abstract public function getBaseSalary();

Тогда их нельзя будет забыть переопределить.

> function getEmployeers($department){



Тут очень много какой-то копипасты, нехорошо заставляють людей все это читать. Плюс логика работы этого метода не понятна. Мы получаем какой-то объект $department неизвестного класса, и зачем-то ищем в нем непонятные поля вроде engineer_1. Увы, понять логику работы этого метода тяжело. Да и вообще, непонятно, зачем он нужен в классе Department, если он ничего из этого класса не использует.

Единственное, что можно понять, что тут стоило использовать массивы. Вместо объекта с полями engineer_1, engineer_2 логичнее было сделать массив вида $x['engineer'][0]. Массивы специально придуманы для хранения наборов данных, и поиска их по индексу.

> function getTotalInfo($department){


> $a = self::getEmployeers($department);



Здесь странно, что мы в объект Департамент передаем какой-то еще департамент. Было бы логичнее сделать так:

$x = $department->getSomething();

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

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

Также, функция getTotalInfo() добавляет в объект поля, которых в нем изначально не было. Это плохо. В такой ситуации нужен массив, а ты используешь объект, как будто это и есть массив. Это не ООП-подход, конечно же. Недостаток тут в том, что эти поля могут быть, а могут не быть, и ты не можешь нормально работать с объектом, так как не знаешь, есть они или нет. Ты не можешь посмотреть на заголовок класса и узнать, какие в нем есть поля, для этого тебе надо разбирать весь код класса.

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

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

То есть вот это плохой паттерн:

$object->calclulateSomething();
...
echo $object->x;

Лучше делать так:

$result = $object->calculateSomething();
echo $result->x;

Это гарантирует, что ты всегда получаешь актуальный результат.

> class DepartmentOfAdvertising extends Department{



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

С классом Company та же проблема, что в нем не хранится никакой информации о компании. Также, вывод данных лучше сделать вне класса. Твой код никак нельзя повторно использовать - например, нельзя как-то получить и сохранить в переменную суммарную зарплату по компании. Если бы ты сделал вместо этого отдельный метод getTotalSalary(), то тогда его результат можно было бы использовать где-то еще.

Потому вывод данных лучше вынести из объектов.

Задавай вопросы, если что-то непонятно, если понятно, то ждем исправленные версии + доработки по второй части задачи.
554 1216145
>>215496

Я бы погуглил "php rlogin".

>>215424

Ну судя по описанию, у тебя все сильно перепутано. Например, класс System - что он представляет, какую еще систему? Название как минимум странное.

> В классе System есть метод getRoute(bool $clear = true), который по-умолчанию очищает строки и возвращает массив.



Опять же непонятно, почему получением роута занимается не роутер. Метод getRoute как раз логичнее поместить в роутер. И я писал выше - можно выдавать 404 при наличии каких-то запрещенных символов, но молча удалять их и продолжать работать, как ни в чем не бывало, не стоит. То есть функция "очистки" не нужна. Соответственно, непонятно, зачем нужна опция для нее.

> А есть еще класс Request, который отвечает за обработку post/get запросов.



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

Я бы тебе советовал поковырять фреймворки вроде Slim или сделать задачу про студентов из ОП-поста, чтобы лучше разбираться в ООП, MVC и архитектуре веб-приложений.

>>215073

Расширения к PHP устанавливаются отдельно. Они имеют названия вроде php7-curl итд.

>>215242

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

>>215066

Может ты сделал что-то не так или забыл нажать кнопку сохранения? Я, кстати, пользовался дебианом и в нем вайфай в сочетании с андроидом работал безупречно, без проблем при засыпании/просыпании.

>>215065

У линукса много преимуществ. Например, ты можешь сам исправлять в нем баги, а не молиться на то, что майкрософт когда-нибудь заметит тебя с твоей проблемой. Софт ставится через пакетный менеджер. И тот же дебиан не станет сливать про тебя информацию. Вот, для примера, что собирает винда на "базовом" (минимальном) уровне телеметрии: https://docs.microsoft.com/en-us/windows/privacy/basic-level-windows-diagnostic-events-and-fields

Тебе надо просто получше разобраться в системе, почитать статьи про нее.
554 1216145
>>215496

Я бы погуглил "php rlogin".

>>215424

Ну судя по описанию, у тебя все сильно перепутано. Например, класс System - что он представляет, какую еще систему? Название как минимум странное.

> В классе System есть метод getRoute(bool $clear = true), который по-умолчанию очищает строки и возвращает массив.



Опять же непонятно, почему получением роута занимается не роутер. Метод getRoute как раз логичнее поместить в роутер. И я писал выше - можно выдавать 404 при наличии каких-то запрещенных символов, но молча удалять их и продолжать работать, как ни в чем не бывало, не стоит. То есть функция "очистки" не нужна. Соответственно, непонятно, зачем нужна опция для нее.

> А есть еще класс Request, который отвечает за обработку post/get запросов.



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

Я бы тебе советовал поковырять фреймворки вроде Slim или сделать задачу про студентов из ОП-поста, чтобы лучше разбираться в ООП, MVC и архитектуре веб-приложений.

>>215073

Расширения к PHP устанавливаются отдельно. Они имеют названия вроде php7-curl итд.

>>215242

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

>>215066

Может ты сделал что-то не так или забыл нажать кнопку сохранения? Я, кстати, пользовался дебианом и в нем вайфай в сочетании с андроидом работал безупречно, без проблем при засыпании/просыпании.

>>215065

У линукса много преимуществ. Например, ты можешь сам исправлять в нем баги, а не молиться на то, что майкрософт когда-нибудь заметит тебя с твоей проблемой. Софт ставится через пакетный менеджер. И тот же дебиан не станет сливать про тебя информацию. Вот, для примера, что собирает винда на "базовом" (минимальном) уровне телеметрии: https://docs.microsoft.com/en-us/windows/privacy/basic-level-windows-diagnostic-events-and-fields

Тебе надо просто получше разобраться в системе, почитать статьи про нее.
555 1216146

>>214835



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

Потоки придуманы, чтобы можно было одной и той же функцией читать (или записывать) данные из файла, из ответа удаленного сервера, из архива, и из других источников. Вроде:

$a = file_get_contents('/tmp/file.txt');
$b = file_get_contents('http://example.com/file.txt');
$c = file_get_contents('ftp://ftp.example.com/file.txt');

// Чтение из архивированного файла с распаковкой на ходу:
$d = file_get_contents('compress.zlib://tmp/file.txt.gz');
$e = file_get_contents('zip://archive.zip#file.txt');

Общая информация про потоки: http://php.net/manual/ru/intro.stream.php
Список типов потоков: http://php.net/manual/ru/wrappers.php

Кстати, ты можешь при желании зарегистрировать свой новый тип потока, и стандартные функции вроде file_get_contents() будут с ним работать: http://php.net/manual/ru/function.stream-wrapper-register.php

>>214563

У тебя та же проблема, что и в решении задачи, которое я разобрал выше. В ООП объекты обычно объединяют в себе данные (поля) и функции (методы) для работы с этими данными. Если у тебя, например, есть объект, который представляет, допустим, маршрут автобуса (BusRoute), то в нем скорее всего будут храниться параметры маршрута (например, список остановок или их координат), и методы для получения информации о маршруте.

У тебя же в классе Компания данные никакие не хранятся, а список департементов и сотрудников передается в метод getCompanyReport() через аргументы.

Очевидно, в Компании стоит хранить список Департаментов, в Департаменте - список Сотрудников, а в Сотруднике - его свойства. Если хочешь, ты можешь поддерживать обратные ссылки (в Сотруднике - ссылку на Департамент), но тогда желательно обеспечить автоматическую поддержку их актуальности при найме/увольнении сотрудников.

В switch всегда стоит добавлять default с выбросом исключения или, если ты их не знаешь, с аварийным завершением программы при обнаружении неправильного значения.

> $emp->profession = $professions[0];


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

> array_push($employees, $emp);


Можно писать $x[] = $y;

id можно было не добавлять или проставлять автоматически, например, используя функцию в Компании generateNewId().

Вывод данных о компании лучше сделать снаружи, а в компании оставить только расчет значений. Тогда ты сможешь использовать эти значения и для других целей, кроме вывода таблиц.
555 1216146

>>214835



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

Потоки придуманы, чтобы можно было одной и той же функцией читать (или записывать) данные из файла, из ответа удаленного сервера, из архива, и из других источников. Вроде:

$a = file_get_contents('/tmp/file.txt');
$b = file_get_contents('http://example.com/file.txt');
$c = file_get_contents('ftp://ftp.example.com/file.txt');

// Чтение из архивированного файла с распаковкой на ходу:
$d = file_get_contents('compress.zlib://tmp/file.txt.gz');
$e = file_get_contents('zip://archive.zip#file.txt');

Общая информация про потоки: http://php.net/manual/ru/intro.stream.php
Список типов потоков: http://php.net/manual/ru/wrappers.php

Кстати, ты можешь при желании зарегистрировать свой новый тип потока, и стандартные функции вроде file_get_contents() будут с ним работать: http://php.net/manual/ru/function.stream-wrapper-register.php

>>214563

У тебя та же проблема, что и в решении задачи, которое я разобрал выше. В ООП объекты обычно объединяют в себе данные (поля) и функции (методы) для работы с этими данными. Если у тебя, например, есть объект, который представляет, допустим, маршрут автобуса (BusRoute), то в нем скорее всего будут храниться параметры маршрута (например, список остановок или их координат), и методы для получения информации о маршруте.

У тебя же в классе Компания данные никакие не хранятся, а список департементов и сотрудников передается в метод getCompanyReport() через аргументы.

Очевидно, в Компании стоит хранить список Департаментов, в Департаменте - список Сотрудников, а в Сотруднике - его свойства. Если хочешь, ты можешь поддерживать обратные ссылки (в Сотруднике - ссылку на Департамент), но тогда желательно обеспечить автоматическую поддержку их актуальности при найме/увольнении сотрудников.

В switch всегда стоит добавлять default с выбросом исключения или, если ты их не знаешь, с аварийным завершением программы при обнаружении неправильного значения.

> $emp->profession = $professions[0];


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

> array_push($employees, $emp);


Можно писать $x[] = $y;

id можно было не добавлять или проставлять автоматически, например, используя функцию в Компании generateNewId().

Вывод данных о компании лучше сделать снаружи, а в компании оставить только расчет значений. Тогда ты сможешь использовать эти значения и для других целей, кроме вывода таблиц.
556 1216147
>>214334

> https://pastebin.com/uPnbA3Jw



> function getWordForm($number, $order){


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

> if($number > 99){


> $number-=floor($number/100)*100;



Тут проще использовать остаток от деления на 100: $x % 100

Также, в этой функции в конце нет return, и получается, есть вероятность, что она вернет null? Лучше было бы тогда последний return писать без if.

> $num = $number;


Плохо так называть переменные, так как непонятно, в чем между ними разница.

Вместо array_push короче писать $x[] = ...;

return implode(...) повторяется много раз, можно было бы вынести его в конец функции.

> $numbers = array_reverse(explode(" ", number_format($number, 0, ',', ' ')));


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

В функции numberToText() проверку на 0 можно было поставить в самом начале функции.

Не очень понятно, почему в numberToText() число формируется с конца, а не в нормальном порядке.

>>214033

Стоит, если параллельно начинать его изучать.
556 1216147
>>214334

> https://pastebin.com/uPnbA3Jw



> function getWordForm($number, $order){


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

> if($number > 99){


> $number-=floor($number/100)*100;



Тут проще использовать остаток от деления на 100: $x % 100

Также, в этой функции в конце нет return, и получается, есть вероятность, что она вернет null? Лучше было бы тогда последний return писать без if.

> $num = $number;


Плохо так называть переменные, так как непонятно, в чем между ними разница.

Вместо array_push короче писать $x[] = ...;

return implode(...) повторяется много раз, можно было бы вынести его в конец функции.

> $numbers = array_reverse(explode(" ", number_format($number, 0, ',', ' ')));


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

В функции numberToText() проверку на 0 можно было поставить в самом начале функции.

Не очень понятно, почему в numberToText() число формируется с конца, а не в нормальном порядке.

>>214033

Стоит, если параллельно начинать его изучать.
557 1216149
>>213593

Спрашивать можно.

>>213469

С таким отношением тебе лучше вообще ничего не писать. Это обучающий тред, а не тред для поднятия самооценки самому себе.

Тем более, что проблема не в функции.

>>213430

Проблема не в функции, а где-то раньше. Например, ты забыл поставить маркер <?php

>>212622

Скорее всего ты что-то путаешь. Композер работает только с папкой vendor (если другая папка не задана в конфиге). Но конечно это не исключает того, что криво написанный сайт мог в нее лезть. Тебе надо было разобрать его код, а не лезть вносить изменения.

>>212594

Это плохая идея, так как при обращении к статическим файлам (картинкам например), тоже будет вызываться PHP.

>>212297

Потому что для разных серверов способы задания обработчика для данного URL разные. В Апаче это задается в файле htaccess или конфиге сервера. А по умолчанию он просто ищет указанный в URL файл.
557 1216149
>>213593

Спрашивать можно.

>>213469

С таким отношением тебе лучше вообще ничего не писать. Это обучающий тред, а не тред для поднятия самооценки самому себе.

Тем более, что проблема не в функции.

>>213430

Проблема не в функции, а где-то раньше. Например, ты забыл поставить маркер <?php

>>212622

Скорее всего ты что-то путаешь. Композер работает только с папкой vendor (если другая папка не задана в конфиге). Но конечно это не исключает того, что криво написанный сайт мог в нее лезть. Тебе надо было разобрать его код, а не лезть вносить изменения.

>>212594

Это плохая идея, так как при обращении к статическим файлам (картинкам например), тоже будет вызываться PHP.

>>212297

Потому что для разных серверов способы задания обработчика для данного URL разные. В Апаче это задается в файле htaccess или конфиге сервера. А по умолчанию он просто ищет указанный в URL файл.
558 1216150
>>212132

Я бы пересмотрел видеоурок внимательно. Может быть, ты опечатался при переписывании кода. Или не сделал что-то или не настроил что-то в каком-то конфиге.

Например, у тебя смешаны mysql- и mysqli-функции в коде.

Также, это плохо, смешивать в одном файле логику работы с БД и HTML код. Почитай про шаблоны на досуге: https://github.com/codedokode/pasta/blob/master/php/templates.md

>>211957

Вообще, для проверки наличия строки в БД лучше использовать не SELECT ×, а SELECT (COUNT(×)).

Также, по моему у тебя неудачно назван класс, обычно модель - это объект, который представляет одного Пользователя и хранит данные о нем, а у тебя это просто набор статических методов и назвать было его надо как-нибудь по-другому, например, UserUtils. Почитать, чем плохо статические методы, можно тут https://github.com/codedokode/pasta/blob/master/arch/di.md

>>211831

Тут ничего экранировать не надо, так как PDO или БД сами закранируют и заключат в нужные кавычки значение, переданное вместо :email. И соответственно, никаких инъекций не будет. Исключение: если ты задал в БД экзотическую восточную кодировку вместо utf-8, то там остается шанс инъекции. Для интересующихся: https://stackoverflow.com/a/12202218 (англ.)

>>211781

Не использовал, погугли. Вроде как там что-то отдаленно напоминающее SQLite. В википедии написано, что развивать ее не хотят: https://en.wikipedia.org/wiki/Web_SQL_Database и предлагают использовать IndexedDB. Это key-value хранилище с добавлением вторичных индексов и транзакций.

Key-value хранилища - это такие примитивные БД, которые хранят массив пар "ключ-значение" и поддерживают всего несколько операций: найти значение по ключу, перебрать все значения в БД, добавить, удалить, заменить значение с данным ключом (чем-то напоминает PHP-массив). IndexedDB в качестве значений может хранить JSON (то есть словари JS), умеет добавлять к базе индексы для быстрого поиска не только по ключу, но и по полям JSON-объектов, использует транзакции (позволяет делать несколько изменений атомарно, так, что либо они все применяются, либо не применяется ни одно).

key-value хранилища не поддерживают язык SQL. Написано огромное число хранилищ, использующих такую архитектуру: начиная с легендарного dbm, написанного Кеном Томпсоном (основатель Unix, разработчик ОС Plan9, разработчик предшественника языка Си, разработчик языка Го) в 1979 году ( https://en.wikipedia.org/wiki/Dbm ), и продолжая (с дополнениями и улучшениями) BerkeleyDB, Memcache, Redis, CouchDB, MongoDB.

Также, в некоторых компаниях пишут свои key-value хранилища, например, вконтакте использовал их и часть даже выложил в open source.

https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API/Basic_Concepts_Behind_IndexedDB
558 1216150
>>212132

Я бы пересмотрел видеоурок внимательно. Может быть, ты опечатался при переписывании кода. Или не сделал что-то или не настроил что-то в каком-то конфиге.

Например, у тебя смешаны mysql- и mysqli-функции в коде.

Также, это плохо, смешивать в одном файле логику работы с БД и HTML код. Почитай про шаблоны на досуге: https://github.com/codedokode/pasta/blob/master/php/templates.md

>>211957

Вообще, для проверки наличия строки в БД лучше использовать не SELECT ×, а SELECT (COUNT(×)).

Также, по моему у тебя неудачно назван класс, обычно модель - это объект, который представляет одного Пользователя и хранит данные о нем, а у тебя это просто набор статических методов и назвать было его надо как-нибудь по-другому, например, UserUtils. Почитать, чем плохо статические методы, можно тут https://github.com/codedokode/pasta/blob/master/arch/di.md

>>211831

Тут ничего экранировать не надо, так как PDO или БД сами закранируют и заключат в нужные кавычки значение, переданное вместо :email. И соответственно, никаких инъекций не будет. Исключение: если ты задал в БД экзотическую восточную кодировку вместо utf-8, то там остается шанс инъекции. Для интересующихся: https://stackoverflow.com/a/12202218 (англ.)

>>211781

Не использовал, погугли. Вроде как там что-то отдаленно напоминающее SQLite. В википедии написано, что развивать ее не хотят: https://en.wikipedia.org/wiki/Web_SQL_Database и предлагают использовать IndexedDB. Это key-value хранилище с добавлением вторичных индексов и транзакций.

Key-value хранилища - это такие примитивные БД, которые хранят массив пар "ключ-значение" и поддерживают всего несколько операций: найти значение по ключу, перебрать все значения в БД, добавить, удалить, заменить значение с данным ключом (чем-то напоминает PHP-массив). IndexedDB в качестве значений может хранить JSON (то есть словари JS), умеет добавлять к базе индексы для быстрого поиска не только по ключу, но и по полям JSON-объектов, использует транзакции (позволяет делать несколько изменений атомарно, так, что либо они все применяются, либо не применяется ни одно).

key-value хранилища не поддерживают язык SQL. Написано огромное число хранилищ, использующих такую архитектуру: начиная с легендарного dbm, написанного Кеном Томпсоном (основатель Unix, разработчик ОС Plan9, разработчик предшественника языка Си, разработчик языка Го) в 1979 году ( https://en.wikipedia.org/wiki/Dbm ), и продолжая (с дополнениями и улучшениями) BerkeleyDB, Memcache, Redis, CouchDB, MongoDB.

Также, в некоторых компаниях пишут свои key-value хранилища, например, вконтакте использовал их и часть даже выложил в open source.

https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API/Basic_Concepts_Behind_IndexedDB
559 1216151
>>210739

А хардкодить и не надо - их удобно передавать через конструктор:

$config = new ConfigReader('/tmp/config.ini');

> . Но меня беспокоит вопрос об эффективности этого. Вот допустим есть сущностей, я их для отображения страницы беру по 100 штук, а потом к ним через 1:many добираются еще другие.



Это известная проблема SELECT N + 1 problem. Вариантов решений не так и много, либо ленивая загрузка, либо жадная (заранее указываем, какие связи надо подгрузить сразу, а остальные остаются ленивыми). Причем это надо тестировать, у меня в некоторых тестах с Доктриной например выходило, что ленивая загрузка дешевле, хотя это может зависеть еще и от количества и типа связей.

Вообще, если тебе надо получить очень много данных, то лучше без ORM, просто взять массив результатов (разница по времени и памяти может легко быть в 5-10 раз). Но в 95% случаев это не требуется, а использование ORM экономит кучу времени и делает работу с кодом более удобным за счет моделей и автоматической подгрузки связей.

Особенно хорошо в ORM автоматическое обнаружение изменений. Ты меняешь свойства отдельных моделей, а ORM сама находит изменения и генерирует нужные SQL запросы.

> Я думал уже делать объект для ответа.



Только не изобретай свой стандарт, а используй PSR-7: https://www.google.com/search?q=psr-7 - хотя под него уже есть готовые библиотеки, но в образовательных целях может попробовать реализовать его сам.

>>210679

Урок про работу с датой и временем: https://github.com/codedokode/pasta/blob/master/php/datetime.md

>>210690

Удобнее первым запросом выбрать всех подписчиков, вторым - все их телефоны и далее, если надо, скомбинировать на стороне PHP.
560 1216199
>>216144
Спасибо за подробный разбор, но я не понял нескольких вещей.

>Вызов этой функции изменяет значение поля salary. Если мы вызовем ее несколько раз, то она каждый раз будет возвращать все увеличивающееся значение зарплаты. Это неправильно. Функция вида getX() не должна менять состояние (значения полей) объекта.


А почему нельзя? Проблема только в неудачно выбранном глаголе? Если я назову эту функцию increaseSalaryAndCoffee будет нормально?

>Это можно исправить тем, что для определения базовых значений зарплаты вместо полей использовать абстрактные методы:


abstract public function getBaseSalary();
Я сейчас погуглил про абстрактные методы. Получается, что если я объявляю пустой абстрактный метод в классе, то его обязаны использовать и описывать все наследники? Хотя я сам сейчас это проверю.

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


Логика была такой: есть четыре профессии три ранга и руководители. Мы передаем в этот метод любой объект департамента (кроме Department), например, DepartmentOfSales. Внутри этого департамента есть несколько переменных с разными профессиями. Все они имеют вид профессия_ранк и возможно _босс. Внутри метода есть массив с названиями четырех профессий и цикл проходится по каждой из них, подставляя название профессии $value в большую копипасту. В копипасте есть варианты для трех рангов каждой профессии и боссов. Если переменная с таким названием есть в департаменте и ее значение больше нуля, то запускается цикл, добавляющий нужное количество объектов-работников в массив.
Как сделать по-другому, мне что-то в голову не приходит, но я попробую покопаться.

>Вообще, тут особо нет смысла применять наследование, так как департаменты ничем не отличаются друг от друга, кроме значений полей. Проще просто сделать несколько объектов одного класса. По идее, конечно, и с сотрудниками можно поступить так же.


То есть сделать один класс Departament и создать в нем поле, например, $employeers, для хранения объектов-работников?

>С классом Company та же проблема, что в нем не хранится никакой информации о компании.


Класс Company я создал, чтобы после создания нового объекта этого класса и использования метода getInfoAboutAllCompany, можно было получить объект с данными о каждом департаменте и сумме их значений. В первом варианте я использовал класс bookkeeping, типа бухгалтерия, в котором делал разные методы. Как вообще стоит называть такие классы?
560 1216199
>>216144
Спасибо за подробный разбор, но я не понял нескольких вещей.

>Вызов этой функции изменяет значение поля salary. Если мы вызовем ее несколько раз, то она каждый раз будет возвращать все увеличивающееся значение зарплаты. Это неправильно. Функция вида getX() не должна менять состояние (значения полей) объекта.


А почему нельзя? Проблема только в неудачно выбранном глаголе? Если я назову эту функцию increaseSalaryAndCoffee будет нормально?

>Это можно исправить тем, что для определения базовых значений зарплаты вместо полей использовать абстрактные методы:


abstract public function getBaseSalary();
Я сейчас погуглил про абстрактные методы. Получается, что если я объявляю пустой абстрактный метод в классе, то его обязаны использовать и описывать все наследники? Хотя я сам сейчас это проверю.

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


Логика была такой: есть четыре профессии три ранга и руководители. Мы передаем в этот метод любой объект департамента (кроме Department), например, DepartmentOfSales. Внутри этого департамента есть несколько переменных с разными профессиями. Все они имеют вид профессия_ранк и возможно _босс. Внутри метода есть массив с названиями четырех профессий и цикл проходится по каждой из них, подставляя название профессии $value в большую копипасту. В копипасте есть варианты для трех рангов каждой профессии и боссов. Если переменная с таким названием есть в департаменте и ее значение больше нуля, то запускается цикл, добавляющий нужное количество объектов-работников в массив.
Как сделать по-другому, мне что-то в голову не приходит, но я попробую покопаться.

>Вообще, тут особо нет смысла применять наследование, так как департаменты ничем не отличаются друг от друга, кроме значений полей. Проще просто сделать несколько объектов одного класса. По идее, конечно, и с сотрудниками можно поступить так же.


То есть сделать один класс Departament и создать в нем поле, например, $employeers, для хранения объектов-работников?

>С классом Company та же проблема, что в нем не хранится никакой информации о компании.


Класс Company я создал, чтобы после создания нового объекта этого класса и использования метода getInfoAboutAllCompany, можно было получить объект с данными о каждом департаменте и сумме их значений. В первом варианте я использовал класс bookkeeping, типа бухгалтерия, в котором делал разные методы. Как вообще стоит называть такие классы?
561 1216212
Подскажите пожалуйста, как решить подобную задачу? Регулярку я написал, или тут лучше несколько регулярок сделать и для каждой по новой функцию вызывать?
«Grammar Nazi». Напиши скрипт, проверяющий текст на наличие злостных ошибок:
нет пробела после запятой, точки с запятой, восклицательного знака, вопросительного знака, двоеточия
«жи» или «ши» написано с буквой ы
в тексте есть слово «координально» или «сдесь», «зделал», «зделаю», «зделан»
в тексте есть слова «а» или «но» без запятой перед ними.
(можешь добавить еще несколько правил, если хорошо знаешь русский язык)
В случае обнаружения ошибки скрипт должен писать сообщение об этом и выводить кусок текста с ошибкой (чтобы было понятно, что не так).
562 1216236
>>216145

>Я бы погуглил "php rlogin"


Гуглил, но не нашел внятных примеров с объяснениями. Поэтому и спросил здесь. Может кто сталкивался с подобным и скажет в каком направлении копать.
563 1216330
Дарова деды, допиливаю студентов, зашел в тупик по авторизации пользователя, а конкретно с запросом в бд https://github.com/Lolodin/htdocs/blob/BD-OK/Model/User.php

функция возвращает ид пользователя, даже если пароль был неверным, что я делаю не так?
564 1216519
<?php
$time=date("H:i");
echo $time;
if ($time="08:00")
{
print "Утро";
}
else
{
print "День!";
}
?>

Выдаёт утро в любом случае, почему?
565 1216542
>>216519
Ты присваиваешь значение '
08:00'
>>216330
Сорян парни я слепой, пропусти в запросе значение
566 1216591
>>216519
В смысле? То есть делаю значение строчным? Если да то в чём ошибка. Я не понимаю.
567 1216592
568 1216606
>>216591
ты присваиваешь = вместо сравнения ==
569 1216674
>>216606
А... точно.
570 1216918
Если дабл, то сажусь за ПХП прямо сейчас
Если нет, то сажусь завтра.
571 1216932
Как читать эти ебанутые математические формулы? В пояснении задачи про банкомат такая дичь

>F(n) = min(F(n - a1), F(n - a2),..., F(n - ak)) + 1.

572 1216933
>>216149

> Это плохая идея, так как при обращении к статическим файлам (картинкам например), тоже будет вызываться PHP.


Для статики которую я хочу отдать стоит исключение, т.е. вроде:

RewriteCond %{REQUEST_URI} !\.(css|gif|ico|jpg|js|png|svg|woff|woff2|ttf|eot|pdf)$
RewriteRule .* index.php

Ну и там еще реврайты http->https с редиректом и прочее. Если быть еще более точным, вообще-то статику еще раньше перехватывает nginx и отдает сам. Все равно плохая идея? Я сейчас всё подготовил для выноса файлов за паблик, но там в любом случае остается как минимум бутстраппер (точка входа)? Или я все еще не понимаю чего-то?

>>216151
Читаю пср 7 и не пойму как с их респонс объектом работать.
У меня "роутинг" идет сверху вниз по цепочке юри/ еще каким-то параметрам и там что-то делает, по ходу набирая данные и обратно возвращается уже со всем необходимым для отображения страницы, в т.ч. шаблон итд. Неудобство только в том что приходится везде вручную следить за ошибками и выдавать верные статус коды и хедеры и так далее.
По их стандарту, как я понимаю (и примеры похожего видел), должен в роутер сразу пихать ресопнс-объект и по ходу цепочки допустим возвращать наверх response->withHeader(...) если нужно какой-либо хедер установить.
А как менеджить именно контент который нужен для вывода? И прочее. Не в тело-же пихать и туда-сюда разбирать.
Как я понимаю, если я свои методы навешаю для обмена данными между "слоями" роутера поверх него, то он уже будет не psr-7 совместим - или я ошибаюсь и главное чтобы интерфейс был реализован а остальное не важно?
573 1216950
>>216933
Кажется понял. Просто мне по роутам нужно спускать только реквест и его дополнять данными, респонс же нужен только на самом верху где идет вывод.
574 1216991
Параллельно с psr-7 читаю о мидлварях (для хоторых в том числе стандарт и продумывается) - в теории стакать слои логики выглядит интересно, но потом я вижу вот например такое:
https://github.com/CHH/stack-honeypot/blob/master/src/CHH/Stack/Honeypot.php
... и становится что-то аж противно, почти физически ощущается вонь. Очень странно.
575 1217038
>>216933

Обычно там пишут через RewriteCond проверку, что файла не существует, и только в этом случае вызывают index.php. Если погуглить, легко найти такой пример htaccess: https://gist.github.com/RaVbaker/2254618

Хотя я бы убрал оттуда проверку на папку, так как непонятно, зачем это.

> Если быть еще более точным, вообще-то статику еще раньше перехватывает nginx и отдает сам.



Тогда тебе может быть логичнее поставить за nginx php-fpm и не заморачиваться с Апачем вообще.

> Я сейчас всё подготовил для выноса файлов за паблик, но там в любом случае остается как минимум бутстраппер (точка входа)?



В паблике достаточно оставить только минимальный index.php (а в случае с php-fpm он вообще не обязан быть в паблике, так как путь к скрипту передает нгинкс в параметре SCRIPT_FILENAME и он может быть любым. Но для совместимости с встроенным в PHP сервером и Апачом, и для простоты, лучше все же использовать стандартный index.php в публичной папке), а полноценный бутстрап можно разместить где-то снаружи.

Вот, например, Фейсбук в 2007 случайно отключил выполнение PHP кода и сервер начал раздавать index.php вместо выполнения, можешь поглядеть, если любопытно: https://gist.github.com/nikcub/3833406

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

> Читаю пср 7 и не пойму как с их респонс объектом работать.



Он представляет ответ на HTTP-запрос. В Симфони контроллер получает на вход Request и выдает на выходе Response, а фреймворк уже выводит его содержимое. Это удобно для тестирования, мы можем вызвать контроллер и смотреть, что он там сгенерировал.

Обычно это выглядит так:

public function indexAction(Request $request)
{
,....
return $this->render('template.twig', ['x' => 1, 'y' => 2]);
}

> По их стандарту, как я понимаю (и примеры похожего видел), должен в роутер сразу пихать ресопнс-объект и по ходу цепочки допустим возвращать наверх response->withHeader(...)



У тебя что-то странное. Роутер занимается лишь тем, что по URL определяет, какой контроллер надо вызвать. Зачем ему Response?

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

> Как я понимаю, если я свои методы навешаю для обмена данными между "слоями" роутера поверх него, то он уже будет не psr-7 совместим



Свои методы добавлять можно, но у меня есть ощущение, что у тебя может быть просто неудачная архитектура. Что тебе мешает сделать так, чтобы контроллер получал на вход Request и возвращал Response?

>>216950

> Просто мне по роутам нужно спускать только реквест и его дополнять данными,



Это не очень логично, Request представляет собой пришедший HTTP-запрос, а не свалку разных переменных. Зачем его чем-то дополнять?

> ... и становится что-то аж противно, почти физически ощущается вонь. Очень странно.



Что тут не так, из твоего сообщения не понять, может дело в каких-то твоих личных воспоминаниях?
575 1217038
>>216933

Обычно там пишут через RewriteCond проверку, что файла не существует, и только в этом случае вызывают index.php. Если погуглить, легко найти такой пример htaccess: https://gist.github.com/RaVbaker/2254618

Хотя я бы убрал оттуда проверку на папку, так как непонятно, зачем это.

> Если быть еще более точным, вообще-то статику еще раньше перехватывает nginx и отдает сам.



Тогда тебе может быть логичнее поставить за nginx php-fpm и не заморачиваться с Апачем вообще.

> Я сейчас всё подготовил для выноса файлов за паблик, но там в любом случае остается как минимум бутстраппер (точка входа)?



В паблике достаточно оставить только минимальный index.php (а в случае с php-fpm он вообще не обязан быть в паблике, так как путь к скрипту передает нгинкс в параметре SCRIPT_FILENAME и он может быть любым. Но для совместимости с встроенным в PHP сервером и Апачом, и для простоты, лучше все же использовать стандартный index.php в публичной папке), а полноценный бутстрап можно разместить где-то снаружи.

Вот, например, Фейсбук в 2007 случайно отключил выполнение PHP кода и сервер начал раздавать index.php вместо выполнения, можешь поглядеть, если любопытно: https://gist.github.com/nikcub/3833406

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

> Читаю пср 7 и не пойму как с их респонс объектом работать.



Он представляет ответ на HTTP-запрос. В Симфони контроллер получает на вход Request и выдает на выходе Response, а фреймворк уже выводит его содержимое. Это удобно для тестирования, мы можем вызвать контроллер и смотреть, что он там сгенерировал.

Обычно это выглядит так:

public function indexAction(Request $request)
{
,....
return $this->render('template.twig', ['x' => 1, 'y' => 2]);
}

> По их стандарту, как я понимаю (и примеры похожего видел), должен в роутер сразу пихать ресопнс-объект и по ходу цепочки допустим возвращать наверх response->withHeader(...)



У тебя что-то странное. Роутер занимается лишь тем, что по URL определяет, какой контроллер надо вызвать. Зачем ему Response?

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

> Как я понимаю, если я свои методы навешаю для обмена данными между "слоями" роутера поверх него, то он уже будет не psr-7 совместим



Свои методы добавлять можно, но у меня есть ощущение, что у тебя может быть просто неудачная архитектура. Что тебе мешает сделать так, чтобы контроллер получал на вход Request и возвращал Response?

>>216950

> Просто мне по роутам нужно спускать только реквест и его дополнять данными,



Это не очень логично, Request представляет собой пришедший HTTP-запрос, а не свалку разных переменных. Зачем его чем-то дополнять?

> ... и становится что-то аж противно, почти физически ощущается вонь. Очень странно.



Что тут не так, из твоего сообщения не понять, может дело в каких-то твоих личных воспоминаниях?
576 1217042
Cейчас разбираюсь с ларавелем, а точнее с его ORM eloquent. Такой вопрос: почему свойства объекта модели соответствуют полям в БД? Это же неудобно, допустим, поменялось имя поля в БД, и теперь весь код править надо. И еще почему свойства объекта модели публичные? Нельзя ли, как обычно, их протектед сделать, и через геттеры, сеттеры задавать?
577 1217046
>>217042

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

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

Нет ничего лучше единообразия.

> допустим, поменялось имя поля в БД, и теперь весь код править надо



Это проще чем запомнить по 2 названия для каждого поля.

> почему свойства объекта модели публичные?



Если ты посмотришь исходники класса Model, https://github.com/laravel/framework/blob/5.3/src/Illuminate/Database/Eloquent/Model.php то увидишь, что поля хранятся в массиве $attributes, а публичные свойства имитируются с помощью магических методов __get, __has и __set.

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

Геттеры и сеттеры ты можешь сделать, но это не запретит доступ к свойству напрямую. Это можно победить, переопределив метод __get. При этом другие компоненты фреймворка могут ожидать наличия доступного поля и ломаться без него.

Почему так сделано - потому что это особенность Eloquent, наверно, чтобы не писать геттеры/сеттеры. Так тут принято.
image.png41 Кб, 778x421
578 1217049
Нихуя не пойму. Почему в неправильных ответах?
[code]
$array = [
[1, [2, 3]],
[4, [5, 6]],
];

foreach ($array as list($a, list(, $b))) {
echo "A: $a; B: $b".PHP_EOL;
}
[/spoiler]
579 1217063
>>217038
Сервер достался в таком виде; попробую перенастроить на php-fpm, не знаю правда получится ли - ожидаю обилие сопутствующих проблем при таком переезде.

> Роутер занимается лишь тем, что по URL определяет, какой контроллер надо вызвать.



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

Насчет архитектуры, да скорее всего неудачная. Как я уже писал у меня и контроллеров то нет, тупо лямбды-врапперы для пары строк логики в основном (получил данные, вызвал сервис, отрендерил ответ). Вообще я ранее писал, каких-то реальных проблем нет, все реализовывается, но получается в итоге как-то не КРАСИВО что-ли, и не по стандартам, хотя и дублирования нет и многих других признаков плохого кода. Вот разве что переменные которые вниз по роутам спускаются за глобалки могут сойти.

Я не понимаю как использовать вот эти методики чтобы удобно собирать приложение. Возможно и не пойму пока не найду какой-нибудь достаточно комплексный сайт построенный на этих методиках с открытым кодом и не почитаю как они организовывают процесс. Т.к. одно дело сам фреймворк читать например и другое - как его по итогу применяют.

> Что тут не так, из твоего сообщения не понять, может дело в каких-то твоих личных воспоминаниях?



Возможно, просто выглядит как говнокод про который я столько читал, вот он на ходу модит хтмл ответ регулярками с хердоком, а потом ищи че откуда куда зареплейсилось, и обратно от клиентов весь этот инъекцированный мусор тоже придет и через весь стак, а по итогу функционал - по сути-то простейший. А я как раз вроде бы наоборот хочу от подобного избавиться (хотя конкретно такого у меня нет). А на самом деле - нормально так делать?
580 1217113
>>217063
Подумал еще, вообще да логично исходя из идеи мидлфейр что это типа как слои вебсервисов передавать по ним хттп сообщения и модифицировать. Но выглядит в итоге все равно как-то ужасно.
581 1217119
>>217113

middleware не совсем для этого. Это слои, которые позволяют преобразовать запрос или ответ.

Типичные применения:

- ограничение доступа к определенным страницам с помощью пароля
- сжатие HTTP-ответа
- прозрачное для внутренних слоев шифрование/расшифровка кук
- логгирование запросов или ответов

То есть это для работы на уровне HTTP протокола. Не для того, чтобы сделать какой-то раздел сайта. Не знаю, что ты имел в виду под "вебсервисами", но это явно не то.

То что ты пишешь, про коллбеки вместо контроллеров, никак не мешает сделать, чтобы он возвращал объект Response. Пример можно увидеть в фреймворке Slim, например.

> но получается в итоге как-то не КРАСИВО что-ли, и не по стандартам, хотя и дублирования нет и многих других признаков плохого кода



Если это ты там что-то писал про роутер, в который ты хочешь передавать response, и про модификацию request, то у меня ощущение, что проблемы все же есть.

> Я не понимаю как использовать вот эти методики чтобы удобно собирать приложение



Посмотри туториал по созданию сайта на Симфони например. Также, по MVC у меня есть урок с маленьким примером кода: https://github.com/codedokode/pasta/blob/master/arch/mvc.md
582 1217289
>>216199
бамп
583 1217349
>>217049
ты <?php в начале забыл написать.
584 1217620
Когда использование констант является хорошей практикой?
Даже если значение не меняется я все равно использую переменную.
Я думаю оправданно const только для конфигов?
585 1217653
>>217620
Любые данные, которые могут быть использованы многократно и не должны изменяться. Под эту категорию могут попадать какие угодно данные, зависит от того, что пишешь.

Прелесть констант в том, что их значение нельзя поменять во время выполнения скрипта. Поэтому их удобно юзать для указания пути, например.
586 1217657
Я могу с при вызове __call($k, $v) получать ключи аргументов в $v? А то получается что при вызове $класс->неизвестнаяФункция($A = 'b') у меня в результате будет только 'b'.
587 1217670
>>217657

Что значит "ключи аргументов"? В функцию передаются только значения аргументов.

Запись неизвестнаяФункция($A = 'b') - это просто объединение присваивания переменной и вызова функции и это то же самое, что

$A = 'b';
функция($A);
588 1217671
>>217657

И вообще, у аргументов функции нет "ключей".
589 1217673
>>217671
>>217670
Название переменной. В питоне например всякие kwargs есть при вызове __call__, и я могу вызывать рандомную функцию и передавать туда (ключ = значение, ключ2 = значение2), которые потом можно использовать.
590 1217674
>>217673

PHP это не Питон, здесь другой синтаксис. В PHP у аргументов нет ключей, только если номер по порядку.
591 1217679
>>217674

> В PHP у аргументов нет ключей


Чиво блядь? http://php.net/manual/ru/functions.arguments.php в пхп можно функции присваивать аргументам (ключам) значение.
592 1217764
>>217674

>PHP это не Питон


СИРЬЁЗНА БЛЯДЬ? А я то думаю чего тут синтаксис другой
593 1217998
Таки допилил файлообменник на слиме. Вроде все сделал (поиск через сфинкс, иерархические комменты, аякс), что в задаче было. ОП, если найдешь время посмотреть, что я там наговногодил, то буду благодарен:
https://github.com/moabit/filehosting
594 1218052
>>217679

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

> http://php.net/manual/ru/functions.arguments.php



"ключей" у аргументов нет. Знак равно в определении (не в вызове) задает значения по умолчанию. Знак равно при вызове функции это просто присваивание переменной. Если в определении функции написано

function x($a = 1, $b= 32) { ... }

А в вызове написать

x($b=10);

То будет вызвана функция x(10) и внутри нее будет $a = 10, $b = 32.

Имена переменных при вызове функции не имеют значения. Это не именованные аргументы, как в Питоне. Если тебе нужны аргументы с ключами, можно попробовать имитировать их передачей массива, но будет довольно коряво.
595 1218103
>>218052
Зелёный, плез. Будешь мне рассказывать тут как работают аргументы у функции. Такую херню настрочил, ещё и с умным видом.
596 1218257
В каких ситуациях рационально использовать тернарный оператор?
597 1218397
>>218257
Когда у тебя два стула.
Например отображать или не отображать переменную
$foo = !empty($bar) ? "fizz" : "buzz";
598 1218427
>>218397

> $foo = !empty($bar) ? "fizz" : "buzz";


> !empty(...)



О, а вот и свежий говнокод завезли. Так уже не пишут, это bad practice. Ибо смысл функции - вернуть истину, если переменная пуста. Тавтология от мира программирования:

Not empty ? True : false

Empty ? True : False

Короче, если ты заранее знаешь, что переменная есть, но не знаешь есть ли у неё значение, используй просто empty без !.
599 1218439
>>218397
Добра тебе, няша!
600 1218477
Есть годные видео курсы от нуля до сеньёра? Я камушек пиздец, без объяснений не могу и до меня долго доходит, но доходит, если пересмотреть
601 1218486
Привет аноны. Вкатываюсь к вам вот с чем.
Я - 31 лвл. Есть постоянная работка. Нравится прогить, знаю синтаксис JS + DOM , python. Изучил основы react.js, кое что даже ваял самостоятельно. По факту - джун.
Цель - в ближайшие пару месяцев получить какую нибудь подработку, пусть совсем лайтовую. И хочу изучить бэк, потому что с фронт JS-ом чувствую себя неполноценным каким то. Еще знаю node.js по вершкам.

И встал я в тяжком раздумье - что мне делать для моей цели? Выбрать ли питон/джанга или вкотиться в пхп. Повторюсь цель - через пару месяцев начать зарабатывать небольшие, но деньги. Короче ПРИНЦИПИАЛЬНАЯ ЦЕЛЬ.
Уверен тут есть аноны с опытом на разных языках. Дайте совет мудрый - для моей цели стоит мне вкатываться в пхп? Работы на нем и правда очень много. Или все же сосредоточиться на питоне?

да я знаю что я свой вопрос повпихивал в через-один тред
602 1218498
>>218477
Учебника ОПа + документация PHP + Курсы от "Специалиста", которые ведет Борисов И.О. + курс от Lynda.com https://www.youtube.com/watch?v=Mg3iNP6miCE

Проходишь одну тему по всем представленным учебником и решаешь задачки ОПа.
Безымянный.png1 Кб, 343x62
603 1218569
print_r("— Did Joffrey agree?\n")("— He did. He also said \"I love using \\n\".");
Чо не так-то блять?
604 1218607
Посоны, где бедному вкатывальщику спиратить phpstorm под линукс?
605 1218614
>>218607
Качай с оф сайта, активируй сервером, коих в гугле хватает
606 1218615
>>218614
Благодарю вас, добрый господин
607 1218646
>>216147

Чет аж доставило что кто-то внимание на мой говнокод обратил, спасибо за советы
608 1218648
>>218646

У нас проверяют весь код в треде, просто иногда надо подождать и побампать.
1-435 609 1218668
>>200385

У тебя названия переменных не очень удачные, вроде arrayTemplate_1_2 - получается длинновато и непонятно. Решить можно было 2 способами, вообще без функций, просто выбирая и выводя по 1 слову, либо сделав шаблон всего стиха сразу такого вида: [$words1, $words2, $words3, ["\n"], $words1, ...].

>>201406

Немного запоздалый ответ, но если ты используешь встроенный в PHP Storm сервер, то это может быть какой-то косяк с его настройкой. Если твой файл имеет расширение php и начинается с маркера <?php, то код должен выполняться.

Для сравнения можно запустить встроенный в PHP сервер (описан тут https://github.com/codedokode/pasta/blob/master/soft/web-server.md#Веб-сервер ).

>>201471

Это хорошо, если ты видишь такие недостатки.

>>201598

Тебе надо изучать CSS и позиционирование. Такой вывод можно сделать с помощью inline-block или float.

>>201676

Есть такое понятие, как стиль оформления кода, надо смотреть, какой стиль используется в твоем проекте. В PSR-1/2 пробелы там не ставятся.

>>202029

Может быть, у тебя скрипт назван не так, как в книжке? В атрибуте action указывается имя скрипта.
610 1218670
>>202316

- пишешь выражение "один любой символ из набора пробел, минус, скобки"
- пишешь выражение "любое число таких символов"
- пишешь выражение "ровно 1 цифра и за ней любое число таких символов"
- ставишь это в скобки и указываешь повтор ровно 10 раз
- дописываешь оставшееся

>>202495

Непонятно, в чем вопрос. С помощью phpexcel читаешь данные из файла и с помощью mysqli или PDO вставляешь их в БД с помощью запроса insert.

>>202584

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

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

>>202659

Если там используется стандартный PHP, то можно просто самому найти и установить нужную библшиотеку.

>>202814

Есть: https://habr.com/company/badoo/blog/415359/

>>203049

Что-то выводится до ob_start(). Например, в начале файла может быть символ BOM: https://en.wikipedia.org/wiki/Byte_order_mark

Надо сохранять в utf-8 без BOM.
610 1218670
>>202316

- пишешь выражение "один любой символ из набора пробел, минус, скобки"
- пишешь выражение "любое число таких символов"
- пишешь выражение "ровно 1 цифра и за ней любое число таких символов"
- ставишь это в скобки и указываешь повтор ровно 10 раз
- дописываешь оставшееся

>>202495

Непонятно, в чем вопрос. С помощью phpexcel читаешь данные из файла и с помощью mysqli или PDO вставляешь их в БД с помощью запроса insert.

>>202584

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

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

>>202659

Если там используется стандартный PHP, то можно просто самому найти и установить нужную библшиотеку.

>>202814

Есть: https://habr.com/company/badoo/blog/415359/

>>203049

Что-то выводится до ob_start(). Например, в начале файла может быть символ BOM: https://en.wikipedia.org/wiki/Byte_order_mark

Надо сохранять в utf-8 без BOM.
611 1218672
>>203062

Можно через сессии, но там свои подвохи, например:

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

То есть в любом случае есть свои подвохи.

>>203381

Наверно да

>>203394
>>207291

Чтобы переносы строк нормально работали и в браузере и в ideone (и в консоли), можно использовать для этого \n, а в начале программы поставить

header("Content-Type: text/plain; charset=utf-8");

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

Иначе перенос строки будет в исходном коде страницы (его можно увидеть нажав Ctrl + U), но на самой странице его не будет.

>>203998

А что она должна по задумке выводить в обоих случаях?
611 1218672
>>203062

Можно через сессии, но там свои подвохи, например:

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

То есть в любом случае есть свои подвохи.

>>203381

Наверно да

>>203394
>>207291

Чтобы переносы строк нормально работали и в браузере и в ideone (и в консоли), можно использовать для этого \n, а в начале программы поставить

header("Content-Type: text/plain; charset=utf-8");

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

Иначе перенос строки будет в исходном коде страницы (его можно увидеть нажав Ctrl + U), но на самой странице его не будет.

>>203998

А что она должна по задумке выводить в обоих случаях?
612 1218673
>>204353

Готового решения для твоего случая, наверно, нету. Надо писать с нуля.

>>208106

Это проблема используемой тобой IDE.

> Теперь думаю как более правильно в понимании сурьёзного программирования это следует оформить.



Простой вариант:

$parsers = [
['host' => 'xyz.com', 'parser' => function () { ... }],
['host' => 'xyz2.com', 'parser' => function () { ... }],
['host' => 'xyz3.com', 'parser' => function () { ... }],
];

$parser = selectParser($parsers, 'http://xyz.com/address');

Вариант посложнее:

['host' => 'xyz.com', 'parser' => new XYZParser],
...

И еще сложнее:

$selector = new ParserSelector;
$selector->addParser('xyz.com', new XYZParser());

$parser = $selector->getParserFor('http://xyz.com/address');

А вообще, ты по моему зря заморачиваешься. Зачем тебе в парсерах какой-то сложный ООП? Ради чего ты хочешь это сделать? Просто сделай массив парсеров и выбирай из него.
612 1218673
>>204353

Готового решения для твоего случая, наверно, нету. Надо писать с нуля.

>>208106

Это проблема используемой тобой IDE.

> Теперь думаю как более правильно в понимании сурьёзного программирования это следует оформить.



Простой вариант:

$parsers = [
['host' => 'xyz.com', 'parser' => function () { ... }],
['host' => 'xyz2.com', 'parser' => function () { ... }],
['host' => 'xyz3.com', 'parser' => function () { ... }],
];

$parser = selectParser($parsers, 'http://xyz.com/address');

Вариант посложнее:

['host' => 'xyz.com', 'parser' => new XYZParser],
...

И еще сложнее:

$selector = new ParserSelector;
$selector->addParser('xyz.com', new XYZParser());

$parser = $selector->getParserFor('http://xyz.com/address');

А вообще, ты по моему зря заморачиваешься. Зачем тебе в парсерах какой-то сложный ООП? Ради чего ты хочешь это сделать? Просто сделай массив парсеров и выбирай из него.
613 1218674
>>208110

> а между тем есть данные что это медленнее работает



Где результаты измерений? Ты понимаешь, что там разница может быть в микросекундах?

>>209145

> Я пытаюсь это сделать через .htaccess так как это единственный доступный мне вариант сейчас.



> Если я правильно понял, точка перед именем домена означает, что кука будет использоваться на этом домене и на всех его поддоменах. А мне нужно, чтобы она использовалась только на этом домене и на поддоменах была недоступна?



Не уверен, что это можно сделать. Но ты можешь просто дать кукам разные названия на разных доменах. Или задать разные папки для хранения файлов сессий на разных доменах - это наверно тоже настраивается через htaccess.

Как это сделать - написано в мануале: http://php.net/manual/ru/session.configuration.php - точно так же через htaccess. Это кстати, можно и из кода через ini_set делать. В мануале про php.ini написано, как эти параметры можно менять.
614 1218754
>>213694
А ты няшный?
615 1218771
>>218569
у тебя двойной слеш перед n.
Плюс еще почему-то он перед точкой.
image.png148 Кб, 500x332
Я на дне 616 1218876
Анончики, я спустился на самое дно, дропнул работу и не могу найти новую, с тянкой отношения летят впизду, я чувствую себя ужасно тупым и ни на что не способным, все валится из рук и не хочется нихуя делать. Эти все проблемы сжирают меня, никакого кайфа от жизни.

Я пытаюсь мыслить позитивно, но все что происходит со мной еще больше вгоняет меня депрессию. Как быть, аноны?
617 1218902
>>218876
Брось тянку, устройся на склад/завод 12/2, забухай.
618 1218904
>>218876
Бросай все и езжай на море или в поход, тянку в пизду!
619 1219015
>>218771

>у тебя двойной слеш перед n.


Ну да, что бы \n не засчитало как команду переноса строки а вывело как текст

>Плюс еще почему-то он перед точкой.


Не перед точкой, а перед кавычкой, чтобы её тоже вывело как текст.
Решение сам уже нашёл
620 1219025
Фух ,еле тред нашел

АНОНЧИКИ, НЕ ДАЙТЕ ЧОКНУТЬСЯ

Есть одно приложение на симфони и оно как-то возвращает мне json, вот такой:

{"products":[{"product":{"title":"Product1","id":"82cbf74569427f33b97d3ffcebba9bab","formatted_price":"10.00","price":"10.00","image":"","url":"\/product1"},"quantity":"1"}],"data":{"firstname":"ffd","lastname":"dffdf","email":"nnS3ANUSgf'Q&gfPUNCTUMcj8Xom","address":"\u0432\u0430\u043f\u0432\u0430\u043f\u0432","shipping_method":"All countries","payment_method":"paypal_express"},"shipping":{"method":"All countries","cost":"0.00"},"payment":"paypal","amount":"10.00","taxes":"0.00","token":"OnUIIJiNxd","gateway":"paypal_express"}

И нужно привести его к читаемому виду, может выделить отдельные элементы масива. Но никак немогу отладить его, не знаю куда лезть, оно даже при ошибке в лог сервера не пишет.

- В общем $order в виде выше шлет json,
- json_decode($order, true) не шлет ничего
- html_entity_decode($order) затем json_decode тоже не шлет нихуя
- htmlspecialchars_decode тоже не работает

Я главное не понимаю, как мне записать ,если тестить этот json - в кавычках ошибки валит, нужно экранировать всё или как?
621 1219039
>>219025
https://ideone.com/uxLCl2
Чет я не понял твой поток, что именно у тебя не работает?
622 1219045
>>219039
Да это я баран: сначала включал эту штуку в двойные кавычки (у тебя правильно) , а затем понял, что он возвращает обьект. Так же, да? Ой вот я лох
623 1219051
>>219039
А как мне теперь значение title, например, получить, братишка?
625 1219065
>>219063
Ты очень хороший человек, я желаю тебе добра и процветания. да, я нуб, но я очень устал на этой жаре сегодня и ничего уже не соображаю
626 1219227
Накатил php+nginx. Не пойму как удобно отображать причину своих 500-ки, ну не заглядывать же каждый раз в лог сервера. Как это делают белые люди?
627 1219228
>>219227
500-ок
быстрофикс
628 1219235
Привет, сладкие, нужен ваш совет.
Я делаю скрипт который читает чат Youtube. Он выводит топ комментаторов. Участник чата, который вошел в топ, может писать команды типа !RAT и на сайте должен поменяться его иконка.

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

<?
$json = json_decode($result, true);
//Создаем массив для всех авторов
$authors = array();
$comments = array();
$combine = array();
foreach ($json['items'] as $value){

//определяем комментарий и пихаем его в массив
$comment = $value['snippet']['displayMessage'];
array_push($comments, $comment);

//определяем автора, пихаем в массив
$author=$value['authorDetails']['displayName'];
array_push($authors, $author);

// создаем массив автор - сообщение
$combine = array_combine($keys, $values);
}
//считаем значения
$occurences = array_count_values($authors);
?>
628 1219235
Привет, сладкие, нужен ваш совет.
Я делаю скрипт который читает чат Youtube. Он выводит топ комментаторов. Участник чата, который вошел в топ, может писать команды типа !RAT и на сайте должен поменяться его иконка.

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

<?
$json = json_decode($result, true);
//Создаем массив для всех авторов
$authors = array();
$comments = array();
$combine = array();
foreach ($json['items'] as $value){

//определяем комментарий и пихаем его в массив
$comment = $value['snippet']['displayMessage'];
array_push($comments, $comment);

//определяем автора, пихаем в массив
$author=$value['authorDetails']['displayName'];
array_push($authors, $author);

// создаем массив автор - сообщение
$combine = array_combine($keys, $values);
}
//считаем значения
$occurences = array_count_values($authors);
?>
629 1219238
>>218673
Проблема не в IDE, а в том, что система типов в PHP не позволяет написать $parsers = new Map<string, callable>, не говоря уже о том, чтобы типизировать функции. Ещё проблема в PHP коммьюнити, которое до сих пор не договорилось о том, как хотя бы докблоками описывать дженерики, чтобы код могли анализировать IDE и статические анализаторы.

>>217046
Замечу, что в Laravel при обращении к свойству модели проверяется существования метода setPropertyAttribute, где Property это свойство, к которому происходит обращение, в таком случае мы не можем выставить значение свойства, минуя сеттер. Видно по коду: https://github.com/laravel/framework/blob/5.3/src/Illuminate/Database/Eloquent/Model.php#L2876

>>216145

> Докер - это ведь костыль по большому счету


Ну зачем так, докер решает много проблем, и это наоборот хорошо, что даже PHP-шники начинают его использовать. У нас вот встречаются проекты, которые нужно очень долго разворачивать из-за того, что старые и требуют хитрой настройки. И история затягивается ещё сильнее, когда у человека мак, а инструкция в readme написана для линукса. Тут докер очень сильно всё упрощает. Вообще у нас в компании почему-то считается нормальным давать несколько часов на разворачивание проекта, а ведь это может занять пару минут с докером.

>>219227
Во фреймворках обычно это всё настроено и там есть понятие окружения (дев, прод, тест). В локальной разработке (дев) удобно сразу получать сообщения об ошибке на экран с полным стектрейсом: http://filp.github.io/whoops/demo/ .
На продакшене ошибки пользователю показывать не надо, там либо смотришь логи, либо настраиваешь логгер так, чтобы он слал оповещения на почту об возникающих исключениях на сайте. У нас используются Sentry и Rollbar

>>218876
С нытьём проследуй в /b или перезвоним-тред.
630 1219247
>>219238

>Во фреймворках обычно это всё настроено и там есть понятие окружения (дев, прод, тест). В локальной разработке (дев) удобно сразу получать сообщения об ошибке на экран с полным стектрейсом: http://filp.github.io/whoops/demo/ .


>На продакшене ошибки пользователю показывать не надо, там либо смотришь логи, либо настраиваешь логгер так, чтобы он слал оповещения на почту об возникающих исключениях на сайте. У нас используются Sentry и Rollbar



бро, объясни, как быстро сделать так, чтобы мне ошибки выводились на экран со стектрейсом(я к этому на рельсах привык)
maxresdefault.jpg29 Кб, 1024x576
631 1219265
>>219247
Ну ты индеец, тебе же ссылку кинули
https://github.com/filp/whoops
632 1219276
>>219265
делаю, как там написано, получаю Class 'Whoops\Run' not found
633 1219279
>>219276
Оно заработало, но мне пришлось дохуя всего перетащить в папку со своим кодом.
И что, мне в каждом своем файле подключать эту херню?
634 1219346
>>217119
Я неправильно понял идею middleware и как используется httpMessage у людей. Теперь получше представляю.

>>218673
>>218674
Ну вот у меня массив. Я не мерил, но видел (перепроверять лично всё времени не хватит):

> Variable functions took 0.125958204269 seconds.


> call_user_func took 0.485446929932 seconds.


> eval took 2.78526711464 seconds.


Да, там бенчмарк и в реальности я за скрипт вызываю их не 10к раз. Но курочка по зернышку как говорится... Речь не только о микрооптимизациях: также большой вопрос что красивее - $func( ... ) или call_user_func( $func, ... )
Я просто не уверен что вот так держать массив с лямбдами укладывается в понятие "хороших практик" и для остальных будет выглядеть достаточно чисто.
Аннотации выглядят как припарка. В Plates шаблонах в заголовках тоже прописываю, там по другому вообще нельзя как я понимаю.
635 1219348
Анон, объясни самым маленьким, что такое php-fpm? Если я сделал apt get install php, этот fpm у меня уже есть, или надо ставить отдельно?
636 1219377
>>219247

В PHP для этого достаточно включить display_errors= 1 в php.ini. Не понимаю, зачем вы тут какие-то фреймворки и библиотеки приплели. Это встроено в сам PHP.

Стектрейс доступен только для исключений, для ошибок просто показывается название файла и строка.
637 1219379
>>219279

Сторонние библиотеки принято подключать с помощью менеджера пакетов composer. Ничего перетаскивать не надо.
638 1219400
Посоны, ткните носом, что почитать для решения следующей задачи: я из своего кода шлю серверу запрос, получаю ответ, что все ок, дальше я жду от него запроса ко мне, в котором он и передаст нужные мне данные. Мне нужно понять как это вообще реализуется.
639 1219408
>>219379
Я с его помощью и сделал, но что-то пошло не так и заработало, только когда я всю папку composer перетащил в папку со своим проектом. Напутал с путями?
640 1219432
Наверно глупый вопрос, но мне все таки интересно, а как работает require, include "внутри"? По мне так это выглядит как какая то магия. Написал require и файл подключился.
641 1219448
>>219432

Файлы в PHP не подключаются. require/include просто выполняет код из указанного файла. То есть файл загружается и выполняется написанный в нем код, а затем продолжается выполнение основной программы.

Если ты сталкивался с include в языках вроде C то в PHP ничего подобного (препроцессора) нету. include в PHP не имеет ничего общего с #include в Си.

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

Пиздец я тупой. symphony framewrk
643 1219805
Вообще у кого-то есть опыт отладки приложения на symphony? Эта еба даже в вебсервер-лог ошибки не всегда пишет. Остается только догадываться, что там: переменая, массив или обьект. Жизнь боль.

Накатив phpstorm и xdebug, я смогу отлавливать все это добро?

Я делал маленький хук, а ебался два дня.
644 1219810
>>219805

> Я делал маленький хук, а ебался два дня.


В цитатник) Пеши есчо.
645 1219834
>>219400
Мне, похоже, надо смотреть в сторону очередей и воркеров. Можно ли это сделать с помощью php-fpm?(ngnix, если это играет роль)
646 1219835
Какой у вас есть актуальные фреймворки для ньюфага (точнее как ньюфага, я когда-то писал неплохие проекты по статистическим данным из джсона во всяких играх, жаль они никому не нужны были особо, но теперь я уже ничего не помню). Нужно и в этот раз читать джейсоны и красивенько отображать данные. Атом или вижуал код под пхп?
647 1219981
>>219785

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

>>219805

Вообще, в Симфони как раз есть логгирование, просто надо уметь настраивать его в конфиге. Ты можешь логгировать все в обычный файл, например, также в dev окружении внизу страницы есть такая модная панель (web toolbar), которая показывает лог, выполненные запросы, и многое другое: https://symfony.com/blog/new-in-symfony-3-1-web-debug-toolbar-and-profiler-enhancements

Также, в Симфони есть вспомогательные команды для отладки: https://symfony.com/doc/3.4/debug/debugging.html

Использовать xdebug + phpstorm для отладки ты конечно можешь, но надо внимательно изучать его документацию, чтобы не тратить потом зря время на настройку.

Если тебе интересно все, что происходит во время обработки запроса, какие функции вызываются, то самую подробную информацию дает trace в xdebug - туда пишется каждый вызов каждой функции. Логи трейса огромные, и нужно приложение для их просмотра, вроде в phpstorm такой функционал есть.

>>219810

Зачем это писать? Тебе скучно? Иди скучай в другой тред.

>>219400

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

Также, если у тебя OAuth, для него есть готовые библиотеки.

>>219834

Если речь об OAuth, то это не требуется.
647 1219981
>>219785

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

>>219805

Вообще, в Симфони как раз есть логгирование, просто надо уметь настраивать его в конфиге. Ты можешь логгировать все в обычный файл, например, также в dev окружении внизу страницы есть такая модная панель (web toolbar), которая показывает лог, выполненные запросы, и многое другое: https://symfony.com/blog/new-in-symfony-3-1-web-debug-toolbar-and-profiler-enhancements

Также, в Симфони есть вспомогательные команды для отладки: https://symfony.com/doc/3.4/debug/debugging.html

Использовать xdebug + phpstorm для отладки ты конечно можешь, но надо внимательно изучать его документацию, чтобы не тратить потом зря время на настройку.

Если тебе интересно все, что происходит во время обработки запроса, какие функции вызываются, то самую подробную информацию дает trace в xdebug - туда пишется каждый вызов каждой функции. Логи трейса огромные, и нужно приложение для их просмотра, вроде в phpstorm такой функционал есть.

>>219810

Зачем это писать? Тебе скучно? Иди скучай в другой тред.

>>219400

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

Также, если у тебя OAuth, для него есть готовые библиотеки.

>>219834

Если речь об OAuth, то это не требуется.
648 1220010
Помогите нубу: установил php, установил mysql, теперь, как я понял, где-то нужно ввести --with-mysqli, чтобы все заработало, а вот где?
649 1220011
>>219981

>Это OAuth?


я на 95% уверен, что это про очереди и воркеры и на 40% уверен, что это как-то связано с связано с php-fpm
650 1220030
>>219981

>Вообще, в Симфони как раз есть логгирование, просто надо уметь настраивать его в конфиге. Ты можешь логгировать все в обычный файл, например, также в dev окружении внизу страницы есть такая модная панель (web toolbar), которая показывает лог, выполненные запросы, и многое другое: https://symfony.com/blog/new-in-symfony-3-1-web-debug-toolbar-and-profiler-enhancements


>


>Также, в Симфони есть вспомогательные команды для отладки: https://symfony.com/doc/3.4/debug/debugging.html



Вот спасибо тебе, бро, счас буду смотреть.
651 1220039
>>219981

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



Так я уже разрешил проблему: это была grav.cms на этом фреймворке, я делал плагин к маркетплейсу, но делал костыльно - по хорошему надо разворачивать окружение на линуксе и дебажить, я просто не привык, что так вслепую что-то происходит внутри движка, на простых скриптых типа wordpress сразу можно найти ошибку, а тут ничего. Короче, это я рукожоп, счас буду линукс на виртуалку ставить.

Логирование в grav.cms походу не включили, по крайней мере полноценное, иногда php-fpm писал в лог, иногда нет.
652 1220063
>>220039

>Логирование в grav.cms походу не включили, по крайней мере пол



Логгирование в Симфони реализовано через monolog и настраивается в конфиге: https://symfony.com/doc/current/logging.html
13693836876989.jpg32 Кб, 602x303
653 1220109
Можно ли создавать функцию в функции? Можно ли вызывать функцию в другой функции?
654 1220121
>>220109
Можно
655 1220124
>>220109

> Можно ли создавать функцию в функции?



Можно

> Можно ли вызывать функцию в другой функции?



Можно
656 1220145
>>220109

Создавать одну неанонимную функцию внутри другой - плохая идея, так как при второй попытке создать функцию с тем же именем произойдет фатальная ошибка.
657 1220209
Реквест success story от тех кто устроился на работку.
Что спрашивали на собесе? Смотрели гитхаб? Сколько зп?
Город? Возраст? Как оно вообще, доволен?
658 1220232
>>220209
Ты тредом ошибся.
659 1220288
>>220232
Нет ты

>>Можно подробнее про поиск работы, собеседования - нет, ОП писать не будет, но может кто из анонов захочет рассказать. Поищите тред перезвонивших, а также раздел /wrk/

660 1220365
Посоны, в моей мухосрани нужны либо миддло-сеньоры, либо разрабы на битриксе, мне сказали что битрикс это билет в один конец. Кто нибудь может дать дельный совет, стоит ли оно того, то что битрикс это полная хуйня слышал тысячу раз, но выбора у меня особо нет, к сожалению, хочу узнать мнение высокоуважаемого анона.
661 1220387
>>220288
Нюфаня, шапке лет больше чем тебе. Актуально на сей момент только доска про трудоустройство и тред мы вам перезвоним, всё.

Прохладные тут пилят шизики 300кк/пикасекунду.
662 1220390
>>220365
Битрикс это как 1с. One way ticket. Олнажды погрузившись в эти дебри, уже сложно будет перекатиться в нечто другое. В твоем положении выбора нет и поэтому вкатывайся, через фриланс потом старайся копейку заработать разбавив рутину чем то что по душе.
663 1220439
Может у кого-то тут есть на примете годные гитхабы с простыми новичковыми проектами на реакте? Хочу реакт начать учить.
664 1220443
>>220288
>>220387

Он прав, вопросы про работу конечно можно задавать, просто ОПу некогда на них отвечать, так как есть другие дела. А обсуждать, пожалуйста, обсуждайте. Кому неинтересно - проходите мимо в любой другой тред.

Плюс можно в архиве поискать по словам вроде "работа", "устроился", "вкатился": https://phpclub.tech/search/?q=вкатился
665 1220560
>>220439
В вебаче фронтэнд тред
666 1220685
Поясните за такое.
Есть один SQL-запрос, в нем есть сложная конструкция из CONCAT и IF, которая составляет одно из полей из других полей таблицы. Типа SELECT CONCAT(IF(CONCAT(IF(v.god = 'allah', 'rulit', 'saset')))) AS my_field FROM vovan_shit AS v;
Мне понадобилось это составное поле в другом запросе. Ясен красен, копипастить кусок кода - как-то по-говнокодерски.
Как в MySQL (обертка PDO) переиспользовать код?
667 1220688
>>220685

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

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

Другой вариант - не делать 2 SQL запроса, а сделать функцию, которая в зависимости от переданных параметров меняет условия поиска данных.
668 1220689
задачка про калькулятор https://ideone.com/Z6NzBK
подскажите, пожалуйста, стоило ли так делать
669 1220700
https://github.com/Lolodin/htdocs/blob/6f5222080407a05e1c7fad3c1234c4ca5f68f3e8/Model/User.php#L129
Суть: делаю студентов, в личном кабинете сделал форму редактирования, она отправляет пока что имя и фамилию, первый раз скрипт отработал нормально, но сейчас данные в БД не обновляются, запрос вроде корректный, посмотрите пожалуйста мой говнокод
670 1220721
>>220700

>https://github.com/Lolodin/htdocs/blob/6f5222080407a05e1c7fad3c1234c4ca5f68f3e8/Model/User.php#L129



Ты включил у себя в php.ini display_errors=1 ?

Также, ты для PDO не включил режим информирования об ошибках, то есть он их молча игнорирует и не говорит о них. Почитай внимательно комментарии к задаче ( https://github.com/codedokode/pasta/blob/master/student-list.md#Работа-с-базой-данных-из-php ) или мануал по PDO про ERRMODE_EXCEPTION. Когда ты включишь вывод ошибок, ты наверняка увидишь причину проблемы.

В будущем всегда интересуйся, как та или иная библиотека сообщает об ошибках.
671 1220722
>>220721
Разобрался, надо было просто кавычки добавить перед переменными которые содержат строки, плейсхолдерах он автоматом ставит, а тут вручную нужно
672 1220725
>>220689
Мистер ОП, пояснял что числа лучше не переводить в стоку.
673 1220777
>>220725
*строку
674 1220825
>>199390 (OP)
Оп, мне сейчас понадобится кеш для рескейленых картинок (именно рескейл, для иконок там отдельная решенная тема).
Проблема в том что готового подходящего решения я не нашел...
Есть пара нюансов: мне нужно ограничивать жизнь файлов именно максимальным размером кеша а не временем; нужно чтобы новые файлы перезаписывали старые; файлы только пишутся но не читаются; хранить нужно строго именно файлы на диске; нужно минимальное дисковое i/o на измерение размера кеша и поиск старых файлов. Кажется сделать легко. Что я думаю собрать: с fs взаимодействие только через запись и удаление файлов (и touch при обновлении), сама инфа о том какие файлы сейчас находятся в кеше и какое у них время держать в memcached (кеш в кеше лол). На случай утраты инфы из ram при старте один раз траверсить директорию на наличие файлов и их таймстемпы.
Что думаешь?
675 1220977
https://ideone.com/iFP23K

Слушай, оп. А как создать ключ дешифровки? То есть что он из себя представляет? Или ключи только для побитового кодирования, когда в бинарном режиме сдвиг бит делаешь?
676 1221076
Cап! Аноны, такой вопрос. Сейчас допиливаю для знакомого интернет магазин на ларавеле. Очень хотел бы выложить его на свой гитхаб для портфолио. Cтоит ли это делать с точки зрения безопасности? Это мой первый код, который я для кого то за деньги пишу, поэтому не знаю, что делать.
677 1221129
ОП-молодец, почему эта регулярка пропускает номер начинающийся на "7", я же круглыми скобками даю понять что нужен только "+7"
$regexp = '![(//+7)8]{1,2}[-(]?[0-9]{3}[)-]?[0-9]{3}[-]?[0-9]{2}[-]?[0-9]{2}[-]?!';
678 1221132
>>221129
Слэшы развернул, брал плюс в квадратные скобки, не помогло
679 1221155
>>221129
квадратные скобки равны одному символу. если ты ставишь внутри них несколько символов, он будет искать любой из них твоя регулярка найдёт номер, начинающийся со слеша, плюса, семи, восьми, или со скобки
680 1221191
Хелп https://ideone.com/s0rwJR#stdin
Если без условий if то в строчке долга выводит отрицательное число, но если я добавляю условие, строка с долгом становится нормальной, но сумма выплаты по кредиту повторяет предыдущую.
681 1221203
Всем пасиб, сам нашел свои косяки, все исправил
682 1221347
Я правильно понимаю как работает php на серевере: запрос от клиента, потом апач после запроса запускает интерпретатор, который исполняет index.php, и затем апач отдает результат того, что выполнилось? Или это немного по другому работает?
683 1221379
>>221347
Правильно. Если хочешь подробнее узнать как это всё работает, то гугли эталонную модель OSI 4 или 5 уровень, не помню точно.

В общих словах, роль апача слушать входящий траффик на порту, по умолчанию 80 для http и 443 для https. РНР в апаче может работать как CGI (FastCGI) и как модуль сервера. В одном случае будет запускаться php, в другом апач при помощи модуля рнр будет обрабатывать запросы.

Чтобы более понимать почитай про протокол http.
684 1221596
Посоны, объясните: я из php+fpm+nginx шлю post запрос на какой-то сервер и тут же получаю ответ, все ок. Через несколько секунд этот сервер должен послать запрос мне, но в логах я его не вижу. Что может идти не так?
685 1221693
>>221596

> сервер должен послать запрос мне



Вряд ли сервер что-то тебе должен. Сам по себе сервер ничего не отправляет, за сим полагаю ты наговнокодил некий скрипт, который должен обрабатывать входящие запросы и по таймеру отвечать. Будь любезен более конкретно объяснить, что ты хочешь и что ты уже сделал.
686 1221706
Антоны, что лучше, если я ньюфаг?
687 1221708
>>221706
php.net
688 1221710
>>221708
Опять это толстое говно приперлось. Разницу между документацией и учебником чувствуешь?
689 1221720
>>221706
Зависит от того какой у тебя уровень подготовки. Если ты уже умеешь писать на каком-то другом языке, то котеров ещё более-менее, если с 0, то не стоит. За правую не скажу.

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

У меня 2 его книги есть 5 и 7 рнр. 7 интереснее, так как охватывает множество смежных тем.
690 1221729
>>221720
Понял. А что бы ты посоветовал современное, чтоб на протяжении книги реальный веб-проект велся?
691 1221775
Сложно, помогите.
Задачка на первую - заглавную букву в строке.
https://ideone.com/rpPO7O
Регулярка берет в таргет первые символы предложения, правда прихватывая и знаки препинания. Но как сделать их заглавными? strtoupper('$0') не работает.
692 1221826
Скажите пожалуйста что такое CMS для веб разработчика? Фреймворк с готовыми решениями если CMS опенсурс? Тяжело ли писать поисковый движок для сайта самому, или уже есть готовые решения, или его не тяжело писать? Стоит ли пользоваться фреймворками для верстки, или лучше свой написать? Есть что нибудь годное на примете?
693 1221834
>>221710
А что не так с документацией? По мне это полезное дело уметь читать её, да и вообще в книгах ничего почти не пишут, они стареют, а документации со спецификациями обновляются пожизненно.
694 1221835
>>221720

>Если ты уже умеешь писать на каком-то другом языке, то котеров ещё более-менее, если с 0, то не стоит.


Дилетант говори за себя, многие начинают изучать языки программирования с Си.
695 1221837
>>221834
Мой вопрос вообще никак не связан с документацией - это раз
Я не говорил, что что-то не так с документацией - это два
696 1221841
>>221837

>Говорит что его вопрос не связан с документацией


>Затрагивает документацию


>Говорит что не говорил что что то не так с документацией но его об этом никто не спрашивал

697 1221843
>>221837
хуя ты зеленый. надеюсь у тебя такие же навыки будут
 .jpg3 Кб, 300x168
698 1221845
>>221693

>Сам по себе сервер ничего не отправляет


Какие же тут ебланы сидят
699 1221871
>>221841
Не ожидал, что в pr такая зеленая жырнота, обычно же программисты умненькие
Я ни разу не затронул в своем вопросе >>221706 документацию.

>>221843

>Опять это толстое говно приперлось.

700 1221911
>>221706
Оба варианта говно. Читай учебник ОПа, решай задачи.
701 1221953
>>221379
Спасибо за ответ! Получается, что с каждым запросом грузятся все конфиги приложения, делаются одинаковые запросы в БД и прочие веши. Это же должно быть очень медленно, если пользователей много?
702 1221970
>>221729
Я не знаю, что тебе посоветовать. Вернее не знаю таких книг, которые ты хотел бы почитать.
703 1221971
>>221835
Почему я дилетант? Котеров в своей книге об этом пишет в самом начале. Я лишь констатирую.
704 1221972
>>221693
есть задание, в котором я должен послать запрос серверу, принять ответ(уж с этим проблем нет), а далее то, что задании названо "Прием callback (входящий http запрос в nginx+fpm) и его обработка"
705 1221974
Мне нужно создать объект и тут же записать данные о нем в базу. Нормально ли работать с базой прямо в __construct?
Далее, сразу же после этого мне надо вызвать метод созданного объекта, и в нем делать еще запросы в базу. Если ответ на первый вопрос- да, то это что получается, мне надо задать объекту свойств в котором буду хранить mysqli_connect?
706 1221975
>>221845
Покажи всем, что сервер отправляет клиенту.

Ты тупорылый мудила, если скажешь, что идёт обмен заголовками, потому что это принцип работы сервера, а не доставка клиенту некой информации инициированной сервером
707 1221977
>>221953
Что-то решается кешированием, что-то балансировкой между серверами. Но в целом ты понимаешь верно.
708 1221981
>>221972
Ну всё верно я тебе написал. fpm это рнр. Задание не сложное. Простой обмен сообщениями.
709 1222017
>>221981
у меня есть адрес на который я должен слать запросы(а-ля www.huita.com/aaa/bbb). Я туда шлю POST и принимаю ответ (file_get_contents($url, false, $context). В ответе те парамтры, которые в описании задания, все правильно. Я так понимаю, это типа "ок, я тебя услышал, как сделаю- сообщу" А дальше, как я понимаю, та хуйня должна послать мне запрос(в задании описаны параметры которые там будут), но в логах nginx я не вижу запросов
710 1222025
>>222017
Я же не знаю, что у тебя скрипт делает. С чего ты взял, что после получения ответа по адресу www.huita... ты должен со стороны сервера ещё что-то получить? В скрипте есть какое-то условие, которое должно выполняться после post ответа?

Я сейчас рассмотрю вариант, по которому работает у тебя скрипт, ибо не знаю, что у тебя там. У тебя скрипт отвечает на пост запрос некой информацией. Далее он закрывает сессию? Или у тебя аякс? Или открыт сокет, который ждет команд? Либо у тебя некий логер, который отвечает после однократного обращения через некий временной интервал?
711 1222051
>>222025
Как это понимаю я: я делаю POST на какой-то удаленный сервер и получаю ответ. Этот удаленный сервер с моими данными что-то делает и как только получает результат, шлет запрос мне.
712 1222055
>>222051
У меня в скрипте пока нет ничего, кроме отправки запроса и приема ответа. Потому что я не понимаю, как мне ловить входящий запрос от удаленного сервера
713 1222082
>>222051

> моими данными что-то делает и как только получает результат, шлет запрос мне.


Это если на том удаленном сервере есть такая задача. Лично я думаю, что получив в ответ данные на этом работа удаленного сервера прекращается и ты зря ждёшь еще чего-либо, ведь ты уже получил ответ от сервера.

>>222055
Ну ты же получаешь ответ от сервера? Json? Парсишь параметры и по некому условию описанному в задании шлешь очередной пост запрос на сервер.
714 1222100
>>222082
БЛЯДЬ, ЗАДАЧА ТАМ ЕСТЬ, ВСЕ ТАМ ДЕЛАЕТСЯ, ПРОСТО Я НЕ ПОНИМАЮ КАК МНЕ ПРИНИМАТЬ ЭТОТ ОТВЕТ
715 1222101
>>222100
еще раз... блядь... шлю запрос, получаю ответ- это сделано. потом пару секунд удаленный сервер думает и шлет запрос уже мне, и я не понимаю как мне принимать этот запрос
716 1222120
>>221706
code-basics.ru
717 1222164
>>222100

Выше спрашивали похожий вопрос и я ответил: >>219981

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

718 1222167
>>222164
Бро, так проблема в том, что я в логах nginx не вижу входящего запроса от сервера. Что может быть не так? Что-то не так с настройками nginx?
Ну и расскажи уже заодно, как скрипту сохранить свое состояние.
719 1222194
>>222167

А у тебя в nginx точно включено логгирование всех запросов? Документация по nginx есть на русском, если что.
720 1222269
Запросы, которые я сам шлю, прекрасно видны в логе.
560 - 592 721 1222566
>>216199
>>217289

>>Вызов этой функции изменяет значение поля salary. Если мы вызовем ее несколько раз, то она каждый раз будет возвращать все увеличивающееся значение зарплаты. Это неправильно. Функция вида getX() не должна менять состояние (значения полей) объекта.



> А почему нельзя? Проблема только в неудачно выбранном глаголе? Если я назову эту функцию increaseSalaryAndCoffee будет нормально?



Потому что в ней нет смысла. Зачем нужна функция, которая умножает зарплату на какое-то число? В этой задаче в объекте Сотрудника нужны по сути только такие функции:

- вычислить итоговую зарплату со всеми надбавками (чтобы вывести ее)
- поменять работнику базовую ставку (для части про антикризисный менеджмент)

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

В ООП каждый объект - это компонент, который умеет делать свою часть задачи. Ну, условно говоря, класс Сотрудник может отвечать за хранение характеристик сотрудника, позволяет получать информацию о нем и изменять какие-то параметры (например, ранг). И каждый класс занимается своим делом (принцип разделения ответственности). Ты сначала решаешь, какие у тебя будут классы, за что они отвечают, потом, какие у них будут свойства, потом - что с ними можно делать (какие у них будут методы).

Объекты объединяют в себе данные (поля) и код для работы с этими данными (методы). У тебя же класс Department не хранит в себе никаких данных. Данные о департаменте передаются в его методы снаружи. Получается, у тебя в Департаменте есть только код, но нету данных.

> Я сейчас погуглил про абстрактные методы. Получается, что если я объявляю пустой абстрактный метод в классе, то его обязаны использовать и описывать все наследники? Хотя я сам сейчас это проверю.



Да. Это недописанный метод, который надо дописать, чтобы из недоделанного (абстрактного) получить доделанный (конкретный) класс.

> Как сделать по-другому, мне что-то в голову не приходит, но я попробую покопаться.



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

Так получается более удобная архитектура: у нас есть Сотрудник, есть Департамент, который содержит список Сотрудников, и есть Компания, содержащая Департаменты. Ничего жестко не задано, и мы можем из этих классов, как из кубиков Лего, собрать любую компанию.

Ты же вводишь искуственные ограничения, что у тебя в Департаменте могут быть сотрудники только трех рангов, и только четырех профессий. А почему Департамент должен знать, какие бывают профессии и сколько рангов? Это же относится к сфере ответственности Сотрудника. Ты этим нарушаешь принцип разделения ответственности и размазываешь информацию о профессиях и рангах по коду вместо того, чтобы инкапсулировать ("скрыть") ее внутри Сотрудника.

Также, вывод данных не стоит делать внутри объектов. Зачем? Это код, который нигде больше не пригодится. Его лучше сделать отдельно от объектов. То есть у нас есть функция или класс, мы им даем Компанию, и они строят и выводят по ней отчет. Так будет красивее, и опять же, будет разделена ответственность между классами.

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

> То есть сделать один класс Departament и создать в нем поле, например, $employeers, для хранения объектов-работников?



Это хорошая идея.

> В первом варианте я использовал класс bookkeeping, типа бухгалтерия, в котором делал разные методы. Как вообще стоит называть такие классы?



У тебя не бухгалтерия. Это можно назвать ПостроительОтчетов, ReportBuilder, ReportPrinter или как-то так. Вообще, скорее всего, если мы будем развивать приложение, то будут нужны новые виды отчетов, и логично для каждого отчета делать свою функцию или класс. И поэтому же лучше не встраивать это в класс компании.
560 - 592 721 1222566
>>216199
>>217289

>>Вызов этой функции изменяет значение поля salary. Если мы вызовем ее несколько раз, то она каждый раз будет возвращать все увеличивающееся значение зарплаты. Это неправильно. Функция вида getX() не должна менять состояние (значения полей) объекта.



> А почему нельзя? Проблема только в неудачно выбранном глаголе? Если я назову эту функцию increaseSalaryAndCoffee будет нормально?



Потому что в ней нет смысла. Зачем нужна функция, которая умножает зарплату на какое-то число? В этой задаче в объекте Сотрудника нужны по сути только такие функции:

- вычислить итоговую зарплату со всеми надбавками (чтобы вывести ее)
- поменять работнику базовую ставку (для части про антикризисный менеджмент)

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

В ООП каждый объект - это компонент, который умеет делать свою часть задачи. Ну, условно говоря, класс Сотрудник может отвечать за хранение характеристик сотрудника, позволяет получать информацию о нем и изменять какие-то параметры (например, ранг). И каждый класс занимается своим делом (принцип разделения ответственности). Ты сначала решаешь, какие у тебя будут классы, за что они отвечают, потом, какие у них будут свойства, потом - что с ними можно делать (какие у них будут методы).

Объекты объединяют в себе данные (поля) и код для работы с этими данными (методы). У тебя же класс Department не хранит в себе никаких данных. Данные о департаменте передаются в его методы снаружи. Получается, у тебя в Департаменте есть только код, но нету данных.

> Я сейчас погуглил про абстрактные методы. Получается, что если я объявляю пустой абстрактный метод в классе, то его обязаны использовать и описывать все наследники? Хотя я сам сейчас это проверю.



Да. Это недописанный метод, который надо дописать, чтобы из недоделанного (абстрактного) получить доделанный (конкретный) класс.

> Как сделать по-другому, мне что-то в голову не приходит, но я попробую покопаться.



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

Так получается более удобная архитектура: у нас есть Сотрудник, есть Департамент, который содержит список Сотрудников, и есть Компания, содержащая Департаменты. Ничего жестко не задано, и мы можем из этих классов, как из кубиков Лего, собрать любую компанию.

Ты же вводишь искуственные ограничения, что у тебя в Департаменте могут быть сотрудники только трех рангов, и только четырех профессий. А почему Департамент должен знать, какие бывают профессии и сколько рангов? Это же относится к сфере ответственности Сотрудника. Ты этим нарушаешь принцип разделения ответственности и размазываешь информацию о профессиях и рангах по коду вместо того, чтобы инкапсулировать ("скрыть") ее внутри Сотрудника.

Также, вывод данных не стоит делать внутри объектов. Зачем? Это код, который нигде больше не пригодится. Его лучше сделать отдельно от объектов. То есть у нас есть функция или класс, мы им даем Компанию, и они строят и выводят по ней отчет. Так будет красивее, и опять же, будет разделена ответственность между классами.

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

> То есть сделать один класс Departament и создать в нем поле, например, $employeers, для хранения объектов-работников?



Это хорошая идея.

> В первом варианте я использовал класс bookkeeping, типа бухгалтерия, в котором делал разные методы. Как вообще стоит называть такие классы?



У тебя не бухгалтерия. Это можно назвать ПостроительОтчетов, ReportBuilder, ReportPrinter или как-то так. Вообще, скорее всего, если мы будем развивать приложение, то будут нужны новые виды отчетов, и логично для каждого отчета делать свою функцию или класс. И поэтому же лучше не встраивать это в класс компании.
722 1222567
>>216212

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

>>216932

min(x, y, z, ...) - наименьшее из перечисленных чисел.

F(...) - значение функции F, если ей передать указанный аргумент. Если оно стоит слева от знака "равно", то это определение функции, если справа, то вызов (хотя, если ты подумаешь, то в математике это не имеет значения, с какой стороны ставить, так как равно в математике обозначает не присваивание, а равенство). Например:

F(n) = n + 1 - это определение функции F, оно показывает, как вычислить ее значение для любого n
x = F(10) - это вызов функции F с аргументом 10.

Как я уже написал выше, знак равно в математике значит равенство, и определение и вызов функции по сути одно и то же, потому n + 1 = F(n) тоже будет служить определением функции F, просто читать его в таком виде неудобно.

При этом функция F тут определена рекурсивно (через саму себя, выражением вида F(x) = ... F(...)...). Вот более простой пример рекурсивной функции:

F(0) = 1
F(n) = F(n - 1) * n;

Это читается так:

- для n = 0, значение функции равно 1
- для других n, чтобы получить значение фукнции, мы должны сначала найти его для n-1 и умножить на n

Ну например,

- F(1) = F(0) * 1 = 1 * 1 = 1
- F(2) = F(1) * 2 = 1 * 2 = 2 (F(1) мы вычислили выше, оно равно 1)

и так далее.

Примеры рекурсивных функций: https://ru.wikipedia.org/wiki/Рекурсивная_функция
722 1222567
>>216212

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

>>216932

min(x, y, z, ...) - наименьшее из перечисленных чисел.

F(...) - значение функции F, если ей передать указанный аргумент. Если оно стоит слева от знака "равно", то это определение функции, если справа, то вызов (хотя, если ты подумаешь, то в математике это не имеет значения, с какой стороны ставить, так как равно в математике обозначает не присваивание, а равенство). Например:

F(n) = n + 1 - это определение функции F, оно показывает, как вычислить ее значение для любого n
x = F(10) - это вызов функции F с аргументом 10.

Как я уже написал выше, знак равно в математике значит равенство, и определение и вызов функции по сути одно и то же, потому n + 1 = F(n) тоже будет служить определением функции F, просто читать его в таком виде неудобно.

При этом функция F тут определена рекурсивно (через саму себя, выражением вида F(x) = ... F(...)...). Вот более простой пример рекурсивной функции:

F(0) = 1
F(n) = F(n - 1) * n;

Это читается так:

- для n = 0, значение функции равно 1
- для других n, чтобы получить значение фукнции, мы должны сначала найти его для n-1 и умножить на n

Ну например,

- F(1) = F(0) * 1 = 1 * 1 = 1
- F(2) = F(1) * 2 = 1 * 2 = 2 (F(1) мы вычислили выше, оно равно 1)

и так далее.

Примеры рекурсивных функций: https://ru.wikipedia.org/wiki/Рекурсивная_функция
723 1222568
>>217063

> попробую перенастроить на php-fpm, не знаю правда получится ли - ожидаю обилие сопутствующих проблем при таком переезде.



Лучше делать самую простую и стандартную архитектуру (статика отдается из публичной папки, все остально перенаправляется на index.php, который дальше уже в PHP разбирает URL).

> т.е. объявляются роуты и на вызов роутеру передаются request и response



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

> Я не понимаю как использовать вот эти методики чтобы удобно собирать приложение. Возможно и не пойму пока не найду какой-нибудь достаточно комплексный сайт построенный на этих методиках с открытым кодом и не почитаю как они организовывают процесс.



Микрофреймворки для небольших приложений. Если у тебя большое, то тебе будет удобнее фреймворк с классами-контроллерами. Не обязательно делать контроллеры именно классами, можно, например, функциями, но там может быть неудобно работать с DI например.

> А я как раз вроде бы наоборот хочу от подобного избавиться (хотя конкретно такого у меня нет). А на самом деле - нормально так делать?



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

>>217620

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

CONTRACT_FULLTIME - постоянный
CONTRACT_TEMP - временный
CONTRACT_INTERN - стажер

И в коде: $ivan['type'] = CONTRACT_TEMP;

Также, иногда для настоящих констант, вроде GRAVITY = 9.81

Для конфигов использовать плохая идея, так как значения конфига могут меняться и потому они не константы. Более того, константы доступны глобально, и это плохо. Опции конфига надо передавать только туда, где они нужны, а не делать глобально доступными.
723 1222568
>>217063

> попробую перенастроить на php-fpm, не знаю правда получится ли - ожидаю обилие сопутствующих проблем при таком переезде.



Лучше делать самую простую и стандартную архитектуру (статика отдается из публичной папки, все остально перенаправляется на index.php, который дальше уже в PHP разбирает URL).

> т.е. объявляются роуты и на вызов роутеру передаются request и response



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

> Я не понимаю как использовать вот эти методики чтобы удобно собирать приложение. Возможно и не пойму пока не найду какой-нибудь достаточно комплексный сайт построенный на этих методиках с открытым кодом и не почитаю как они организовывают процесс.



Микрофреймворки для небольших приложений. Если у тебя большое, то тебе будет удобнее фреймворк с классами-контроллерами. Не обязательно делать контроллеры именно классами, можно, например, функциями, но там может быть неудобно работать с DI например.

> А я как раз вроде бы наоборот хочу от подобного избавиться (хотя конкретно такого у меня нет). А на самом деле - нормально так делать?



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

>>217620

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

CONTRACT_FULLTIME - постоянный
CONTRACT_TEMP - временный
CONTRACT_INTERN - стажер

И в коде: $ivan['type'] = CONTRACT_TEMP;

Также, иногда для настоящих констант, вроде GRAVITY = 9.81

Для конфигов использовать плохая идея, так как значения конфига могут меняться и потому они не константы. Более того, константы доступны глобально, и это плохо. Опции конфига надо передавать только туда, где они нужны, а не делать глобально доступными.
724 1222664
Мне нужно создать объект и тут же записать данные о нем в базу. Нормально ли работать с базой прямо в __construct?
Далее, сразу же после этого мне надо вызвать метод созданного объекта, и в нем делать еще запросы в базу. Если ответ на первый вопрос- да, то это что получается, мне надо задать объекту свойств в котором буду хранить mysqli_connect?
725 1222795
Помогите убогому. Не могу понять как установить расширение mbstring.
Только начинаю вкатываться в php и в погромисты.
Буду благодарен
726 1222798
>>222795
в php.ini расскомменть
extension=mbstring
727 1222800
Антоны я правильно понимаю что связи между таблицами устанавливаются путем foreign key (x) references table(y) в независимости от типа связи (многие ко многим итд).?
728 1222806
>>222798
Я читал об этом. Все, что я смогу найти это php.ini-development и php.ini-production
Там раскомментировал mbstring
Но все равно нихера не получается.
Ошибка при попытке запуска программы.
729 1222808
>>222806

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

Проверить, какой конфиг применяется, можно с помощью функции phpinfo(). Создай файл index.php с вызовом этой функции, и открой его в браузере по ссылке, начинающейся с http: (для этого нужен веб-сервер: либо встроенный в php, либо Апач, нгинкс или что-то еще).
730 1222815
>>222808
Большое спасибо!
Сделал следующее php.ini-development
переименовал в php.ini и раскомментировал mbstring.
Пытался запустить прогу через cmd, но выдавало ошибку. Суть в том, что cmd искал dll файлы расширения в c:/php/ext хз почему, я даун, а, папка php лежала в другом месте.
Ебаться не стал и кинул ее в c:/
И заработало!
Спасибо, дорогой анон
731 1222819
>>222815

Он искал скорее всего, потому что у тебя в конфиге не задан extension_dir: http://php.net/manual/en/ini.core.php#ini.extension-dir
732 1222834
Посоветуйте TDD фреймворк, пожалуйста.
733 1222996
Посоны, у всех слетел phpstorm сегодня?
734 1223099
>>222819

>extension_dir


С этим тоже разобрался сегодня
Благодарю!!!
735 1223115
>>209395
<?php

for ($i = 1; $i<10; $i++) {
echo "$i\n";
($e = $i * $i);
echo "$i x $i = $e";
}

Ну что не так?
736 1223118
>>223115

<?php

for ($i = 1; $i<10; $i++) {
echo "$i\n";
($e = $i * $i);
echo "$i x $i = $e";
}
Безымянный.png3 Кб, 264x114
737 1223120
>>209395
И как мне код закинуть если эта хрень смещается в кашу...
738 1223127
Друзья, подскажите по phpstorm - я точно видел такое где-то в видео, но никак не пойму, как это сделать. Суть даже не автокомплите, а намного интереснее. Типа я начинаю писать условие

if ... else

И он за меня раскидывает все скобки и ";" и мне остается только ввести значения и условия в них. Там как-то курсор вроде как-будто табом так прыгает и все.
739 1223133
>>223120
Поставь /n в конце вывода второй строки
740 1223135
>>223133
\n

фикс
742 1223152
>>223138
Вот ты - хороший человек. Добра тебе и процветания.
День 1 743 1223165
У меня свободный месяц и я буду зубрить php по хардкору. Здесь теперь будет мой уютный бложик (все равно у вас половина постов спам, хоть и лампово), вернее вопросы которые я не смог прогуглить:
Symfony 3.4 есть роут заданный аннотацией:
@Route("about/{name}", name="aboutpage", defaults={"name":null})

server/about и server/about/ivan работают хорошо, а server/about/ (with slash) падает с ошибкой No route found for "GET /about/"
Как это починить?
744 1223171
>>223165

Давно такого не было. Кто-то не только внятно описал проблему, но и даже не забыл указать версию Симфони.

Проблема со слешем на конце описана тут: https://symfony.com/doc/3.4/routing.html#redirecting-urls-with-trailing-slashes

Я добавлю, что страница не должна быть доступна по 2 разным URL. У страницы должен быть ровно один URL.

Также, я советую писать роуты в YML файле, а не в аннотациях, так как в этом случае они собраны в одном месте, легче избегать конфликтов, легко увидеть приоритеты роутов.
745 1223177
>>223171
Спасибо.
746 1223283
У кого-нибудь есть вопросы по регуляркам?
747 1223286
Решил вроде задачу про Вектор, ОП, посмотри - https://ideone.com/qFlLtj
748 1223352
Если создать класс, единственной целью которого является хранения констант(глупая идея?), то его придется во все использующие его классы рекваирить?
749 1223354
>>223352
У меня есть два класса, которым в ходе их основной работы надо слать запросы на сервер, причем делать это им заметно отличающимся способом. Все, на что хватило меня: сделать трейт в котором есть два метода для каждого из этих классов и третий метод, в который выноситься некоторый код из предыдущих двух, дабы не дублировать. Анон, это совсем говно? Есть еще одна пролема: url'ы, на который надо слать запросы(они разные для каждого из двух классов), хранятся в виде констант в этих самых классах, а внутри трейта вызываются как self::MYCONSTANT.
750 1223355
Вопросы от самых маленьких:
PHP без всяких фреймворков. Написал несколько классов. Как только в одном из них мне нужен другой, мне надо писать require_once? Если да, то насколько важно стремиться к тому, чтобы этих require_once было как можно меньше?
751 1223385
>>223355
Сейчас все стараются иметь один require. Читай про autoloading.
752 1223525
>>223355
Через композер автозагрузку сделай и не нужно будет никаких require.
753 1223592
>>223355
composer, autoload
754 1223714
>>223355
За исключением экзотики (key-value хранилище на opcache например) не требуется более одного-двух - на твой неймспейс и на вендоров. Автолоудинг тебе в помощь! http://php.net/manual/en/language.oop5.autoload.php
755 1223731
Сап двач.
Представим, что у меня есть в базе две таблицы - threads и comments например. У них связь один ко многим, или многие к одному, не суть. Будет ли быстрее проводиться селект с джоином, если таблицу комментариев индексировать по внешнему ключу threads_id например?
756 1223760
Подскажите, есть возможность например на закрытие вкладки браузера повесить автоматический сабмит формы?

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

>>223731
Очевидно что да.
image.png137 Кб, 1440x900
757 1223763
Начал решать задачу про палиндромы. Где я обосрался? Почему показывает 2 символа?
758 1223764
>>221155
Доставило. Проиграл в голос, забираю цитату.
759 1223782
>>223763
Учись вардампить.

В коде как только получил переменную, например свой $text1;
После этого следующей строчкой вхуярь
var_dump($text1);
И посмотри что там, если там именно то, что ты ожидаешь от своего кода, то после появления следующей хуйни $text2 делай дамп и так далее.
image.png150 Кб, 1440x900
760 1223798
>>223782
Я все-таки не понимаю что-то,видимо. Откуда берется число 5? Проблема в коде или в notepad++/локальном сервере?
761 1223809
>>223798
Скинь код, тоже не могу догнать с 3мя годами опыта что за хуйня. вангую ты тралишь
762 1223817
>>223809
mb_internal_encoding('utf-8');
$text = "Аргентина манит негра";
$result = "Палиндром";
$text1 = mb_strtolower($text);
var_dump($text1);
echo "<br>";
$text2 = str_replace(" ","", $text1);
var_dump($text2);
echo "<br>";

$lenght = mb_strlen(text);
var_dump($lenght);
$halflenght = floor($lenght/ 2);

for ($i = 0; $i <= $halflenght; $i++) {

}
763 1223824
>>223817
Продолжаешь издеваться?
В следубщий раз сюда заливай
https://ideone.com/
764 1223828
>>223798
>>223817

>$lenght = mb_strlen(text);


йеп, это тралинг
765 1223833
>>223828
blyad ya ebanii degenerat. Пойду решать задачу дальше.
image.png57 Кб, 1018x360
766 1223874
Объясните дурачку, что нужно написать в $last, чтобы он каждый символ с конца проверил? В остальном же все норм у меня?
image.png58 Кб, 990x353
767 1223878
>>223874
Вот я брик убрал, чтобы вам понятнее было, что происхоит.
768 1223883
>>223874
Можешь пропустить эту задачу, я тебе разрешаю. Я вот бомбанул на ней в свое время и пропустил, а сейчас уже учу фреймворк!
769 1223884
>>223883
Не пропущу! Я так далеко зашел, мне нужно всего лишь понять, что вписать в эту строчку, я близок к разгадке, а ты и дальше учи свой фраемворк!
motivation.mp46,7 Мб, mp4,
576x720, 0:57
770 1223885
Всем мотивации
15218979451410.png25 Кб, 536x389
771 1223890
>>223884

>далеко зашел


>палиндром

772 1223891
>>223890
Я про решение задачи, я несколько дней уже пытаюсь в неё.
773 1223892
>>223891
Давай загадаем, если ты её решаешь до 00:00 по Мосве, то становишься пхп-сеньером через пять лет?
774 1223894
>>223892
Но тут написано, что пэхапэ можно осилить за пол года...
775 1223895
>>223763

Вклюи вывод ошибок на экран в php.ini (display_errors = 1) или посмотри лог ошибок веб-сервера. Там будет сообщение, которое укажет на причину проблемы. Я советую у себя локально включить вывод ошибок (а на продакшене отключать).
776 1223897
>>223874
Посмотри внимательно на свой цикл, с какого числа начинается перебор?
Снимок.JPG47 Кб, 1383x359
777 1223898
https://www.upwork.com/o/profiles/browse/?q=php&rate=0-10&page=3

Вы че ебнулись, вы получите 5 лет опыта и только тогда у вас будет зарплата как у чухана в макдаке в Москве.
778 1223899
>>223897
С нуля? Я это понял, просто не знаю, как написать, чтобы он каждый символ с конца мне перебирал.
779 1223900
>>223899
А перебор в обратном порядке начинается с отрицательного числа.
780 1223901
>>223900
Я понял, только хз, как изменить, чтобы правильно было. Ну почти же, сук.
781 1223902
>>223901
Ты можешь выполнить математическое действие прямо в передаче значения.
782 1223903
>>223898

>Wordpress, Пакистан

783 1223904
>>223894
Можно, не слушай что тут тебе сейчас начнут писать.
1530908880559.png44 Кб, 893x237
784 1223906
>>223903

Удачи конкурировать с хохлами которые кодят за мивину.
image.png52 Кб, 994x370
785 1223907
>>223902
Это я тоже пробовал, у меня вышло это. Почти успех, только, кажется, значение $i заданное в цикле изменяется тоже, не?
786 1223908
>>223906
А где их нет?
787 1223909
>>223902
Бля, какую-то хуйню спизданул, можешь не отвечать, сам разберусь, короче.
image.png53 Кб, 1003x377
788 1223911
>>223902
Нежно целует в щечку
>>223892
А ты посасал.
789 1223912
>>223911
Молодец!
790 1223913
>>223911

>ты посасал


А ты няшный?
15269092035100.jpg42 Кб, 800x533
791 1223915
>>223913
На пике я, суди сам.
792 1223917
>>223874
($text, -($i+1), 1) в ласте
793 1223918
>>223898

Это же неправда. В Макдаке ставка (когда я последний раз интересовался) была в районе 100-200 р в час. А 6 долл. в час = 960 долл/мес - это в 2 раза выше медианной российской зарплаты.

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

Ну и возможности устроиться в так любимый тобой ресторан быстрого питания освоение PHP тебя не лишает.

>>223878

Если ты смотришь результат в браузере, добавь в начало

header("Content-Type: text/plain; charset=utf-8");

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

Иначе перенос строки будет в исходном коде страницы (его можно увидеть нажав Ctrl + U), но на самой странице его не будет.

>>223824

На ideone не работают mb-функции, увы.

>>223760

Можешь попробовать на onbeforeunload повесить, но работоспособность не гарантирую.

>>223731

Если индекса не будет, то все будет работать нереально медленно. Так как MySQL будет для каждой строчки из первой таблицы делать полный обход второй таблицы для поиска подходящих записей. Индекс позволяет очень быстро найти строчки с определенным значением поля. Почитай теорию, тут простым языком объяснено: https://ruhighload.com/Индексы+в+mysql
793 1223918
>>223898

Это же неправда. В Макдаке ставка (когда я последний раз интересовался) была в районе 100-200 р в час. А 6 долл. в час = 960 долл/мес - это в 2 раза выше медианной российской зарплаты.

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

Ну и возможности устроиться в так любимый тобой ресторан быстрого питания освоение PHP тебя не лишает.

>>223878

Если ты смотришь результат в браузере, добавь в начало

header("Content-Type: text/plain; charset=utf-8");

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

Иначе перенос строки будет в исходном коде страницы (его можно увидеть нажав Ctrl + U), но на самой странице его не будет.

>>223824

На ideone не работают mb-функции, увы.

>>223760

Можешь попробовать на onbeforeunload повесить, но работоспособность не гарантирую.

>>223731

Если индекса не будет, то все будет работать нереально медленно. Так как MySQL будет для каждой строчки из первой таблицы делать полный обход второй таблицы для поиска подходящих записей. Индекс позволяет очень быстро найти строчки с определенным значением поля. Почитай теорию, тут простым языком объяснено: https://ruhighload.com/Индексы+в+mysql
794 1223919
>>223355

У меня есть урок про автозагрузку: https://github.com/codedokode/pasta/blob/master/php/autoload.md
796 1223939
>>223936

исходникИ?
797 1223945
>>223936
Вот сейчас обидно было.
image.png80 Кб, 898x726
798 1223981
https://ideone.com/SdrzU0
Кажется, я где-то обосрался, анон, проверь
799 1223993
>>223981

>изучает пхп


>кажется, я где-то обосрался

800 1224151
Пацаны, можно регулярные выражения пока пропустить, це просто пиздец, я не могу, можно потом к ним вернуться? Кто-то говорит, что они не нужны и используются редко для решения сложных задач.
801 1224165
>>224151
Кто бы что не говорил, нужны. Прямо как тян.
802 1224167
>>224165

>нужны. Прямо как тян.


Но тян не нужны, значит ты имел ввиду, что регулярные значения так же нужны, как и тян, то есть никак?
803 1224172
>>224167
Tyan нужны! Я так скозал!
804 1224196
Анончики, подскажите по окружению. Я немного заколебался, хочу узнать на чем сидит анон.

В общем, есть хост-система с виндой и на virtualbox я поставил Lubuntu - чтобы полегче, система супер, очень удобная. Решил, что надо полностью сымитировать то , что будет на сервере - пути, слэши вот это вот всё.

Ну и так как у меня на впс уже стоит панель vesta с nginx+ php-fpm, то я недолго думая решил ее и сюда поставить, то бишь без апачей, но не тут то было - почему-то при добавлении локального домена веста не обновляет hosts и домена я этого не вижу.

Разрабатываю при помощи phpstorm. Анончики, как бы мне удобно развернуть веб сервер, чтобы и composer+laravel накатить сразу и хосты были, какие я захочу, а? Ну чтобы нормально пилить на локальном домене, а потом так ап! и выносить на впску.

Смотрю mamp - там апач, я не хочу его, у меня будет крутится на безапачевом конфиге все. Смотрю vagrant - ну это уже будет виртуалка внутри виртуалки получается?
806 1224257
>>224251
Ну в общем-то все правильно ведь, с задачей я справился?
807 1224275
>>224196
Windows 10 + WSL (встроенная в винду убунта). В WSL
nginx + php-fpm 7.2/5.6.
Получаю все прелести божественной консоли, но в Win10 десктопе.
Вот примерный гайд от разработчика composer если интересно: https://seld.be/notes/developing-on-windows-in-2018
808 1224308
Для чего нужны фреймворки? К примеру, laravel, это как готовый CMS, где уже расписаны классы? Я вот делал курсач по сайтику, использовал чистый пхп. Как вообще вкатываться в фреймворки и как/где получить практику
809 1224317
>>224308
Ну как я понимаю это готовый каркас из коробки дающий нам: форму регистрации, админку, уровни пользователей и т.п. Также многие вещи написаны под фреймворк, и ты такой берешь их и просто копируешь к себе.

http://nnm-club.me/forum/viewtopic.php?t=1194405
810 1224321
изображение.png11 Кб, 1258x321
811 1224477
В лисе можно вообще эту ебучую консоль расширить?

Как делагать то когда у тебя по 2 строчки сука дампятся
812 1224556
>>224477

Она же перемещается, там где-то кнопочка есть в углу, можно прикрепить ее справа, а можно вообще вынести в отдельное окно и развернуть на весь экран, если у тебя маленький монитор (те, у кого 2 больших монитора, обычно консоль вообще на отдельный монитор выносят).
813 1224559
>>224477

Алсо, судя по треугольничку, одно из полей можно свернуть, чтобы не мешало. Эх, молодежь, про треугольничек не знает.
814 1224562
Аноны, я не погромист, поэтому такую задачу сам реализовать не могу, но я знаю, что кем то она уже была реализована и используется.

В /b периодически возникают различные рулетки, государство-треды и т.д., и я знаю, что у негкоторых есть скрипты, которые позволяют автоматически отслеживать посты с нужными даблами, типлами и т.д. Есть у кого? Приложил к посту картинку скрипта от одного анона, и пример рулетки
815 1224992
Как вывести на экран элемент массива, находящегося в другом массиве? Без вардампа
816 1225027
>>224992

$hui = [[1,2],[3,4]];
echo $hui[1][0];
выведет 3
817 1225046
>>225027
Спасибо, добрый человек!
818 1225184
Как оценить пригодность разработчика к работе если ты — вчерашний джун, а он претендует на синьора-помидора?
cirnocomp.jpg98 Кб, 620x520
819 1225219
Делаю задачу про ООО "Вектор", пока что все классы, методы и переменные публичные, не особо вкурил как адекватно юзать модификаторы доступа. Нипанятна верно ли я вообще двигаюсь, реквестирую советов мудрых
код - https://pastebin.com/c8PhAiXr
820 1225453
>>225184
дай ему решить "цифры прописью"
821 1225468
>>224196
Лучше всего переезжай на линукс, хотя бы в дуалбут и осваивай vagrant и (или) docker. Все эти готовые панели только сбивают с толку своей простотой. Для вагранта вообще есть такие https://puphpet.com/ конструкторы, где ты себе окружение просто мышкой собираешь.
822 1225483
>>225453
я решил, я решил! можно мне стать синьорчиком?
823 1225566
>>225453
Сукпздц((00(, я уже вторую неделю перерешиваю эту задачку. А все потому, что стыдно скинуть ОПу.
824 1225568
Аноны, расскажите как правильно делать рамку для таблицы.
Есть вот такой код для границ

table#table_result {
border: 1px outset;
border-spacing: 5px;
border-collapse: collapse;
border-color: #fff;
}

В хроме почему-то нижнюю границу показывает через раз, в фаерфоксе вообще не показывает.
ЧЯДНТ?
825 1225599
PHP-ны, привет. 30+ лвл с гуманитарным образованием хочет попробовать вкатиться. Сначала на правах хобби (один хрен постоянно залипаю на развлекательных сайтах в свободное от работы время), потом посмотрю, хватит ли у меня icq для продолжения обучения. Так вот, удобно ли будет обучаться этому ремеслу на iMac 27 5K Retina?
826 1225695
>>225599
Не пойму тралируешь или нет.
Все на чем можно читать мануал/книгу и писать в текстовый редактор подойдет. Если можно вместить два окна на экран, то вообще по пански пойдет.
827 1225703
>>225599

> Так вот, удобно ли будет обучаться этому ремеслу на iMac 27 5K Retina?



Смотря какого цвета корпус.
828 1225761
Пересаживаюсь с пик на хуи с юи2 на ларавел. Какие подводные?
829 1225763
>>225219
Как я понимаю то разные уровни доступа нужны для того, чтобы твоя сущность всегда оставалось валидной. Конечно, есть возможность поля класса делать публичными, и при считывании данных просто обращаться к ним как $user->id вместо user->getId(), но у тебя в данном случае есть возможность изменить айди на другой, и попробовать записать это в базу, ну ты понял. Плюс тут открываются новые возможности, вместо того чтобы проверять например пароль пользователя таким образом - password_verify($passwd, $user->getPassword), ты можешь не делать геттер для пароля, а сделать отдельный метод authenticate($passwd), который будет делать тоже самое, но зато это вроде как ооп.
image.png3 Кб, 318x31
830 1225769

>сначала идет +7 или 8, за ними ровно 10 цифр, между которыми может быть любое число скобок, минусов, пробелов


Как я понял, нужно вставить \W+, но как эти конструкции вставляются??
831 1225964
>>225599
Сколько ядер/гигов?
832 1226131
Минутка внезапного бугурта:
А знаете ли вы, что переменная, объявленная внутри цикла, сама не обнуляется(и не создаётся каждый раз) и будет как-либо использована в последующих итерациях?
833 1226132
>>225769
Не пиши просто пробелы в регулярках, плс. Есть же православный \s
834 1226146
>>226131

Да, а с чего бы она должна обнуляться или удаляться? В PHP переменные, созданные внутри функции (локальные), живут до выхода из этой функции. А переменные, созданные вне функции (глобальные) вообще живут до завершения программы.
835 1226156
>>226146
Ну чёт я ожидал, что она будет как let джаваскриптовый работать, хз
836 1226274
Блять, какое же перегруженное говно ваш laravel, и какая же годнота после него codeigniter да, я слишком ньюфаг пока
837 1226279
>>224275
Спасибо, но не хочу ставить десятку пока

>>225468

Ну так и почти вышло, но на винде я накатил вагрант и сижу-пержу с ним в vscode, который быстрее шторма в 3 раза сука. Получается, что и нативный линупс не особо-то и нужен с вагрантом. Зря протрахался два вечера. Как буду деплоить буду, пока еще не знаю...
sage 838 1226281
>>226279
Я вообще IIS + PHP использую, мне похуй.
839 1226289
>>226281
Во времена ХР/7 так же делал. Потом разобрался в apache lounge (форк веб-сервера от апача по сперму) и отказался от IIS.
sage 840 1226302
>>226289
Я слишком ленивый, да и не вижу никаких профитов использовать блядоапач, когда и так все работает.
841 1226333
Мда, апач конечно в 2018-м нинужон. Все равно на продакшене будешь рерайты на nginx писать, а php7-fpm просто охрененно быстр.
842 1226400
Как же охуенно было обучаться PHP и Symfony сидя дома. И как же хуёво работать. То в битрикс вляпался, взял яйца в кулак, подучил Symfony - сменил работу. Но там проект до ужаса скучный был и коллектив такой же. Теперь вот перешел на другую работу а там "говнокодим на Symfony непонятно что и зачем " это буквально, не в переносном смысле

Заебало участвовать в проектах на которые похуй, от того и углубляться в них не хочется. Бля, хочу в ламповый стартап, чтоб прям жить этим, собираться на квартире маленьким составом единомышленников и ебашить. Ебал в рот этот офис(
image.png70 Кб, 565x644
843 1226465
Бля, не могу понять как решить эту хуету, анон, кинь решение, я заебался уже.
844 1226476
>>226465
Блядь, вроде все правильно, только пробелов многовато, но решение неправильное ведь? Я как-то наугад захуярил, кажется. Флаг "u" добавил еще, хотя было сказано не трогать ничего. Жду правильного решения, анон.
845 1226486
Пошел ты нахуй, анон.
846 1226487
>>226486

Надо упрощать.

[\d] равносильно просто \d (зачем делать выбор из одного варианта?)

{0,} равносильно звездочке (а {1,} - плюсу, а {0,1} - знаку вопроса)

Перед пробелом бекслеш не нужен. Внутри квадр. скобок круглые не имеют специального значения и их не надо экранировать.
image.png379 Кб, 1280x800
847 1226501
Где ошибка? Я не понимаю, серьезно, лол.
Screenshot1.png35 Кб, 945x497
848 1226508
анон, я кажись наебываю сам себя или такое решение имеет жизнь?
849 1226525
>>226501
попробуй запись массива через array()
850 1226531
>>226400
Всё так, дома самообучаться интересно, а разгребать на работе чей-то говнокод и править его - абсолютно нет. Алсо я как раз пару месяцев был в стартапе, пытались воспользоваться спросом на криптовалюты и ЧМ 2018. Разрабатывать было круто, но в итоге идея не взлетела и денег толком не получили. Вернулся опять в офисное болото на никому не нужные проекты, зато стабильные деньги.

>>226274
Учти, что CodeIgniter никому не нужен сейчас и используют преимущественно Yii, Laravel, Symfony.

>>225761
Аксиома Эскобара. Лучше изучи Symfony, на нём сложнее писать плохой код.
изображение.png9 Кб, 210x556
851 1226538
скажите зачем они переводят понятия из вебразработки на русский?
852 1226627
853 1226638
Какую CMS лучше выбрать для интернет-магазина? Изначально написал на Symfony что-то вроде каталога без возможности заказа, а теперь думаю, что все это будет расширяться и в случае моего ухода CMS будет легче поддерживать. Выбирал вот между PrestaShop и OpenCart. Поделитесь опытом.
854 1226644
>>226638
Меня закидают какашками, но я порекомендую wordpress + woocommerce. Просто потому что допиливать opencart в случае чего намнооооого дольше. C wp как бы ты лишен кучи головняка. Но еэто только в случае до 10к товаров, потом нужно будет думать.
А вот opencart тянет 100к без проблем.
855 1226706
>>226627

Можешь на codepen.io или на jsiffle пример HTML кода загрузить?
857 1226845
>>226744

Я тут нашел такую вещь: https://developer.mozilla.org/en-US/docs/Web/CSS/border-collapse

> When cells are collapsed, the border-style value of inset behaves like groove, and outset behaves like ridge.



Также, у тебя стоит цвет border белый, зачем ты пытаешься сделать белую рамку на белом фоне?
858 1226875
>>226845

>зачем ты пытаешься сделать белую рамку


Косяк, да.
Пойду ковырять стили, что я там хотел сделать.
Бтв, а почему тогда вообще рамка серого цвета видна?

>the border-style value of inset behaves like groove, and outset behaves like ridge.


И, каким образом это обьясняет пропажу нижний границы?
Безымянный.jpg124 Кб, 1630x349
859 1226882
ХЗ в чем дело с хромом.
860 1226887
>>226875

Потому что outset или ridge имитирует трехмерность за счет того, что окрашивает разные стороны рамки в разные оттенки. Очевидно, что ФФ и Хром выбирают их по-разному и где-то все стороны стали белые, а где-то только нижняя. Стандарт это не определяет.
861 1226892
>>226887
Без outset то же самое
862 1226898
>>226882

Надо либо отказаться от collapse, либо обернуть таблицу в див и поставить рамку на нем либо добавить рамку к нижним ячейкам. При collapse рамка делится между таблицей и ячейками и видимо Хром это так понимает.
863 1226921
>>226898
Так смотри, тут на 2 странице граница внизу есть >>226744
image.png54 Кб, 962x384
864 1226967
Нужно сделать так, чтоб по нажатию кнопки методом пост из форм брались данные, кидались в переменные и далее открывалась бы ссылка, в которой используются эти переменные.
У меня получается лишь используя две кнопки -- одна передает данные из форм, а вторая открывает ссылку. Как в одну кнопку захуячить?
866 1227067
Мне стало любопытно, какие есть форматы для описания грамматики языков для подсветки в текстовых редакторах и JS-плагинах для подсветки кода.

Вы не поверите, но ситуация ровно как на картинке XKCD про 14 стандартов. У каждого редактора свой синтаксис.
867 1227550
что такое this?я не понимаю(
868 1227577
>>227550
$this это указатель на объект класса такая внутренняя внутренняя переменная, которая показывает на себя
869 1227579
>>227577
не понятно
872 1227592
>>227585

Завтра поймешь, главное выспаться норм
873 1227593
>>227592
завтра на работу
874 1227613
>>227593
Анончик, раньше, несколько лет назад тут помимо онлайн учебника рекомендовали ньюфагам курс от Бауманки "Специалист" с торрентов. Борисов

Так вот, там все детально разжевано в деталях, но его нужно проходить. Советую. У тебя просто не будет каши в голове и ты снаскоку не будешь так дрыгаться. Не поленись и скачай: нужно время, лабы и чтобы по кирпичику у тебя все уложилось.
875 1227693
Какая-та дебильная задача, выше же написано, как подобное делается.
876 1227820
ОП в отпуске?
877 1227841
>>226274
попробуй zend
878 1227846
>>227841

Не надо кормить новичков мертвым говном!
Пусть лучше Symfony изучает.
879 1227888
Почему задача про проверку номеров такая ебанутая(наверно потому, что регулярные выражения такие)
А проверка https://regex101.com/r/qF7vT8/3 делает её еще тупее.

Выстрадал /^[\s]{0,1}[+]{1,1}[\s]{0,1}[7]{1,1}([- \\(\\)][0-9]){10}$|^[\s]{0,1}[8]([- \\(\\)][0-9]){10}$/
но оно может пропустить номер типа : + 7-999-12-(((((23------56)))))7, в связи с этим "84951234567 позвать люсю" -уже кажется более адекватным.
,
880 1227889
>>227888
хуй знает откуда в конце апостроф, сорь
881 1227893
>>227888
Двачаю, но тот кто пройдет эти задания может по праву считаться PHP инженером-программистом.
882 1228113
симфони или лаварел?
883 1228125
image.png43 Кб, 926x523
884 1228171
Как я понял, этот массив с регулярками считается за одну большую регулярку. Дайте подсказку, я не знаю, что я сделал не так.
885 1228173
>>228171
Спешите видеть долбаёба тим лида через 2 поста.
886 1228191
>>228171

Ты путаешь preg_match и preg_match_all

preg_match находит первое совпадение и заполняет массив данными (совпавшая строка + подстроки совпавшие с частями регулярки в скобках). То есть одно совпадение дает массив строк и подстрок.

preg_match_all находит все совпадения и возвращает массив массивов (2-мерный массив). В нем для каждого совпадения с регуляркой содержится массив.

Прочесть про формат массива можно в мануале http://php.net/manual/ru/function.preg-match-all.php

Увидеть массив можно, сделав var_dump($errors);
887 1228225
>>228113
Говно или моча?
888 1228233
Добрый день.
Столкнулся с тем, что не могу вызвать метод объекту, который равен null. выдает ошибку.
как фиксить?
889 1228246
>>228233
Пытаешься вызвать метод у объекта но переменная в которой якобы объект - пустой, проверяй успешно ли он инстанцировался.

Не знаю в какой тред написать. В общем работаю на мелкую контору почти три года, сам себя оцениваю как мидл но расти дальше тут не могу, таски однообразные но нет более профессиональных программистов в команде, то есть выше меня там нет пхпшников, есть люди примерно моего уровня и на этом все. По одному из проектов работали с другой крупной галерной - смотрел их проект на симфони - это просто сказка и песня для глаз. Я вижу именно уровень к которому хотел бы дойти. Что бы вы делали на этом моем месте? Пробовать связаться с рекрутерами этой команды? Думаю это очень неэтично. Другой выход? Не хочу впустую потратить ближайшие годы так как я не 20 летний давно
890 1228250
>>228246
Сколько денег платят? Какой город? Почему по собесам не хочешь походить?
891 1228254
>>228250
Платят как мне кажется меньше чем я мог бы получать на крупной галере (1.1к$) , город - мухосрань хохляндии. У нас тут некуда ходить на собеседования, так как наша фирма одна на город. Начинал с этого треда три года назад, потом устроился в фирму и только здесь и работал
892 1228273
>>228246

А что неэтичного? Ты же не крепостной и не обязан всю жизнь работать в одной компании.

Ты вполне можешь выйти на ту контору независимо, например, сказать им, что ты хочешь развиваться, чувствуешь что перерос уровень проектов в нынешней компании. Что смотрел сайт или выступления на конференциях людей из другой компании и был впечатлен тем, что они используют X, Y и Z, что тебе интересно было бы поработать с этими технологиями. Изучи компанию, при случае похвали какие-то хорошие стороны и это может произвести впечатление на собеседующих.
893 1228274
>>228273
Ну я там в принципе имею выходы в мессенджерах на пару программистов из той фирмы и пару менеджеров, неэтично в том плане, что фирмы вроде как конкурирующие. Хотя с другой стороны да, но всё равно какое-то горькое ощущение от всех этих увольнений и нервы опять таки и релокейт последующий.
894 1228398
>>228274

Ты для начальства такой же расходник как стол или компуктер, неэтично ему.
895 1228434
Почему у меня при каждом sudo service nginx reload dв логе error.log появляется строчка:
2018/07/15 01:11:06 [notice] 20055#20055: signal process started
?
896 1228468
>>227888

>/^[\s]{0,1}[+]{1,1}[\s]{0,1}[7]{1,1}([- \\(\\)][0-9]){10}$|^[\s]{0,1}[8]([- \\(\\)][0-9]){10}$/


немного пофиксил, это кривое выражения(видимо старое из трэя скопировал)
вот новое /^[\s]{0,1}(([+]{1,1}[\s]{0,1}[7]{1,1})|([8]{1,1}))([- \\(\\)]*[0-9]){10}$/
897 1228937
Продублирую из вкатывального тредиса.
Потихонечку вкатываюсь. Разобрался немного в Питоне, учу С++, делаю игру на гамаке (по фану, мне нравится), прочёл и порешал половину сикпа (отложил на потом) и встал вопрос. Делаю я это в основном на заводе и это неудобно, что пиздец, а кушать хочется. Стоит ли выучить пыху с жс и съебать на апворк вместо заводов, продолжая учить то, что нравится, или дохлый номер? В будущем хочу либо в гейдев (на анриале), либо в датасосинс (люблю математику и не прочь отучиться в ШАД или ещё где за границей). Ангельский норм, тоже подтягиваю потихоньку. Фрилансить на Питоне и с++ не думаю, что готов сейчас, а войти в веб мне кажется очень просто.
898 1229006
Хочу стать джуном в PHP конторе.
Что надо знать по минимуму?
Что надо знать середнячку?
Что надо знать по максимуму?
drawowl.jpg150 Кб, 1200x903
899 1229039
1 Когда читаешь гайд и решаешь задачки
2 Когда дошел до задачи со студентами
900 1229051
>>229006
долбаеб, просто умри
GaecXsgZG8Y.jpg38 Кб, 604x604
901 1229052
903 1229058
>>229056

>Знать Prolog


>Хорошо.


Сразу видно что этой диаграммой можно только жопу подтереть. Из всего пролога нужно знать только то, что в нём есть рекурсия. А рекурсию внезапно можно обьяснить и без пролога. Внезапно да? Хаскель и Эрланг хороши. Но чтобы быть хорошим программистом на них нужны не просто годы, пятилетки практики. И опять же нишевость языков - основной их недостаток.

>Асинхронное программирование


Серьёзно? Нет СЕРЬЁЗНО? Тоесть то, что буквально учится за минут 30 чтения и минут 30 практики? Не понимаю чего с ним все так носятся. Самая простая вещь в программировании. Даже массивы сложнее.

>Работа с БД из кода.


Наверное для ньюфагов это актуально. Никогда не понимал где могут быть проблемы с БД.

>web


>Фрэймворки


Я фэйспалмом лицо чуть не разбил. А конкретнее?
а, ну дальше я прочитал, это оказывается реклама какого-то сайта.
Ясно.
904 1229065
>>229058
чет проиграл с твоего высера. ты у мамы умный?
905 1229068
>>229065
С тобой никто не играл, петушок. А теперь проследуй назад в /b
906 1229073
>>229068
веди потише в этом треде.
Если мы учим пхп, то это не значит, что хотим стать таким же быдло, как и ты.
907 1229077
>>229073

>долбаеб, просто умри


>чет проиграл с твоего высера. ты у мамы умный?


>Мы не быдло ряяяяя


надеюсь тебя током убьёт когда ты в лифте ссать будешь.
908 1229080
>>229056
Какая-то очередная манясхема, ты я так понимаю начинающий?
Мутик.png613 Кб, 1280x700
909 1229083
>>229056

>Хочу стать джуном в PHP конторе.


>Учи Эрланг и Хаскель

910 1229091
Поясните за php.
Я нормас освоил html&css и вот думаю что учить дальше js или php. Как я понял в js зоопарк всякой хуйни + постоянно это всё меняется.
А в php как дела? Много надо знать для вката? А ещё меня напрягают все эти базы данных. Выглядит это всё сложно и страшно.
911 1229093
>>229091

>js зоопарк всякой хуйни + постоянно это всё меняется.



Это позавчера так было, сегодня уже 2.5 фреймворка и все.
912 1229094
>>229091
Посмотри вакансии лучше, чем местных слушать, очень помогает понять ситуацию. По моему городу больше всего пхп для джунов, хотя js вакансий в общем больше, но везде в пхп надо знать ещё и js более менее и верстку. Где js-пхп знать не требуют обычно. Базы вроде как не сложная вещь для уровня макакена.
913 1229097
>>229091
без разницы, php - фреймворки, галеры, поддержка старого кода. В основном.
js - фронтенд приложения, REACT.
суть в том, что нужно изучать не язык, а программирование.
914 1229105
>>229097
>>229094
>>229093
Ладно тогда попробую по другому: что легче осилить? Это будет мой первый язык.

>>229097
Я сейчас поймал себя на мысли, что мне просто не нравится фронтенд и я пытаюсь найти плюсы в php. Ы.
915 1229109
>>229093
Ну да, а ещё HomeBrew, GIT, Vargant, Rabbitmq, обязательные фрэймворки node.js, vue, react, angular.
Ещё хероку и вебпак в догонку изучи.

>не зоопарк.

916 1229111
>>229109
Да, не забудь что на PHP любой фрэймвокр - это почти одно и тоже, выучил один, со сторым за 2 дня освоишься. У JS фрэймворк - это религия. Переход от одного к другому - целая эпопея, боль и страдания. А ещё ты будешь весело скандалить с теми, кто не пишет на твоём фрэймворке каждый день постя в тред преимущечтва именно твоего. JS - странные ребята.
917 1229118

>node.js


почему ее так хейтят?
918 1229122
>>229118
Написали велосипед на JS. При этом до сих пор не смогли излечить болячки которые все нормальные фрэймворки лет 15 кназад решили.
ИМеет огромные проблемы с Эвент лупом.
919 1229123
>>229122
можно попроще,я еще изучаю только реакт
920 1229299
пасаны, такой вопросик, ковыряю ларавел, поставил вот эту приблуду - https://github.com/LaravelDaily/Laravel-Vue-First-CRUD
Терь такой вопрос, как сделать так, чтобы данные у каждого пользователя были свои?
921 1229360
Нигде не смог найти решение задачи с проверкой номеров нормальное. Неделю ебался с ней, но в итоге высрал вот это.
$regexp = "/^[\s]?[8][\s]?([\(]?[\s]?[\W]?[\s]?[0-9][\s]?[\)]?){10}$|^\+[\s]?[7][\s]?([\(]?[\s]?[\W]?[0-9][\)]?){10}$/";
Можно как-то ещё короче и правильнее решить?
922 1229373
>>229360
а ты неплох
923 1229374
>>229373
Не считаю это хорошим результатом. неделю + стоял на месте.
924 1229394
>>229360
Скинуть тебе готовое решение?
925 1229396
>>229394
Я бы был благодарен.
926 1229405
>>229396
https://ideone.com/TIoobw

Надеюсь описал максимально подробно, разбирайся. А я пойду ловить двух мух, а то будут спать мешать.
927 1229412
>>229374
Тоже долго ебался с этими регулярками.
Аноним 928 1229575
синьор пхп в треде. постараюсь ответить на максимум вопросов
Аноним 929 1229577
>>203564
пусть руками пишет. ибо массив в пхп - это не стек, а скорее хеш таблица. в крайнем случае в spl есть реализация. исходники не читал, но должно работать как реальные.
930 1229581
>>229575
1. Какой фреймворк должен знать крепкий джуниор?
2. Насколько хорошо должен знать JS и HTML/CSS?
3. Как происходит деплой и обновления у серьезных людей?
4. Сколько часов за рабочий день реально пишут код, а сколько проводят на митингах и т.п.?
931 1229590
>>229581
1. Какой по работе понадобиться. Джун - это тот, за кем надо следить, наставлять. Знание фреймворков никак не влияет. Конечно, хорошо бы посмотреть, потрогать один. Но не советую сидеть в нем до упора - учись читать исходники фреймов, писать код - намного больше профита в работе.
2. Лично я знаю не так много, поверхностно. Исправить для какого-то браузера что-то смогу, но в общем познания стремятся к нулю.
3. Деплой - процесс важный. Тут важно понимать требования системы. У кого то важен деплой без швов (чтобы фактически пользователи не замечали), а где-то на такие вещи можно забить (если двач полежит секунду - люди просто перезагрузят страницу и будут довольны). Если из общего наброска - сборка, тестирование образа, деплой. Удобно использовать докер, мы чисто на нем сидим (именно на кубере, почитайте ради интереса). Так же можешь посмотреть доклад баду с хайлоада https://www.youtube.com/watch?v=qMu4YHJV1Z8 - не досмотрел до конца, но говорил вроде нормально.
4. Когда как. Чтобы ты понимал - чаще всего ты читаешь код и разбираешься, а не пишешь. Плюс настройка, дебаг - считать ли это написанием кода ? Если ты джун - скорее всего ты больше пишешь, ибо ты по факту не ведущий на проекте. Если ты ведущий - то очень редко приходится писать и это скорее счастливый момент.
932 1229591
>>229575
Что сейчас более актуально в фрэймворках.
Что по БД, Предпочтение отдайтся Nosql или SQL всё ещё живее всех живых?
933 1229593
>>229591
ларавел, люмен, симфоня. с ними на хлеб точно заработаешь. мб уи какой-нибудь, но мне прям совсем не зашел.
nosql - специфичное решение не для всего. sql жив и будет жить. опыт и с тем и с тем (mongodb - nosql, postgres и mysql - sql). писали интернет магазин на монге - горело знатно и часто. ИМХО где данные строго типизированы - пиши на sql. как минимум, потому что в интернетах много инфы про это. а по монге еще искать и ебаться надо.
934 1229596
>>229575
хотел бы сразу добавить. я не сайтодел на фрилансе (не пишу сайтики на 1с), пишу в компаниях российского рынка (был опыт работы с азиатами). скорее всего из опыта пару мест вы знаете точно.
935 1229597
какие курсы посоветуете, чтобы при устройстве на работу сертификат засчитали?
936 1229598
>>229597
лол, никакие. в жопу их можешь себе засунуть. и ч не шучу
937 1229600
>>229597
единственное - zce, но это не курсы, а уже экзамен. и сдается он за неплохую сумму (от 10 до 20к русских, не помню точно). но это как прикол (как коньяк бати в шкафу за 4к, который он никогда не откроет) - чисто перед друзьями понты покидать.
938 1229604
>>229575
300кк в наносекунду получаешь? (Какие зп на рынке в целом по вилкам мидл синьор)?
939 1229606
>>229604
мидл - 120-140. выше уже к синьорам. ну и дальше лиды - вроде 230-250к в среднем.
940 1229607
>>229606
мидл точнее до 120-140. так то 90 уже нот бэд
941 1229608
>>229607
>>229606
Спасибо, мне тут за 90 предлагают джуном с релокейшном в ДС2. Думаю соглашаться.
942 1229609
>>229608
звучит слишком хорошо. присмотрись внимательно. если не секрет - что за контора, мб слышал.
943 1229610
>>229608
и откуда переезжать будешь
945 1229612
>>229611

>Getronix


вообще хз что это, думай сам. я бы ближе к мск ехал, тут в плане возможностей дофига и больше. и деньги не жмут
Getronix - Поиск в Google - Google Chrome 2018-07-17 09.52.[...].png45 Кб, 595x493
946 1229614
>>229611
Хуяси
947 1229615
>>229611
отмена моих слов, сьебывай если рашка заебала. я думал ты в дв поедешь, а не в амс.
948 1229616
>>229611

>


Но ты не думай, что тут все плохо, а там все совсем пиздец. Мои коллеги часто гоняли всюду - везде своя ебань, и где-то может гореть сильнее, чем от рф
949 1229622
>>229615
>>229616
Не, я сейдач на Дальнем Востоке, работу предлагают в Питере.
Вообще боюсь именно по знаниям, ибо вбруг там какой-нибудь другой стак работ или технологии с которыми я никогда не работал.
950 1229648
Сеньора-помидор, если ещё в треде, наверняка шаришь более менее за общую ситуацию на рынке, если выбор между пхп-джс и жавой, что посоветуешь сейчас выбрать?
951 1229652
>>229648
питон. За 40к работу сразу найдёшь.
952 1229665
>>229652
В Минске не нашёл питона
953 1229667
>>229665
Ищи вакансию, а не рептилию.
954 1229681
>>229648
И то, и то живее всех живых. Каждое свое и везде. Мне ява тоже катит, приятно. По деньгам их не обижают + ява это энтерпрайз (используется большими компаниями для крупных решений).
Похапэ так же жив, но зачастую это е-комерс (торговля в интернете). Так что думай сам, тут нет однозначного ответа. Все зависит от твоего желания.
Так что не суть. Тут диллема о двух стульях.
955 1229682
>>229665
Чет я слышал, что в РБ варгейминг на питоне пишет, разве нет ?
956 1229684
>>229622
Езжай и не думай. Это отличный шанс. А нового боятся не надо - это может стать твоей проблемой (если ты все время будешь бояться новых технологий).
Это технология, а не магия. В ней можно разобраться.
957 1229692
>>229682
Ну ради шанса попасть к этим сектантам ебанутым учить язык это бред
958 1229693
>>229681
К пхп-жс ещё плюс - фриланс и возможность для себя что-то сделать для заработка, плюс этот стек быстрее освоить чем жабу, я прав?
959 1229712
960 1229717
Кто-нибудь здесь в Symfony 4 разбирается?
961 1229720
>>229693
извини, на это не отвечу. я уже давно в этом деле и не могу ответить что легче выучить.
Вообще фриланс тема такая, ебанутая. Хочешь всю жизнь писать сайтики для ООО Какой-то колхоз - фрилнась. Но писать реально большие и крутые решения ты будешь уже чисто как пхп девелопер (или чисто ява).
я яву смотрел, не увидел вообще ничего сложного. она простая
962 1229721
>>229712
погуглил - вроде это не сообщение о проблеме (как я понял что все нормально запустилось). посмотри куда у тебя пишутся логи нгинкса. возможно все логи пишутся в еррор и вот ты и видишь
963 1229724
>>229717
как у меня горит от этой системы
964 1229725
>>229720
посмотри на спринг))
965 1229728
>>229575
Что нужно знать, чтобы вкатиться на первую работу?
966 1229739
>>229728
нужно знать, как читать шапку треда в котором пишешь. ты можешь идти нахуй сразу
967 1229749
>>229739
Ну что вы злые люди то?
968 1229756
Прошу прощения я написал этот пост
>>229006
И после этого тред скатился из обсуждения PHP. Я этого не хотел. Алсо это мой второй пост.
969 1229770
Вопрос по упражнению рандома имени для животного.

Прежде чем прочитать строкой ниже задания два правильных метода решения, попытался реализовать следующим образом:
https://ideone.com/KQMg9r
, через условия, привязанные к значениям счётчика цикла, за каждый цикл заполняющие один слог имени тварины в одну переменную.

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

Собственно вопрос, каково объяснение подобному некорректному выполнению очевидного алгоритма?прочитать в доках про функцию "if"
970 1229837
Ребята, помогите, пожалуйста, что-то не идет, нужно такое:

Если я в корне домена, т.е. http://domen.com выводим 1
Если я внтури, т.е. http://domen.com/anyword/ - то выводим 2
Если я внутри-внутри, т.е. http://domen.com/anyword/anyword/ то выводим 3
972 1229859
>>229770
Тому що надо сравнивать, а не присваивать.
image.png1,1 Мб, 674x959
973 1229868
Аноны, хелпуйте, как правильно коневртнуть дату в формате string :(Tue, 17 Jul 2018 11:40:05 GMT) в формат DATETIME, чтобы в mysql базу заносилось уже все виды перепробовал, отдаёт ебучий boolean.
Ещё вот хуйня вылазит, видимо из-за проблемы выше., но мб и нет :"Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number in"
974 1229880
>>229868
видимо проблема в sql. скинь схему бд и запрос, который ты посылаешь.
image.png39 Кб, 967x170
975 1229887
>>229880
запрос:
$query = "INSERT INTO source__ (url, l_update) VALUES (:link, :dtime) ON DUPLICATE KEY UPDATE l_update = :dtime";
$stmt2 = $pdo->prepare($query);
976 1229894
>>229859

Ох я и еблан, спасибо.
977 1229913
>>229894
если тебе интересно, как можно было еще сделать это задание то вот https://ideone.com/GznHoR
мимо
978 1229933
>>229846
Спасибо. А как мне взять именно третий запрос? Регуляркой лучше?
979 1229992
>>229933
можно и регуляркой, но имхо - по практике без регулярки всегда быстрее. в разработке регулярка крайне редко используется.
980 1229998
Аноны помогите с задачей. Нужно числа прописью писать... вот что есть:
<?php

error_reporting(-1);
$word1 = '';
$word2 = '';
$word5 = '';

function inclineWord($number)
{
$percent = $number % 10;
if ($percent == 1) {
$word1 = ' рубль';
return $word1;
}
if ($percent > 1 and $percent < 5) {
$word2 = ' рубля';
return $word2;
}
if ($percent > 4) {
$word5 = ' рублей';
return $word5;
}
}

function smallNumberToText($number)
{

$spelling = array(
0 => 'ноль',
10 => 'десять',
100 => 'сто',
1 => 'один',
11 => 'одиннадцать',
20 => 'двадцать',
200 => 'двести',
2 => 'два',
12 => 'двенадцать',
30 => 'тридцать',
300 => 'триста',
3 => 'три',
13 => 'тринадцать',
40 => 'сорок',
400 => 'четыреста',
4 => 'четыре',
14 => 'четырнадцать',
50 => 'пятьдесят',
500 => 'пятьсот',
5 => 'пять',
15 => 'пятнадцать',
60 => 'шестьдесят',
600 => 'шестьсот',
6 => 'шесть',
16 => 'шестнадцать',
70 => 'семьдесят',
700 => 'семьсот',
7 => 'семь',
17 => 'семнадцать',
80 => 'восемьдесят',
800 => 'восемьсот',
8 => 'восемь',
18 => 'восемнадцать',
90 => 'девяносто',
900 => 'девятьсот',
9 => 'девять',
19 => 'девятнадцать'
);
$text = '';
if ($number == 0) {
return $spelling[$number];
}
if ($number > 0 and $number < 10 or $number > 10 and $number < 20) {
return $spelling[$number];
} else {
return $spelling[$number];
}

}

$a = smallNumberToText(200);

echo $a;<?php

error_reporting(-1);
$word1 = '';
$word2 = '';
$word5 = '';

function inclineWord($number)
{
$percent = $number % 10;
if ($percent == 1) {
$word1 = ' рубль';
return $word1;
}
if ($percent > 1 and $percent < 5) {
$word2 = ' рубля';
return $word2;
}
if ($percent > 4) {
$word5 = ' рублей';
return $word5;
}
}

function smallNumberToText($number)
{

$spelling = array(
0 => 'ноль',
10 => 'десять',
100 => 'сто',
1 => 'один',
11 => 'одиннадцать',
20 => 'двадцать',
200 => 'двести',
2 => 'два',
12 => 'двенадцать',
30 => 'тридцать',
300 => 'триста',
3 => 'три',
13 => 'тринадцать',
40 => 'сорок',
400 => 'четыреста',
4 => 'четыре',
14 => 'четырнадцать',
50 => 'пятьдесят',
500 => 'пятьсот',
5 => 'пять',
15 => 'пятнадцать',
60 => 'шестьдесят',
600 => 'шестьсот',
6 => 'шесть',
16 => 'шестнадцать',
70 => 'семьдесят',
700 => 'семьсот',
7 => 'семь',
17 => 'семнадцать',
80 => 'восемьдесят',
800 => 'восемьсот',
8 => 'восемь',
18 => 'восемнадцать',
90 => 'девяносто',
900 => 'девятьсот',
9 => 'девять',
19 => 'девятнадцать'
);
$text = '';
if ($number == 0) {
return $spelling[$number];
}
if ($number > 0 and $number < 10 or $number > 10 and $number < 20) {
return $spelling[$number];
} else {
return $spelling[$number];
}

}

$a = smallNumberToText(200);

echo $a;
980 1229998
Аноны помогите с задачей. Нужно числа прописью писать... вот что есть:
<?php

error_reporting(-1);
$word1 = '';
$word2 = '';
$word5 = '';

function inclineWord($number)
{
$percent = $number % 10;
if ($percent == 1) {
$word1 = ' рубль';
return $word1;
}
if ($percent > 1 and $percent < 5) {
$word2 = ' рубля';
return $word2;
}
if ($percent > 4) {
$word5 = ' рублей';
return $word5;
}
}

function smallNumberToText($number)
{

$spelling = array(
0 => 'ноль',
10 => 'десять',
100 => 'сто',
1 => 'один',
11 => 'одиннадцать',
20 => 'двадцать',
200 => 'двести',
2 => 'два',
12 => 'двенадцать',
30 => 'тридцать',
300 => 'триста',
3 => 'три',
13 => 'тринадцать',
40 => 'сорок',
400 => 'четыреста',
4 => 'четыре',
14 => 'четырнадцать',
50 => 'пятьдесят',
500 => 'пятьсот',
5 => 'пять',
15 => 'пятнадцать',
60 => 'шестьдесят',
600 => 'шестьсот',
6 => 'шесть',
16 => 'шестнадцать',
70 => 'семьдесят',
700 => 'семьсот',
7 => 'семь',
17 => 'семнадцать',
80 => 'восемьдесят',
800 => 'восемьсот',
8 => 'восемь',
18 => 'восемнадцать',
90 => 'девяносто',
900 => 'девятьсот',
9 => 'девять',
19 => 'девятнадцать'
);
$text = '';
if ($number == 0) {
return $spelling[$number];
}
if ($number > 0 and $number < 10 or $number > 10 and $number < 20) {
return $spelling[$number];
} else {
return $spelling[$number];
}

}

$a = smallNumberToText(200);

echo $a;<?php

error_reporting(-1);
$word1 = '';
$word2 = '';
$word5 = '';

function inclineWord($number)
{
$percent = $number % 10;
if ($percent == 1) {
$word1 = ' рубль';
return $word1;
}
if ($percent > 1 and $percent < 5) {
$word2 = ' рубля';
return $word2;
}
if ($percent > 4) {
$word5 = ' рублей';
return $word5;
}
}

function smallNumberToText($number)
{

$spelling = array(
0 => 'ноль',
10 => 'десять',
100 => 'сто',
1 => 'один',
11 => 'одиннадцать',
20 => 'двадцать',
200 => 'двести',
2 => 'два',
12 => 'двенадцать',
30 => 'тридцать',
300 => 'триста',
3 => 'три',
13 => 'тринадцать',
40 => 'сорок',
400 => 'четыреста',
4 => 'четыре',
14 => 'четырнадцать',
50 => 'пятьдесят',
500 => 'пятьсот',
5 => 'пять',
15 => 'пятнадцать',
60 => 'шестьдесят',
600 => 'шестьсот',
6 => 'шесть',
16 => 'шестнадцать',
70 => 'семьдесят',
700 => 'семьсот',
7 => 'семь',
17 => 'семнадцать',
80 => 'восемьдесят',
800 => 'восемьсот',
8 => 'восемь',
18 => 'восемнадцать',
90 => 'девяносто',
900 => 'девятьсот',
9 => 'девять',
19 => 'девятнадцать'
);
$text = '';
if ($number == 0) {
return $spelling[$number];
}
if ($number > 0 and $number < 10 or $number > 10 and $number < 20) {
return $spelling[$number];
} else {
return $spelling[$number];
}

}

$a = smallNumberToText(200);

echo $a;
981 1229999
>>229998
Ты лучше залей на ideone и опиши подробнее что тебе не понятно, иначе тебя сейчас закидают какашками.

мимо решающий эту задачу
982 1230018
>>229999
Так и сделал
https://ideone.com/KZr3p4
Конкретно не знаю(точнее представляю, ну не уверен как это сделать) как заставить складывать строчки при постплении чисел, например 219(двести + девятнадцать). >>229998
983 1230085
>>230018
Думаю, что нужно объединить особенные числа (от 11 до 19). Я вижу такую функцию:

1. Разделяем число на массив из 3-х чисел
2. Проверяем число под первым ключом массива = 1, а также число под нулевым ключом от 1 до 10?
3. Тогда склеиваем значения массива под ключами 0 и 1.
4. Отдаем массив с двумя числами, одно из которых склеенное.

Например если пропустить через функцию число 219, получится 2 и 19.

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

Надеюсь я понятно объяснил.
984 1230087
>>230085
*Число под первым ключом массива = 1, а также число под нулевым ключом от 1 до 9?
985 1230106
>>230085
Попробую, спасибо)
жопагоритблять.png116 Кб, 718x938
986 1230200
Язык PHP.Тема проги: регенерация имени по слогам.Просто пиздец нахуй блять трясет, такая хуйня скорее всего простая,а я ебал нахуй сил блять нету уже.
Прошу помощи, необязательно прямой ответ, но хоть какую нибудь подсказку, команду и тд
987 1230206
>>230200

В чем сложность? Не можешь слоги в имя собрать?

Есть 2 варианта, первый- создать до цикла массив, в цикле класть в него новый слог, после цикла склеить все в строку с помощью implode.

Второй вариант - создать пустую строку и в цикле приклеивать к ней каждый слог.
988 1230242
>>230206
это то да,но никак не могу понять что за команда то нужна
989 1230243
>>230206
общая идея проста и понятна, но вот реализация
990 1230263
>>230200
Там же вся задача уже написана для тебя, осталось всего "одну букву предложение вставить" , я даже хз зачем автор так подробно заготовки это сделал, я решал с нуля все несмотря в них, за час где-то до функций дошел
991 1230313
Анон, насколько жирны твои контроллеры.
Пилю студентов и обработка формы получается 15 Loc
Толсто?
992 1230327
>>230243

Первый вариант

$syllables = [];
$syllables[]= 'ка';
$syllables[]= 'на';
echo implode('', $syllables);

Второй

$name = '';
$name .= 'ка';
$name .= 'на';

echo $name;

Если ты этого не знал, то возможно тебе стоит попросить дополнительные задачки, чтобы попрактиковаться в работе со строками и массивами.

Как тебе такая задача? Дан массив слов. Надо вывести их в несколько строк, так, что в каждой строке собраны слова, начинающиеся с одной и той же буквы.

На входе: список слов: кот, собака, кит, сова
На выходе:

- кот, кит
- собака, сова

Спрашивай, если что-то непонятно.
992 1230327
>>230243

Первый вариант

$syllables = [];
$syllables[]= 'ка';
$syllables[]= 'на';
echo implode('', $syllables);

Второй

$name = '';
$name .= 'ка';
$name .= 'на';

echo $name;

Если ты этого не знал, то возможно тебе стоит попросить дополнительные задачки, чтобы попрактиковаться в работе со строками и массивами.

Как тебе такая задача? Дан массив слов. Надо вывести их в несколько строк, так, что в каждой строке собраны слова, начинающиеся с одной и той же буквы.

На входе: список слов: кот, собака, кит, сова
На выходе:

- кот, кит
- собака, сова

Спрашивай, если что-то непонятно.
993 1230328
>>230327

Задача про группировку слов конечно не простая, но позволит лучше изучить массивы.
994 1230358
>>230327
Я не тот анон, но можешь оценить алгоритм мой? Компа пока под рукой нет, напишу на словах. Создаём пустой массив2 и начинаем циклом проходить по исходному массиву1. В теле цикла берём подстроку, состоящую из первого символа (буквы) и проверяем есть ли в массиве2 ключ с таким значением.
1) Если нет, то заносим в массив2 такой ключ, а в значение заносим весь элемент из массива1.
2) Если есть уже такой ключ, то для значения по этому ключю делаем конкатенацию со сторокой ", элемент массива1".
995 1230361
>>230358
Ну и выводим весь наш массив2, новый элемент-новая строка
996 1230411
>>230327
Код на такую задачу должен так выглядеть ?
Или есть более хорошие варианты решения ?
<?php
error_reporting(-1);
$words = array(
к => 'кот', 'кит',
с => 'собака', 'сова'
);
$КWords = '';
$СWords = '';
if (array_key_exists(к, $words)) {
echo "Слова на букву к- 'кот', 'кит'\n";
}
if (array_key_exists(с, $words)) {
echo "Слова на букву с- 'собака', 'сова'\n";
}
?>
997 1230413
>>230411
Перечитай условие
998 1230416
>>230413
ну так.С одной и той же буквы
999 1230426
>>230416
Ты вручную это сделал, у тебя изначально по условию дан массив со словами без ключей, а не два массива с ключами уже готовые, как сделал ты (слов быть и 100 со всеми буквами алфавита)
1000 1230427
>>230426
может быть*
1001 1230452
>>230413
пздц, вообще никак.Либо не работает, либо по условию не подходит
1002 1230462
>>230452
Прочитай, как я тут предположил- >>230358, возможно, я правильно составил, я сам только со вчера вкатываюсь, зайдет оп-думаю понятнее объяснит
1003 1230471
>>230462
так там ключи есть, а нужно без них
1004 1230474
>>230471
Ща я домой зайду-напишу код и скину
1005 1230518
>>230411

Слова на вход подаются одним списком, а ты их вручную отсортировал по буквам. Это неправильно.

Должно быть $words = ['кот', 'собака', ...];

>>230358

Идея правильная, но надо бы выразить ее в виде кода, а то может что-то не учтено.
1006 1230523
Долго ебался с идеоном, не хотела там сабстр работать http://sandbox.onlinephpfunctions.com/code/ea6424bde2f4307901cbf54cdcdec52ecd1de7c3
1007 1230524
как заставить работать mb функции на идеоне?
1008 1230534
1009 1230576
>>230523

Решено верно.
gothiclecturebydaedradagon-d7kft6i.jpg271 Кб, 900x636
1010 1230582
Ананасы есть среди вас успешные PHP кодеры? Хочу поступить в ученики.
Я не плохо все соображаю, шарю в ООП, но есть вопросы по поводу реализации некоторых вещей.
Например: При добавление в БД каких-то значений, кнопка обновить повторяет последний запрос и соответственно добавляет в БД значения столько сколько будет нажата пользователем. Единственный вариант решения, который я знаю, это делать самопереадресацию через header("Location: $_SERVER[PHP_SELF]"); А это в свою очередь требует для исключения ошибки "Warning: Cannot modify header information - headers already sent by" включение в php.ini буферизации и использования функций в буфер и из буфера. Это единственный вариант? И т.д.
Готов в замен писать код для Гуру
1011 1230614
>>230582
редирект на php_self не лучший вариант, по ряду причин, лучше типа
REQUEST_SCHEME . '://' . HTTP_HOST . REQUEST_URI
это тоже все ключи в $_server

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

если не охота редиректить можешь в форму токен какой-то добавить; рандомное число нарпимер, при отправке формы сохраняй в сессию - если совпадает значит это _скорее всего_ рефреш; лучше date now наверное
6-3-Kalom1.jpg240 Кб, 768x576
1012 1230642
>>230614

>буферизация не обязательна по идее если ты убедишься что ничего не выводишь ДО модификации заголовков, как бы смешно и тривиально не звучало


Дело в том что у меня в кодировке UTF-8 и других (например cp1251) ругается:
"Warning: Cannot modify header information - headers already sent by"
А как только я меняю кодировку на UTF-8 без BOM тогда ошибки нет. Не знаю по чему. У меня вроде никаких выводов нет, но это как я понимаю - может ошибаюсь.

А что такое токен? Я не понимать.
1013 1230706
>>230642
Лучше почитай про BOM (byte order mark) чтобы небыло "чет поменял и чет получилось". Кажется у опа в шапке или туторах где-то про это было, это одна из таких платиновых проблем.

Твоя сборка php распознает BOM как обычные символы и сразу выводит, а т.к. BOM расположены до <?php то у тебя не остается шанса отложить вывод. Варианты:
1. сохранять всегда без BOM, для utf8 он не нужен насколько я понимаю
2. можно пересобрать php так чтобы он корректно обрабатывал BOM, заодно получишь новый ценный опыт (как именно собирать отдельная комплексная тема)

Почему такое получается в cp12 кодировках не знаю; возможно у тебя либо сообщения об ошибках вываливаются или какой-то мусор перед <?php тегом стоит.

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

Токен может быть чем угодно, просто название для какой то "метки"
1. придумай для "метки" какой-то ключ в сессии, желательно между разными формами использовать разные ключи
2. придумай способ создания "метки". Думаю хватит таймстемпа; лучше к нему конкатенировать случайное число
3. в выводе формы добавь скрытый input с этим токеном
4. на бекенде при получении POST'а делай примерно так:
4.1.1. если ключ в сессии не установлен - форма отправлена впервые и её можно обработать;
4.1.2. значение установлено но отличается - форма отправлена с новыми данными и её можно обработать (это не точно)
4.1.3. значение совпадает - юзер рефрешнул страницу отправив те-же данные, форму не нужно обрабатывать;
4.2. установи значение по ключу в сессии в значение input'а с токеном

- юзер мог специально, осознанно отправить такую-же форму заново, уже с новым токеном; возможный вариант - токенизировать сами данные формы (загнать в хеш-функцию например), но тогда ты лишаешь юзера возможности послать данные еще раз, даже если это реально нужно, однако только пока жива сессия; чтобы максимально защититься - придется где-то хранить все полученные таким образом токены от юзера, в бд или ином хранилище.
1013 1230706
>>230642
Лучше почитай про BOM (byte order mark) чтобы небыло "чет поменял и чет получилось". Кажется у опа в шапке или туторах где-то про это было, это одна из таких платиновых проблем.

Твоя сборка php распознает BOM как обычные символы и сразу выводит, а т.к. BOM расположены до <?php то у тебя не остается шанса отложить вывод. Варианты:
1. сохранять всегда без BOM, для utf8 он не нужен насколько я понимаю
2. можно пересобрать php так чтобы он корректно обрабатывал BOM, заодно получишь новый ценный опыт (как именно собирать отдельная комплексная тема)

Почему такое получается в cp12 кодировках не знаю; возможно у тебя либо сообщения об ошибках вываливаются или какой-то мусор перед <?php тегом стоит.

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

Токен может быть чем угодно, просто название для какой то "метки"
1. придумай для "метки" какой-то ключ в сессии, желательно между разными формами использовать разные ключи
2. придумай способ создания "метки". Думаю хватит таймстемпа; лучше к нему конкатенировать случайное число
3. в выводе формы добавь скрытый input с этим токеном
4. на бекенде при получении POST'а делай примерно так:
4.1.1. если ключ в сессии не установлен - форма отправлена впервые и её можно обработать;
4.1.2. значение установлено но отличается - форма отправлена с новыми данными и её можно обработать (это не точно)
4.1.3. значение совпадает - юзер рефрешнул страницу отправив те-же данные, форму не нужно обрабатывать;
4.2. установи значение по ключу в сессии в значение input'а с токеном

- юзер мог специально, осознанно отправить такую-же форму заново, уже с новым токеном; возможный вариант - токенизировать сами данные формы (загнать в хеш-функцию например), но тогда ты лишаешь юзера возможности послать данные еще раз, даже если это реально нужно, однако только пока жива сессия; чтобы максимально защититься - придется где-то хранить все полученные таким образом токены от юзера, в бд или ином хранилище.
1014 1230711
Как часто регклярки применяются в реальной разработки на уровне выше, чем проверка правильности введённого номера телефона или адреса?
1015 1230720
>>230711
Вопрос не имеет смысла т.к. не имеет единственного верного ответа.
Их можно применять где угодно где требутеся заменить или найти текст по строгому паттерну, например в парсинге, роутинге, шаблонизации. Их можно и "по жизни" использовать. Но у регулярок нет "выше" и "ниже". Корректно проверить валидность телефона или емейла тоже не "низкая" задача. Либо ты понимаешь идею полностью и следовательно видишь границы применимости и можешь сделать что угодно в их пределах, либо понимаешь не полностью.
1016 1230724
>>230720
Пока что не могу границы понять, так как не писал ни парсинги, ни шаблонизаторы и опыта нет. После твоего ответа понял, спасибо.
1017 1230752
>>230523
спасибо, но что за цифры 0 и 1 в этом фрагменте ? $firstLatter = mb_substr($animal, 0, 1);
Обозначают первые буквы ?
1018 1230760
>>230752

В мануале ответа нет? http://php.net/manual/ru/function.mb-substr.php
1019 1230791
>>230752
В пхп нумерация массивов и строк с 0, 0-это номер символа, 1-сколько символов взять, получается первый - первая буква слова
1020 1230825
ОП, поделись пожалуйста секретом. Где ты находишь время на то, чтобы углубляться в различные темы и досконально их изучать? Я сомневаюсь, что это всё было изучено в универе, я оттуда мало полезного вынес. На работе во всё углубляться не получается, времени всегда в обрез, гонят вперёд и вперёд, в итоге нет глубокого усвоения тем, только поверхностное, достаточное для выполнения задачи. Начал дома заниматься дополнительно и спустя 2 недели понял, что это путь к выгоранию, так как за день в сумме слишком много думаю и даже невзирая на полноценный сон начинаю совершать глупые ошибки на работе.
1021 1230877
Ананасы,

1)
class Order
{
function create($user_id, $item_id)
}

2)
class Order
{
function create(User $user, Item $item)
}

Какой подход правильный? Первый с передачей только Id и выкидыванием Exception'ов, если юзер или айтем не найден.
Или второй, где ты уже уверен в передаваемых объектах?
1022 1230883
>>230877
2-ой. Но ты уверен только в типах. Все равно можно не найти и отпраздновать это событие швыряним эксцепшена.
1023 1230887
>>230883
не понял, как не найти? Если передается объект класса User, данные для которого берутся из БД, то я разве не могу быть уверен, что юзер существует?
83081-gothic-windows-screenshot-in-the-swamp-camp-weird-peo[...].jpg41 Кб, 640x480
1024 1230889
Ситуация (всю работу запорола СУКА, БЛЯТЬ!)

Есть код:

<?
session_start();
$_SESSION['username'] = "maksim";
echo 'Привет, '.$_SESSION['username']."<br>";
?>

1)в Notepad++ 7.5.7 кодировка UTF-8 - сохраняю/выполняю
Результат:

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already

sent (output started at C:\Web\Apache2.2\htdocs\1.php:1) in C:\Web\Apache2.2\htdocs\1.php on line 2
Привет, maksim

2) В Notepad++ 7.5.7 кодировка UTF-8 без BOM - сохраняю/выполняю
Результат:

Привет, maksim

3) Новый текстовый документ (кодировку не знаю) - сохраняю/выполняю
Результат:

Привет, maksim

Виноват Notepad++, но я не понимаю в чем. (Кстати абсолютно та же ситуация с ошибкой "Warning: Cannot modify header information - headers already sent by" - тут >>230642) Переустановил

Notepad++ 7.5.7 - ситуация таже. Писать в txt без подсветки синтаксиса как-то не в кайф.
Что делать?
83081-gothic-windows-screenshot-in-the-swamp-camp-weird-peo[...].jpg41 Кб, 640x480
1024 1230889
Ситуация (всю работу запорола СУКА, БЛЯТЬ!)

Есть код:

<?
session_start();
$_SESSION['username'] = "maksim";
echo 'Привет, '.$_SESSION['username']."<br>";
?>

1)в Notepad++ 7.5.7 кодировка UTF-8 - сохраняю/выполняю
Результат:

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already

sent (output started at C:\Web\Apache2.2\htdocs\1.php:1) in C:\Web\Apache2.2\htdocs\1.php on line 2
Привет, maksim

2) В Notepad++ 7.5.7 кодировка UTF-8 без BOM - сохраняю/выполняю
Результат:

Привет, maksim

3) Новый текстовый документ (кодировку не знаю) - сохраняю/выполняю
Результат:

Привет, maksim

Виноват Notepad++, но я не понимаю в чем. (Кстати абсолютно та же ситуация с ошибкой "Warning: Cannot modify header information - headers already sent by" - тут >>230642) Переустановил

Notepad++ 7.5.7 - ситуация таже. Писать в txt без подсветки синтаксиса как-то не в кайф.
Что делать?
1025 1230903
>>230887
Сорян не заметил что у тебя там create
1026 1231006
>>230889
Открой в браузере у себя инструменты разработчика; проверь в ответе от сервера заголовки. Например:
content-type: text/html; charset=UTF-8

У тебя символы отдаются как будто стоит:
content-type: text/html; charset=cp1251

Видимо у тебя там автоматически определяется кодировка по BOM и так далее; в ручную добавь:
header ('content-type: text/html; charset=utf-8', true );
И сохраняй в utf-8 без BOM

И свою строчку с сессией модифицируй например так, т.к. твой вариант никак не доказывает что сессия заработала:
$last_date = isset($_SESSION['last_date']) ? $_SESSION['last_date'] : $_SESSION['last_date'] = date( "Y-m-d H:i:s" );

лучше не кодь в нотпаде, поставь хотябы нетбинс
1027 1231033
А что лучше всего из бесплатного для пхп? Нетбинс ?
1028 1231054
>>230825
Либо ОП просто начал изучать намного раньше чем ты. Либо у ОПа IQ выше, и он за одинаковый промежуток времени успевает переварить больше информации, чем ты.
1029 1231055
>>231033
Может не самое лучшее, но нетбинс таки ничего такой.
1030 1231091
Анончики, буксую, помогите, если не трудно. Есть файл со строками:

apple|green,red,yellow
pearl|green,red,yellow
....

Помогите распарсить его в двухмерный массив, пожалуйста.
1031 1231103
>>231091
в чем конкретно у тебя проблема?
1032 1231108
>>231103
Я не понимаю, как вложить второй массив, разделеный запятыми в первый.
1033 1231115
>>231108
а индексы у тебя уже стоят?
т.е.:
'apple' => 'green,yellow,...'

если да то просто пройдись по массиву и бери элементы по ссылке, вот так:
foreach ( $items as &$item ) {
$item = explode ( ... );
}

если ты читаешь файл как белый человек (в цикле по строкам), то все еще лучше, в теле цикла просто:
$row_data = explode( '|', $row );
$array[ $row_data[0] ] = explode( ',', $row_data[1] );
p.jpg187 Кб, 1021x571
1034 1231151
Могу ли я на PHP:

1) собрать из нескольких текстовых файлов один файл.

2) обработать его специальной утилитой (что-то типа "gangbang.exe -file example.txt")

3) внести его имя в файл истории версий (cоmpоser.jsоn)

4) поместить его и другие некоторые файлы в zip архив и убрать расширение (просто файл example).

5) поместить этот архив в нужную мне папку на хранение.

6) усе это сделать одним кликом (естественно все пути я не поленюсь где-то прописать сперва)(один раз)

Воть. Sоunds like awful lоt tо dо.
d53ca4f45c0eb96cab5aceb27e9e3c4b.png27 Кб, 687x339
1035 1231163
>>231115
Нет, индексов нет. Уфф, ну что ему не так то?

https://ideone.com/pGbcmi

Тут пример со штатами и кодами, а не фруктами = сорьки, если дата-файл вида:

Alabama|205,251,256,334
Alaska|907
Alberta|403,587,780

1. Парсим через file файл -получаем массив строк
2. Парсим каждую строку через "|" - получаем массив из двух элементов, так?
3. Парсим второй элеент массива через "," - получаем коды, так?

Выдает ошибку :(
1036 1231170
>>231163
в твоем коде $lineArr[1] содержит строку (string), например:
"205,251,256,334". $lineArr[0] при этом содержит строку "Alabama".

Чтобы получить коды второй цикл тебе даже не нужен, пиши сразу:
$codes = explode( ',', $lineArr[1] );

В общем, порядок операций перепутал.

Как только ты видишь что у тебя тип аргумента не совпадает, глянь в стек-трейс или залоггируй куда-то её значение - сразу бы понял проблему.
7991ab62e5c78057556e8607dc97bcb8.png38 Кб, 1051x261
1037 1231177
>>231170
Спасибо, няша. Вот теперь, когда я обращаюсь к $stateContents ведь это глаыный массив, так? я получаю вместо этого буквы из штатов.

$stateContents[2][3]

А не код из определенной строки.

>Как только ты видишь что у тебя тип аргумента не совпадает, глянь в стек-трейс или залоггируй куда-то её значение - сразу бы понял проблему.


Я пользуюсь, xdebug, но мне ненравится в нем то, что он не показывает значения когда скрипт уже выполнился - пустое окно остается. Поэтому приходится вконце вставляет какую-то пустышку, чтобы видеть, не очень удобно, но лучше var_dump
1038 1231179
>>231177
потому что ты не поменял значения в ключах массива $stateContents.
Если бы строки в php не разрешали обращаться к себе как к массивам ты бы понял фигню.
По факту ты обращаешься:

>$stateContents [ третья строка изначального массива ] [ четвертый символ в строке ]



У тебя видимо прниципиальная проблема в понимании.

>foreach ( ... ) {


> // То, что ты там написал explode и переменные -


> // не имеет никакого отношения к $stateContents


>}



Чтобы изменить именно значения в массиве тебе нужно явно обратиться к нему внутри самого цикла.
В данной ситуации задача чуть менее тривиальна - тебе нужно сначала в foreach брать не только $line но и её индекс:
foreach ( $lines as $line_number => $line_content ) {

и потом когда ты всё разрезал сначала:

>unset( $lines[ $line_number ] );


а затем:

>$lines[ $state_name ] = $state_codes;

1039 1231192
>>231151

> Могу ли я на PHP:



> 1) собрать из нескольких текстовых файлов один файл.



Си синьор

> 2) обработать его специальной утилитой (что-то типа "gangbang.exe -file example.txt")



Си синьор

> 3) внести его имя в файл истории версий (cоmpоser.jsоn)



Си синьор

> 4) поместить его и другие некоторые файлы в zip архив и убрать расширение (просто файл example).



Си синьор

> 5) поместить этот архив в нужную мне папку на хранение.



Си синьор

> 6) усе это сделать одним кликом (естественно все пути я не поленюсь где-то прописать сперва)(один раз)



Нет, синьор. Придется сначала погуглить, чтобы собрать скрипт под свои задачи.
1040 1231256
>>231192
Ну я и имел в виду я запускаю в консоли ebash.php и оно всю эту рутину сделает за меня. Но сам скрипт я напишу естестенно, не из воздуха же.
gothic 2018-07-19 13-12-10-73.jpg155 Кб, 1600x1024
1041 1231271
>>231006

>Открой в браузере у себя инструменты разработчика; проверь в ответе от сервера заголовки.


Проверял. Не нашел.
Думал проблема плагинов в браузере, но запускаю на чистом IE - та же ситуация.
Пока принято решение коддить в ANSI (вариант CP1251).

>$last_date = isset($_SESSION['last_date']) ? $_SESSION['last_date'] : $_SESSION['last_date'] = date( "Y-m-d H:i:s" );


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

Ставлю netbeans - буду экспериментировать.
e.JPG24 Кб, 372x249
1042 1231287
>>231271

>Проверял. Не нашел.



В смысле не нашел?
1043 1231292
Зацените.
1) Код в Notepad++ 7.5.7 кодировка UTF-8 - сохраняю
2) Открываю его же в NetBeans 8.2 и вижу "-" перед "<?"
Какого хуя, не понимаю.
gothic 2018-07-19 13-13-59-70.jpg149 Кб, 1600x1024
1044 1231294
>>231287
В прямом. Открывал в Опере Посмотреть код элемента.
Возможно, я дебил
1045 1231295
ОП, решил задачу на регулярку про первую проверку телефонных номеров, все твои номера проверяет хорошо, но у меня ощущение, что я написал какой-то громоздкий пиздец :

/^((([-][(] [)]))8|([+](([-][(] [)]))7))(([-][(] [)]))(([0-9](([-][(] [)]))){10})$/
1046 1231296
>>231295
Бля, проебались звезды, вот короче тут решение
http://sandbox.onlinephpfunctions.com/code/31c05ef5a0f70abb8c62dced70329caaa516dcf4
1047 1231299
>>231294
>>231292

У меня все работает. Даже интересно, что у тебя забагалось.
1048 1231311
>>231294

Надо в инструментах открыть вкладку Network (сеть) и перезагрузить страницу. И тогда там появится HTTP-запрос. Кликнув по нему, можно увидеть заголовки. Попробуй еще раз.
1049 1231351
>>231292
Хули ты удивляешься минусу в нетбинсе, если в н++ у тебя красный минус на первой же строке?

шучу, говноеды, вы проебались с настройками апача, в этом корень ваших бед. Под спермой юзайте apache lounge или nginx
1050 1231352
>>231311
Вот нахуй ты хуйню советуешь? Дос аточно запустииь браузер в приватном режиме кэш-хуешь ничего не подгружается и только тогда переходить на страницу
1051 1231368
>>231351

>вы



Ебанутый, ты тут один!
1052 1231371
>>231368
Не маняврируй.

> я скозал
gothic 2018-07-19 13-11-55-29.jpg177 Кб, 1600x1024
1053 1231749
Вот тут нашел свою проблему. Но не решение. Пробовал на 2х компах - ситуация та же.
http://phpfaq.ru/newbie/headers
Byte Order Mark
Иногда вы проверили ВСЁ - нигде ничего нет. Смените редактор. Посмотрите свой файл в другой программе. К примеру, Windows Блокнот при использовании кодировки Unicode добавляет в начало вашего файла служебный символ Byte Order Mark, никак при этом не ставя вас в известность. Откройте скрипт в другом редакторе и удалите посторонние символы. И смените Блокнот на другой редактор.
Или сохраняйте в кодировке UTF-8 without BOM

>>231299
Держи этот легендарный код. Смотреть в UTF-8
http://rgho.st/6tPKdFzSJ
З.Ы. как включить такую же хуйню как у тебя в нотпаде?
1054 1231762
Во что тред превратился... с кодировкой совладать не в силах. Блокнотом пользоваться не умеют. Какой стыд, в соседнем треде обзмеятся.
1055 1231811
>>231762
пацаны засмеют...
1056 1231816
Судя по сообщениям выше, мне вряд ли помогут, но я не понимаю, что у меня не так, поэтому всё равно спрошу. У меня всё правильно же, почему выдаёт ошибку?
1057 1231819
>>231762
ОП в отпуске, ну или ему надоело обучать анонов и он ушел в закат.
1058 1231822
>>231811

> пацаны засмеют...


змееводцы же, питуны ебаные, со своими блядскими пробелами
1059 1231823
>>231816
вместо кучи скринов мог бы просто код скинуть
1060 1231825
>>231823

> просто код скинуть


P A S T E B I N
A
S
T
E
B
I
N
1061 1231844
>>231823
Я скинул несколько изображений, чтобы показать, что у меня всё вроде правильно, да и никакой код не нужен:
function $a() {}
1062 1231845
>>231844
Вот это я пишу, а мне уже ошибку выдаёт
1063 1231848
>>231844
function a() {}
1064 1231854
>>231845
<?php

function myFunction ($t) { echo $t };

?>

Сохрани у себя на компе и выполни. Если будет ошибка, то значит у тебя с настройками ide/веб-сервера/php проблемы.
1065 1231859
>>231816
>>231854
Ошибка в этом месте ушла после проишествия некоторого времени и перезапуска браузера. Но вот в коде всё равно где-то ошибка, и ideone не показывает, где.
https://pastebin.com/1ncQTnHq
Php.Усоверш.кода Прошу совета 1066 1231861
Добрый день.Как действия в этом фрагменте можно подать в цикл?
$word1 = array('Чудесных', 'Суровых', 'Занятных', 'Внезапных');
$word2 = array('слов', 'зим', 'глаз', 'дней', 'лет', 'мир', 'взор');
$word3 = array('прикосновений', 'поползновений', 'судьбы явлений',
'сухие листья', 'морщины смерти', 'долины края', 'замены нету',
'сухая юность', 'навек исчезнув');

$rand_keys = array_rand($word1);
$letter1 = $word1[$rand_keys];

$rand_keys2 = array_rand($word2);
$letter2 = $word2[$rand_keys2];

$op1 = $letter1 . " " . $letter2;
echo "{$op1}\n";
1067 1231868
>>231859
Я не оп. Зачем ты сделал 2 функции? Можно просто ноль посылать для банка, где нет комиссии ежемесячной, а вместо 39999 посылать 39999+7000.
1068 1231871
>>231859
И оп везде пишет, что надо вначале писать error_reporting(-1); чтобы ошибки показывало, а вообще попробуй на другом сайте, мне помогало
1069 1231884
>>231859
Вместо того говна, что ты наворотил с if-break, нужно использовать while. В montlyPayment проебана H.
1070 1231900
>>231884
В том уроке ещё вайл оп не давал
gothic-1-3.jpg118 Кб, 1024x768
1071 1231907
>>231861
Я подумал и ... вот такой вариант. Не уверен что это лучше, но зато цикл.
https://pastebin.com/sMwtKy1A
1072 1231909
>>231861
https://ideone.com/c0fRxG

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

Надеюсь у тебя все получится, няша :*
GOTHIC2009-08-0618-54-40-11.jpg77 Кб, 1024x819
1073 1231920
>>231909
Parse error: parse error in C:\Web\Apache2.2\htdocs\2.php on line 7

Какая версия PHP?
1074 1231921
>>231920
На ideone 7.1.0
GOTHIC2009-08-0317-47-34-49.jpg34 Кб, 640x512
1075 1231930
>>231921
Заебись сервис. Сохранил.
1076 1231949
>>231930
Ну как, разобрался с решением?
2-1-lester2.jpg266 Кб, 768x576
1077 1231951
e.JPG35 Кб, 475x361
1078 1231960
>>231762

>превратился



Как бэ всегда был таким. Хотя печаль конеш.

>>231749

Работает, если добавить php к <?. Я даже и не заметил у тебя первый раз.

Пошукай в панельке верху, там кнопка есть "показать се символы".
1079 1232109
Задача YodaSpeak.
https://ideone.com/CebyT2
Оно работает, честно, только записано не так, как хотел ОП, наверное. Извините, если эта хуйня нечитаема вообще.
https://github.com/moabit/filehosting 1080 1232162
>>217998

О, даже тесты есть. А почему phpunit.xml добавлен в gitignore? Предполагается, что каждый сделает свою версию конфига? Также, информацию про запуск тестов стоит дописать в README.

Также, ты можешь подключить стороннюю систему CI (continuous integration - непрерывной интеграции), чтобы она автоматически прогоняла тесты при изменениях в твоем репозитории. Вот например, тут у нас подключен Travis CI и он автоматически проверяет новые коммиты и пулл-реквесты: https://github.com/richBlueElephant/phpClub . Настройки задаются в файле .travis.yml

Вот как выглядит лог прогона тестов: https://travis-ci.org/richBlueElephant/phpClub

Разумеется, кроме Travis, есть куча других сервисов, многие из которых бесплатны для open source проектов: https://github.com/ligurio/awesome-ci

Требования к PHP и расширениям стоит прописать в composer.json: https://getcomposer.org/doc/01-basic-usage.md#platform-packages

В SQL дампе у тебя прописано имя БД (filehosting). Это неудобно, так как не позволяет загрузить дамп в БД с другими именем.

В дампе для колонки parent_id надо прописать внешний ключ. Также, для некоторых неочевидных полей вроде info или matpath стоит добавить комментарии. Также, стоит называть поля в едином стиле. У тебя где-то слова разделены подчеркиванием, а где-то пишутся слитно.

К сожалению, параметры из конфига для соединения с БД продублированы в sphinx.conf. Можно попробовать объединить их за счет использования scripted config, хотя это может привести и к усложнению конфига: http://sphinxsearch.com/blog/2013/11/05/sphinx-configuration-features-and-tricks/ - если станет сложно, то лучше оставить как есть.

В конфиге config.example.json на мой взгляд, слишком много параметров. Например, вместо displayErrorDetails можно было использовать настройку display_errors в php.ini. Параметры charset и collation - не очень понятен их смысл, кому и зачем понадобится их менять. И будет ли код корректно работать в этом случае. То же самое касается prefix - эта опция нужна была когда-то на дешевых хостингах, которые давали только одну базу данных и это уже давно неактуально.

> https://github.com/moabit/filehosting/blob/master/public/index.php


> require '../vendor/autoload.php';



Лучше указывать полный путь с использованием __DIR__, иначе PHP начнет искать файл сначала в include_path, а там вполне может что-то найтись (порядок поиска описан в документации).

> $app->get('/delete/file/{id}'


GET-запросы не должны менять ничего на сервере. Для удаления файла надо использовать POST.

> https://github.com/moabit/filehosting/blob/master/app/container.php


> \Slim\Csrf\Guard('csrf', $storage = null, null, 200, 16, true);



Зачем писать $storage = ... ? Это ведь не влияет ни на что и не указывает, что null соответствует аргументу функции storage.

https://github.com/moabit/filehosting/blob/master/app/container.php
Тут почему-то некоторые сервисы начинаются с маленькой буквы, а некоторые с большой. Лучше сделать единообразие в названиях.

https://github.com/moabit/filehosting/blob/master/app/Controllers/Controller.php

> @param Request $request


Этот комментарий не дает никакой новой информации (тип указан в определении функции) и потому, как мне кажется, его лучше не писать. Если ты хочешь прокомментировать параметр - то да, а так - не нужно. Иначе при правке кода придется тип менять в 2 местах.

Вместо ручного вызова DB::beginTransaction, DB::commit в Eloquent есть более просто метод: https://laravel.com/docs/5.6/database#database-transactions

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

> $response = $response->withRedirect('file/' . $model->id);


По моему опыту, удобнее генерировать URL страниц централизованно в специальном классе UrlGenerator:

$this->urlGen->getFileUrl($fileModel)

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

> //void


В PHP7.1 для функции можно явно указать тип void

> private function generatePathToStorage($uploadDate = null): string


> if ($uploadDate) {


> $uploadDate = new \DateTime ($uploadDate);


...

> } else {


> $uploadDate = new \DateTime ('now');



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

Также, по моему опыту, в БД удобнее хранить более подробный путь (не только имя, а имя + дату, вида '2018-01-01/file.txt'). Так как позже схема хранения файлов может поменяться, и тебе придется как-то отличать файлы, сохраненные по старой схеме, от новых. Если хранить путь с папками, то проблемы нет.

> https://github.com/moabit/filehosting/blob/master/app/Models/Comment.php


> protected function makeRoot()


Этой функции нужен непустой file_id, но это не проверяется.

> private function getExplodedMatpath(string $matpath): array


Здесь кроме разделения по точкам надо преобразовать строки вроде '001' в число 1.

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

Блокировка правда имеет недостаток, что чтение комментариев тоже заблокируется. Такая блокировка заранее называется пессимистичной ( https://ru.wikipedia.org/wiki/Блокировка_(СУБД) ). Можно обойтись без блокировки, отлавливая ошибку уникальности при вставке записи и при ее наличии генерировать путь повторно с N попыток.

В любом случае, хотелось бы, чтобы разработчик понимал такие вещи и заранее о них думал.

> https://github.com/moabit/filehosting/blob/master/app/Controllers/DownloadController.php


> $file->size = round($file->size / (1024 * 1024), 2);


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

> 'commentsAllowed' => $file->countRootComments() < 998 ? true : false,


Плохо, что ограничение числа комментариев прописано где-то в контроллере, а не в модели или сервисе. Ведь тебе придется продублировать эту проверку в методе добавления комментариев.

> public function forceFileDownload(Request $request, Response $response, array $args = []): Response


> ->withHeader('Content-Disposition', 'attachment;filename="' . $file->original_name . '"')


Это не будет работать, так как по стандарту в заголовках разрешены только имена в ASCII (латиннице), и кодировка для представления других символов не определена, в итоге разные браузеры могут их игнорировать или интепретировать по-своему. Я по моему писал про это в комемнтариях к задаче: https://gist.github.com/codedokode/9424217#Реализация-скачивания-файла-с-нужным-именем

> public function deleteFile


> unlink($filePath);


> File::destroy($file->id);



Это неправильный порядок, так как есть риск, что файл будет удален с диска, но останется в БД. Удаление файла лучше делать после подтверждения транзакции, чтобы ни в какой ситуации в БД не было записей, для которых нет файла на диске.

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

> if ($request->isXhr()) {


Я бы советовал использовать явный параметр вроде format=json вместо того, чтобы полагаться на нестандартный заголовок от jQuery.

Также, при отправке запроса не через аякс, и ошибочном заполнении формы, ошибка никак не выводится?

https://github.com/moabit/filehosting/blob/master/app/Middlewares/UploaderAuthMiddleware.php
Тут перед классом очень не хватает комментария, что это, и как им пользовться.

> https://github.com/moabit/filehosting/blob/master/app/Helpers/SphinxSearch.php


> return $this->toArray($search);



Стоит почитать мануал по Eloquent, и найти там метод pluck() для извлечения столбца: https://laravel.com/docs/5.6/queries#retrieving-results

Также, пр ипоиске в сфинксе сортировка по id будет выдавать самые старые файлы сначала. Возможно,стоит использовать сортировку по WEIGHT(), который по моему показывает релевантность результата запросу.
https://github.com/moabit/filehosting 1080 1232162
>>217998

О, даже тесты есть. А почему phpunit.xml добавлен в gitignore? Предполагается, что каждый сделает свою версию конфига? Также, информацию про запуск тестов стоит дописать в README.

Также, ты можешь подключить стороннюю систему CI (continuous integration - непрерывной интеграции), чтобы она автоматически прогоняла тесты при изменениях в твоем репозитории. Вот например, тут у нас подключен Travis CI и он автоматически проверяет новые коммиты и пулл-реквесты: https://github.com/richBlueElephant/phpClub . Настройки задаются в файле .travis.yml

Вот как выглядит лог прогона тестов: https://travis-ci.org/richBlueElephant/phpClub

Разумеется, кроме Travis, есть куча других сервисов, многие из которых бесплатны для open source проектов: https://github.com/ligurio/awesome-ci

Требования к PHP и расширениям стоит прописать в composer.json: https://getcomposer.org/doc/01-basic-usage.md#platform-packages

В SQL дампе у тебя прописано имя БД (filehosting). Это неудобно, так как не позволяет загрузить дамп в БД с другими именем.

В дампе для колонки parent_id надо прописать внешний ключ. Также, для некоторых неочевидных полей вроде info или matpath стоит добавить комментарии. Также, стоит называть поля в едином стиле. У тебя где-то слова разделены подчеркиванием, а где-то пишутся слитно.

К сожалению, параметры из конфига для соединения с БД продублированы в sphinx.conf. Можно попробовать объединить их за счет использования scripted config, хотя это может привести и к усложнению конфига: http://sphinxsearch.com/blog/2013/11/05/sphinx-configuration-features-and-tricks/ - если станет сложно, то лучше оставить как есть.

В конфиге config.example.json на мой взгляд, слишком много параметров. Например, вместо displayErrorDetails можно было использовать настройку display_errors в php.ini. Параметры charset и collation - не очень понятен их смысл, кому и зачем понадобится их менять. И будет ли код корректно работать в этом случае. То же самое касается prefix - эта опция нужна была когда-то на дешевых хостингах, которые давали только одну базу данных и это уже давно неактуально.

> https://github.com/moabit/filehosting/blob/master/public/index.php


> require '../vendor/autoload.php';



Лучше указывать полный путь с использованием __DIR__, иначе PHP начнет искать файл сначала в include_path, а там вполне может что-то найтись (порядок поиска описан в документации).

> $app->get('/delete/file/{id}'


GET-запросы не должны менять ничего на сервере. Для удаления файла надо использовать POST.

> https://github.com/moabit/filehosting/blob/master/app/container.php


> \Slim\Csrf\Guard('csrf', $storage = null, null, 200, 16, true);



Зачем писать $storage = ... ? Это ведь не влияет ни на что и не указывает, что null соответствует аргументу функции storage.

https://github.com/moabit/filehosting/blob/master/app/container.php
Тут почему-то некоторые сервисы начинаются с маленькой буквы, а некоторые с большой. Лучше сделать единообразие в названиях.

https://github.com/moabit/filehosting/blob/master/app/Controllers/Controller.php

> @param Request $request


Этот комментарий не дает никакой новой информации (тип указан в определении функции) и потому, как мне кажется, его лучше не писать. Если ты хочешь прокомментировать параметр - то да, а так - не нужно. Иначе при правке кода придется тип менять в 2 местах.

Вместо ручного вызова DB::beginTransaction, DB::commit в Eloquent есть более просто метод: https://laravel.com/docs/5.6/database#database-transactions

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

> $response = $response->withRedirect('file/' . $model->id);


По моему опыту, удобнее генерировать URL страниц централизованно в специальном классе UrlGenerator:

$this->urlGen->getFileUrl($fileModel)

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

> //void


В PHP7.1 для функции можно явно указать тип void

> private function generatePathToStorage($uploadDate = null): string


> if ($uploadDate) {


> $uploadDate = new \DateTime ($uploadDate);


...

> } else {


> $uploadDate = new \DateTime ('now');



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

Также, по моему опыту, в БД удобнее хранить более подробный путь (не только имя, а имя + дату, вида '2018-01-01/file.txt'). Так как позже схема хранения файлов может поменяться, и тебе придется как-то отличать файлы, сохраненные по старой схеме, от новых. Если хранить путь с папками, то проблемы нет.

> https://github.com/moabit/filehosting/blob/master/app/Models/Comment.php


> protected function makeRoot()


Этой функции нужен непустой file_id, но это не проверяется.

> private function getExplodedMatpath(string $matpath): array


Здесь кроме разделения по точкам надо преобразовать строки вроде '001' в число 1.

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

Блокировка правда имеет недостаток, что чтение комментариев тоже заблокируется. Такая блокировка заранее называется пессимистичной ( https://ru.wikipedia.org/wiki/Блокировка_(СУБД) ). Можно обойтись без блокировки, отлавливая ошибку уникальности при вставке записи и при ее наличии генерировать путь повторно с N попыток.

В любом случае, хотелось бы, чтобы разработчик понимал такие вещи и заранее о них думал.

> https://github.com/moabit/filehosting/blob/master/app/Controllers/DownloadController.php


> $file->size = round($file->size / (1024 * 1024), 2);


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

> 'commentsAllowed' => $file->countRootComments() < 998 ? true : false,


Плохо, что ограничение числа комментариев прописано где-то в контроллере, а не в модели или сервисе. Ведь тебе придется продублировать эту проверку в методе добавления комментариев.

> public function forceFileDownload(Request $request, Response $response, array $args = []): Response


> ->withHeader('Content-Disposition', 'attachment;filename="' . $file->original_name . '"')


Это не будет работать, так как по стандарту в заголовках разрешены только имена в ASCII (латиннице), и кодировка для представления других символов не определена, в итоге разные браузеры могут их игнорировать или интепретировать по-своему. Я по моему писал про это в комемнтариях к задаче: https://gist.github.com/codedokode/9424217#Реализация-скачивания-файла-с-нужным-именем

> public function deleteFile


> unlink($filePath);


> File::destroy($file->id);



Это неправильный порядок, так как есть риск, что файл будет удален с диска, но останется в БД. Удаление файла лучше делать после подтверждения транзакции, чтобы ни в какой ситуации в БД не было записей, для которых нет файла на диске.

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

> if ($request->isXhr()) {


Я бы советовал использовать явный параметр вроде format=json вместо того, чтобы полагаться на нестандартный заголовок от jQuery.

Также, при отправке запроса не через аякс, и ошибочном заполнении формы, ошибка никак не выводится?

https://github.com/moabit/filehosting/blob/master/app/Middlewares/UploaderAuthMiddleware.php
Тут перед классом очень не хватает комментария, что это, и как им пользовться.

> https://github.com/moabit/filehosting/blob/master/app/Helpers/SphinxSearch.php


> return $this->toArray($search);



Стоит почитать мануал по Eloquent, и найти там метод pluck() для извлечения столбца: https://laravel.com/docs/5.6/queries#retrieving-results

Также, пр ипоиске в сфинксе сортировка по id будет выдавать самые старые файлы сначала. Возможно,стоит использовать сортировку по WEIGHT(), который по моему показывает релевантность результата запросу.
https://github.com/moabit/filehosting 1081 1232163
>>217998

> public function countSearchResults(string $match): int


> $count = json_decode(json_encode($count), True);


очень непонятная конструкция, без которой тут точно можно обойтись.

Также, Сфинкс умеет после поиска возвращать общее число результатов (SHOW META: http://sphinxsearch.com/docs/current/sphinxql-show-meta.html ). Имеет смысл сделать функцию, которая будет за один вызов возвращать и результат, и общее число результатов.

> https://github.com/moabit/filehosting/blob/master/app/Helpers/Util.php


> public static function generateToken($length = 16): string


Тут можно добавить тайп хинт перед $length

> https://github.com/moabit/filehosting/blob/master/app/Auth/UploaderAuth.php


> $id = intval($request->getAttribute('routeInfo')[2]['id']);


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

Ну и этот класс тоже стоило прокомментировать.

При добавлении комментария стоит проверять, что родительский коммент относится к тому же файлу (было бы здорово сделать эту проверку на уровне БД, но не уверен, что это возможно).

> https://github.com/moabit/filehosting/blob/master/tests/FileSystemTest.php


> public function testGetAbsolutePathToFile()



Этот тест слишком завязан на знание об алгоритме генерации имен файлов. Стоит хоть чуть-чуть поменять код и тест перестанет работать. Он хрупкий. Плюс, он полагается на знание того, какие поля используются для генерации имени (ты не заполняешь все поля объекта File, так как знаешь, что они не нужны).

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

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

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

Также, этот тест требует наличия файла с определенным именем на диске, но я не вижу где код, создающий этот файл и не вижу такого файла в репозитории.

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

- взять тестовый файл и вызвать метод его сохранения, в ответ тот вернет объект File
- получить для этого объекта File путь на диске
- проверить, что файл есть на диске

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

Это еще называется "модель черного ящика", мы не знаем, как код устроен внутри и тестируем его только через публичные API (публичные методы и поля).

https://github.com/moabit/filehosting/blob/master/tests/FileTest.php

> $file = new File (['media_type' => 'image/jpeg']);


> $this->assertTrue($file->isImage());


Здесь тоже тест построен на знании внутреннего устройства File, что он проверяет только поле media_type. Опять же, надежнее было бы загрузить картинку и текстовый файл, и проверить для них результат isImage().

Также, в названии тестов лучше указывать требование, которое они проверяют, testIsImage -> "проверить, что файл определяется как картинка" -> testImageIsDetected/testFileDetectedAsImage или как-то так. А не "проверить функцию X".

https://github.com/moabit/filehosting/blob/master/tests/UploaderAuthTest.php
Здесь та же проблема. Я бы сделал так:

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

> public static function generateSafeFilename(string $normalizedFilename)


> return preg_replace('/.(htaccess|php|html|phtml)$/', '.txt', $safeName);


Ты используешь здесь черный список (разрешено все, что не запрещено). Но гораздо безопаснее использовать белые списки (разрешено только то, что в списке). Так как ты всегда можешь не учесть какой-то еще тип файла.

Так-то сделано неплохо, но есть что доработать.
https://github.com/moabit/filehosting 1081 1232163
>>217998

> public function countSearchResults(string $match): int


> $count = json_decode(json_encode($count), True);


очень непонятная конструкция, без которой тут точно можно обойтись.

Также, Сфинкс умеет после поиска возвращать общее число результатов (SHOW META: http://sphinxsearch.com/docs/current/sphinxql-show-meta.html ). Имеет смысл сделать функцию, которая будет за один вызов возвращать и результат, и общее число результатов.

> https://github.com/moabit/filehosting/blob/master/app/Helpers/Util.php


> public static function generateToken($length = 16): string


Тут можно добавить тайп хинт перед $length

> https://github.com/moabit/filehosting/blob/master/app/Auth/UploaderAuth.php


> $id = intval($request->getAttribute('routeInfo')[2]['id']);


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

Ну и этот класс тоже стоило прокомментировать.

При добавлении комментария стоит проверять, что родительский коммент относится к тому же файлу (было бы здорово сделать эту проверку на уровне БД, но не уверен, что это возможно).

> https://github.com/moabit/filehosting/blob/master/tests/FileSystemTest.php


> public function testGetAbsolutePathToFile()



Этот тест слишком завязан на знание об алгоритме генерации имен файлов. Стоит хоть чуть-чуть поменять код и тест перестанет работать. Он хрупкий. Плюс, он полагается на знание того, какие поля используются для генерации имени (ты не заполняешь все поля объекта File, так как знаешь, что они не нужны).

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

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

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

Также, этот тест требует наличия файла с определенным именем на диске, но я не вижу где код, создающий этот файл и не вижу такого файла в репозитории.

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

- взять тестовый файл и вызвать метод его сохранения, в ответ тот вернет объект File
- получить для этого объекта File путь на диске
- проверить, что файл есть на диске

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

Это еще называется "модель черного ящика", мы не знаем, как код устроен внутри и тестируем его только через публичные API (публичные методы и поля).

https://github.com/moabit/filehosting/blob/master/tests/FileTest.php

> $file = new File (['media_type' => 'image/jpeg']);


> $this->assertTrue($file->isImage());


Здесь тоже тест построен на знании внутреннего устройства File, что он проверяет только поле media_type. Опять же, надежнее было бы загрузить картинку и текстовый файл, и проверить для них результат isImage().

Также, в названии тестов лучше указывать требование, которое они проверяют, testIsImage -> "проверить, что файл определяется как картинка" -> testImageIsDetected/testFileDetectedAsImage или как-то так. А не "проверить функцию X".

https://github.com/moabit/filehosting/blob/master/tests/UploaderAuthTest.php
Здесь та же проблема. Я бы сделал так:

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

> public static function generateSafeFilename(string $normalizedFilename)


> return preg_replace('/.(htaccess|php|html|phtml)$/', '.txt', $safeName);


Ты используешь здесь черный список (разрешено все, что не запрещено). Но гораздо безопаснее использовать белые списки (разрешено только то, что в списке). Так как ты всегда можешь не учесть какой-то еще тип файла.

Так-то сделано неплохо, но есть что доработать.
1082 1232204
>>232163

>> public function countSearchResults(string $match): int


>> $count = json_decode(json_encode($count), True);


>очень непонятная конструкция, без которой тут точно можно обойтись.



string $match - принимает только строку,

: int - выдать только целое число.

__мимо__
815-1079 1083 1232210
Скоро создадим новый тред, погодите еще немного.

>>232109

Многовато кода для этой задачи. Также, комментарий к функции и название не соответствует содержанию:

> Делает первую букву предложения заглавной


> function makeFirstletterUppercase($text) {


Это неправильно.

> $array = [];


Название переменной неудачное так как непонятно, для чего она.

> $sdrow


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

> $words = preg_split("/ /", $string);


> $sdrow = array_reverse($words);


> $fixedWords = implode(" ", $sdrow);


Тут не надо на каждый шаг заводить новую переменную, можно использовать одну и ту же.

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

В общем, алгоритм верный, но код надо сократить, и перегруппировать, чтобы не надо было 2 раза разбивать текст на предложения. Также, дать функциям и переменным правильные имена.

>>231907

> ($a['word'.$i]);



Это тяжело читать. Надо было использовать индекс 1 вместо word1, чтобы получилось $a[$i]. А еще лучше - не использовать for для перебора массива, а использовать foreach.

Переменную надо было назвать понятно, а не одной буквой.

Ну и программа генерирует всего 1 строку, а не весь стих.

>>231909

Лучше было использовать foreach, без всяких счетчиков.

>>231762

Люди не рождаются со знанием кодировок.
815-1079 1083 1232210
Скоро создадим новый тред, погодите еще немного.

>>232109

Многовато кода для этой задачи. Также, комментарий к функции и название не соответствует содержанию:

> Делает первую букву предложения заглавной


> function makeFirstletterUppercase($text) {


Это неправильно.

> $array = [];


Название переменной неудачное так как непонятно, для чего она.

> $sdrow


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

> $words = preg_split("/ /", $string);


> $sdrow = array_reverse($words);


> $fixedWords = implode(" ", $sdrow);


Тут не надо на каждый шаг заводить новую переменную, можно использовать одну и ту же.

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

В общем, алгоритм верный, но код надо сократить, и перегруппировать, чтобы не надо было 2 раза разбивать текст на предложения. Также, дать функциям и переменным правильные имена.

>>231907

> ($a['word'.$i]);



Это тяжело читать. Надо было использовать индекс 1 вместо word1, чтобы получилось $a[$i]. А еще лучше - не использовать for для перебора массива, а использовать foreach.

Переменную надо было назвать понятно, а не одной буквой.

Ну и программа генерирует всего 1 строку, а не весь стих.

>>231909

Лучше было использовать foreach, без всяких счетчиков.

>>231762

Люди не рождаются со знанием кодировок.
1084 1232212
>>232204

Преобразовать строку в число можно без json_decode , есть функции вроде intval, floatval.
1085 1232213
>>231816

Это может быть какой-то баг ideone или просто маркер ошибки не исчез после ее исправления. Без кода не сказать.

>>231749

Вообще, проверить наличие BOM можно с помощью hex-редактора, который показывает содержимое файла побайтно: https://ru.wikipedia.org/wiki/Hex-редактор

В случае наличия BOM файл будет начинаться с 3 байт EF BB BF (отсюда https://ru.wikipedia.org/wiki/Маркер_последовательности_байтов )

В случае отсутствия BOM там будет код символа < то есть 3C.

Ну или можно попробовать включить в редакторе подсветку спецсимволов, но я не знаю, подсвечивают ли они BOM.

Также, есть онлайн-hex-редакторы, работающие в браузере, например https://hexed.it/

Может, кто-нибудь из анонов может сделать простую, как главная гугла, веб-страницу на github pages для проверки файла на BOM на JS? С объяснением что это, описанием бага cannot send headers и ссылкой на википедию. У меня времени нет.

>>230889

Нужно сохранять файл в utf-8 без BOM. Также, надо задавать кодировку либо HTML-тегом meta charset, либо заголовком Content-Type. Тогда все будет работать.

>>231352

Мой совет был про то, как проверить заголовки с сервера.
1086 1232214
>>231351

Не думаю, что дело в дистрибутиве Апача. Нгинкс только сложнее в настройке.

>>231296

Слишком сложная регулярка. Код пишется для людей, и легко ли им будет ее читать?

> [-]﹡[(]﹡ ﹡[)]﹡


Это можно переписать как [\-()\s]﹡ . Также, эту штуку можно вынести за скобки, чтобы не повторять перед 8 и перед +7.

[0-9] можно еще записать как \d, хотя она будет искать цифры любых письменностей, а не только арабские.

>>231163

То, что у тебя, похоже на CSV-файл, а для его чтения в PHP есть функция fgetcsv().

Массив line стоит разобрать на переменные:

list($state, $codeStr) = explode(...);

или, начиная с php 7.1, это делается короче:

[$state, $codeStr] = explode(...);

$codeStr - это строка, и ее надо еще раз разбить на массив кодов с помощью explode. А не делать по ней цикл foreach.

>>230825

Ну я далеко не первый год работаю, да и до того, как начал работать, интересовался программированием. Очень много всего перечитал в свое время. Да и сейчас, почитываю статьи на hacker news и изредка на хабре.

Ну и я работаю с относительно свободным графиком.

Читай статьи, не бойся заглядывать в исходники библиотек, Симфони ту же покопай. Это конечно стоило делать во время учебы. А так - можешь в автобусе читать статьи на смартфоне например.
1086 1232214
>>231351

Не думаю, что дело в дистрибутиве Апача. Нгинкс только сложнее в настройке.

>>231296

Слишком сложная регулярка. Код пишется для людей, и легко ли им будет ее читать?

> [-]﹡[(]﹡ ﹡[)]﹡


Это можно переписать как [\-()\s]﹡ . Также, эту штуку можно вынести за скобки, чтобы не повторять перед 8 и перед +7.

[0-9] можно еще записать как \d, хотя она будет искать цифры любых письменностей, а не только арабские.

>>231163

То, что у тебя, похоже на CSV-файл, а для его чтения в PHP есть функция fgetcsv().

Массив line стоит разобрать на переменные:

list($state, $codeStr) = explode(...);

или, начиная с php 7.1, это делается короче:

[$state, $codeStr] = explode(...);

$codeStr - это строка, и ее надо еще раз разбить на массив кодов с помощью explode. А не делать по ней цикл foreach.

>>230825

Ну я далеко не первый год работаю, да и до того, как начал работать, интересовался программированием. Очень много всего перечитал в свое время. Да и сейчас, почитываю статьи на hacker news и изредка на хабре.

Ну и я работаю с относительно свободным графиком.

Читай статьи, не бойся заглядывать в исходники библиотек, Симфони ту же покопай. Это конечно стоило делать во время учебы. А так - можешь в автобусе читать статьи на смартфоне например.
1087 1232215
>>230877

Зависит от ситуации. Если ты массово создаешь заказы, то может выгоднее передавать просто id, но в общем случае вариант с передачей сущностей защищает от кучи ошибок (например от перепутанных местами id товара и пользователя).

Также, дополнительную защиту дадут внешние ключи в БД. Обязательно настрой их.

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

>>230711

Применяются часто. Плюс, я например в редакторе кода делаю поиск по файлам регулярками.

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

>>230582

> При добавление в БД каких-то значений, кнопка обновить повторяет последний запрос


Надо использовать паттерн Post/Redirect/Get, почитай в моем уроке про работу с формами: https://github.com/codedokode/pasta/blob/master/forms.md

> А это в свою очередь требует для исключения ошибки "Warning: Cannot modify header information - headers already sent by" включение в php.ini буферизации


Надо использовать utf-8 без BOM.

>>230524

Написать в поддержку, чтобы они поставили расширение mbstring, но мои и других анонов обращения пока ничего не дали.
1088 1232216
>>230313

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

Это дает возможность вызывать тот же код и из других мест, а также упрощает тестирование сервисов.

15 строк это мало, но какого-то определенного предела нет. В реальной разработке бывает и под 100 строк, причем даже приходится часть кода в дополнительные методы контроллера выносить.

Если мы будем только считать строки и не смотреть на логику, то люди просто переносят код из контроллера в отдельный метод где-нибудь и остается тот же самый толстый контроллер, только в другом месте:

$vars = SomeClass::processRequest($request);
return $this->renderTemplate('template.twig', $vars);

>>230018

Функция inclineWord сделана не очень удачно - она умеет склонять только слово "рубль", но не другие слова, например, "миллион".

Также, она некорректно работает для числа 12.

В smallNumberToText логика довольно простая:

- если в числе есть сотни, добавляем слово для сотен
- если оно кончается на 11-19, добавляем слово для них
- иначе добавляем десятки и единицы

Учти, что для женского рода число меняется (один или одна, два или две).

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

> как заставить складывать строчки при постплении чисел, например 219(двести + девятнадцать)


Проще всего сделать массив, в него добавлять слова, а в конце функции склеить их в одну строку.

>>229992

Я бы не сказал, что редко, скорее наоборот.
1088 1232216
>>230313

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

Это дает возможность вызывать тот же код и из других мест, а также упрощает тестирование сервисов.

15 строк это мало, но какого-то определенного предела нет. В реальной разработке бывает и под 100 строк, причем даже приходится часть кода в дополнительные методы контроллера выносить.

Если мы будем только считать строки и не смотреть на логику, то люди просто переносят код из контроллера в отдельный метод где-нибудь и остается тот же самый толстый контроллер, только в другом месте:

$vars = SomeClass::processRequest($request);
return $this->renderTemplate('template.twig', $vars);

>>230018

Функция inclineWord сделана не очень удачно - она умеет склонять только слово "рубль", но не другие слова, например, "миллион".

Также, она некорректно работает для числа 12.

В smallNumberToText логика довольно простая:

- если в числе есть сотни, добавляем слово для сотен
- если оно кончается на 11-19, добавляем слово для них
- иначе добавляем десятки и единицы

Учти, что для женского рода число меняется (один или одна, два или две).

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

> как заставить складывать строчки при постплении чисел, например 219(двести + девятнадцать)


Проще всего сделать массив, в него добавлять слова, а в конце функции склеить их в одну строку.

>>229992

Я бы не сказал, что редко, скорее наоборот.
1089 1232217
>>229868

Распарсить ее в объект с помощью \DateTime::createFromFormat и отформатировать с помощью $date->format(). Также, если не хочешь использовать DateTime, есть аналоги в виде функций.

В БД нужен формат '2018-01-20 12:00:00'.

Не забудь про часовые пояса. DateTime их поддерживает.

Может, тебе поможет этот урок, а может и нет: https://github.com/codedokode/pasta/blob/master/php/datetime.md

>>229770

Не, это неудачный способ, так как в нем нельзя просто поменять число слогов с 4 до 10 например. Если ты используешь несколько переменных для хранения однотипных значений, то скорее всего тебе нужен массив. И вместо $a, $b, $c ... надо писать $parts[0], $parts[1], $parts[2]...

И соответственно вместо if ($i == 1) можно будет писать $parts[$i] = .. или $parts[] = ....

>>229006

Посмотри для начала вакансии на hh.ru и потом уже можешь уточнить тут, что имеется в виду под тем или иным требованием.

>>228434

Гуглить пробовал? Если не помогает, остается только взять исходники нгинкса и поискать это сообщение в них. Но notice не обязательно значит ошибку.
1090 1232218
>>229593

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

>>229591

Кстати, SQL был опубликован в 1986 году и он постарше некоторых разработчиков.

Тут давно один анон написал хорошую мысль: SQL удобен для ручной отправки запросов, на монге ты это так же легко не сделаешь. Но сохранять данные в БД программно из объектов удобнее в докуименто-ориентированные хранилища.

>>229581

Деплой часто делается на shell-скриптах.

>>229360

Надо упрощать.

[\s] равносильно \s, зачем делать выбор из 1 варианта?
[\W] то же что и \W
[8] можно просто писать как 8

\W пропускает любые символы, и не очень подходит, я думаю.
1091 1232219
>>229118

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

>>228937

PHP тоже за неделю не выучить. То есть основы можно, но там ведь еще куча связанных вещей вроде ООП, библиотек, фреймворков, MVC и тд.

>>228468

> [+]{1,1}


Это равносильно просто [+], смысла писать {1,1} нету

> {0,1}


Это равносильно знаку ?

> [\s]


Равносильно \s

> [7]


То же что и просто 7

В общем, надо упрощать дальше.

>>227888

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

Если что-то непонятно по регуляркам - задал бы вопрос. Надо их понимать, а не переставлять местами скобки наугад. Также, есть мануал: http://php.net/manual/ru/pcre.pattern.php

> оно может пропустить номер типа : + 7-999-12-(((((23------56)))))7


Можно попробовать поставить ограничение на число символов между цифрами.
1091 1232219
>>229118

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

>>228937

PHP тоже за неделю не выучить. То есть основы можно, но там ведь еще куча связанных вещей вроде ООП, библиотек, фреймворков, MVC и тд.

>>228468

> [+]{1,1}


Это равносильно просто [+], смысла писать {1,1} нету

> {0,1}


Это равносильно знаку ?

> [\s]


Равносильно \s

> [7]


То же что и просто 7

В общем, надо упрощать дальше.

>>227888

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

Если что-то непонятно по регуляркам - задал бы вопрос. Надо их понимать, а не переставлять местами скобки наугад. Также, есть мануал: http://php.net/manual/ru/pcre.pattern.php

> оно может пропустить номер типа : + 7-999-12-(((((23------56)))))7


Можно попробовать поставить ограничение на число символов между цифрами.
1092 1232220
>>227550

$this используется только внутри методов и указвает на объект, на котором был вызван метод. Например:

$a->doSomething();

Здесь внутри метода doSomething() $this будет содержать указывать на тот же объект, что и $a. И ты можешь использовать его для доступа к свойствам ($this->x) или методам ($this->some()) объекта $a.

(правильно писать не "объект $a", а "объект, на который указывает $a", так как в PHP объекты не хранятся внутри переменных. Они хранятся в памяти, а переменные содержат лишь указатель на них. Не ссылку, так как ссылка это отдельный термин, потому я использовал слово "указатель").

>>226967

Редиректом, но вообще ты делаешь все как-то неправильно. Методы API надо вызывать либо с сервера с помощью HTTP клиента, либо из браузера аяксом. Соответственно, тебе надо освоить для начала что такое протокол HTTP. Потом разобраться, как делать HTTP запросы из скрипта или из браузера.

Быстро тут не объяснить.

Урок по HTTP https://github.com/codedokode/pasta/blob/master/network/http.md

>>226921

Точный алгоритм рисования рамки в такой ситуации видимо не документирован и браузеры рисуют ее как хотят. А может баг. Надо читать спецификацию CSS и проверять.

>>226508

Решение немного костыльное, так как оно дает балансу уйти в минус. Хорошо бы без этого. Просто не вычитать из долга больше, чем надо.
1093 1232221
>>226501

Квадратные скобки поддерживаются с php 5.4, у тебя он наверно очень старый.

>>226289

Для разработки удобен встроенный в PHP сервер.

>>225769

Вместо \W лучше перечислить допустимые символы, например: [+\-&^%$]

>>225219

Модификаторы доступа нужны для инкапсуляции. Она упрощает изучение кода и защищает от ошибок, паста:

---------

Инкапсуляция. У этого слова есть разные определения, в том числе такие что ничего не понять, потому объясню простыми словами.

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

Кроме нескольких публичных методов, остальные методы и свойства закрываются от доступа снаружи модификаторами private или protected. То есть с объектом снаружи ничего нельзя сделать, кроме вызова публичных методов.

Это упрощает понимание кода: тебе не надо читать и разбирать код класса, достаточно прочитать название публичных методов (и может быть комментарии к ним). Также, это упрощает изменение кода: если какое-то свойство имеет уровень private, то доступ к нему возможен только из того же класса и тебе не надо бегать по всему коду и смотреть что там с этим свойством делается, тебе достаточно просмотреть один файл с этим классом.

При инкапсуляции автор класса таким образом задает ограничения, что можно делать с объектом.

Как плюс, мы можем поставить какие-то проверки в методах, и запретить установку неправильных значений свойств. Таким образом, снаружи записать неправильное значение в объект будет нельзя и автор класса может гарантировать его корректную работу в любой ситуации. Если у нас есть публичные свойства, то в них можно записывать что угодно, а приватные свойства изменять снаружи нельзя, можно только вызвать методы, которые что-то делают.

Инкапсуляция это хорошо. Так как весь код, который занимается одной задачей, оказывается заключен внутри одного класса. Противоположный случай это когда код (или знание о его внутреннем устройстве) вылезает из класса и размазывается по всей программе.

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

Вот пример класса с использованием инкапсуляции:

// Объект представляет собой ломаную линию из нескольких сегментов
// Показаны только публичные методы, остальное скрыто
class PolyLine
{
public function __construct(float $x, float $y) { ... }

// Добавляет еще одну точку к ломаной
public function addPoint(float $x, float $y): void { ... }

// Посчитать общую длину линии
public function calculateLength(): float { ... }
...
}

В нем всего 3 публичных метода, включая конструктор, и мы видим, что с объектом можно сделать только три действия:

- создать ломаную, указав начальную точку
- добавить к ломаной еще одну точку
- посчитать длину ломаной

Вот пример использования этого класса:

$line = new PolyLine(1, 1);
$line->addPoint(2, 2);
$line->addPoint(4, 7);
echo $line->calculateLength();

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

(при желании можешь попробовать написать код класса целиком).

--------------

Я бы советовал тебе реализовать инкапсуляцию в коде, чтобы изучить ее и чтобы лучше увидеть разделение ответственности между классами в ООП. То есть сделай все поля приватными и закрой не нужные снаружи методы.

В классе Worker есть проблема: при наследовании от него надо указать базовые ставки в полях, но это не документировано и никак не проверяется. Лучше использовать не поля, а абстрактные методы вроде getBaseSalary() - тогда язык не позволит создать потомка, не реализовав эти методы.

else пишется как } else { в одну строчку со скобками.

> class Department{


> public $salary = 0;


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

> public $workersNumber = 0;


То же самое, лучше без этого свойства.

У тебя в департаменте не хватает метода найма работника вроде hireEmployee(Worker $w). Ты не даешь возможность добавлять работников по одному (это универсльный способ), а вместо этого предлагаешь ограниченный вариант создания работников всего 4 профессий по шаблону. А что, если завтра добавится пятая профессия? Придется код переделывать.

> if ($workerType[3] == 1) {


Неудачный код, так как непонятно, что за элемент с номером 3.

> array_push($title, $workerType[0]);


> array_push($title, $employee);


> array_push($this->workers, $title);


Это неудачное решение так как ты переусложнил код. Достаточно просто сделать массив объектов Worker, а ты зачем то вместо этого сделал массив из массивов. Причем их формат нигде не описан и в итоге чтобы понять, что в нем хранится, надо читать весь код. Почему люди должны тратить на это время? Код должен быть понятнее.

В частности, ты бы мог хранить количество работников прямо в объекте (тогда надо его переименовать в WorkerGroup). Или создавать нужное число объектов.

> public function getDepartmentCost()


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

Также, лучше было сделать 3 отдельных функции, так как непонятно в чем смысл функции, вычисляющей три несвяхзанных значения. Ты просто зачем-то склеил три разных, никак не связанных функции в одну.

> public function displayDepartmentsCosts($names)


Это надо вынести из компании. Тебе может понадобиться делать много разных отчетов, и если ты каждый будешь добавлять в класс Компании, то он превратится в монстра. У класса должна быть одна задача - например хранить информацию о компании, а не генерировать и выводить отчеты.

Также, непонятна логика, почему название департамента не хранится в самом департаменте, а отдельно.
1093 1232221
>>226501

Квадратные скобки поддерживаются с php 5.4, у тебя он наверно очень старый.

>>226289

Для разработки удобен встроенный в PHP сервер.

>>225769

Вместо \W лучше перечислить допустимые символы, например: [+\-&^%$]

>>225219

Модификаторы доступа нужны для инкапсуляции. Она упрощает изучение кода и защищает от ошибок, паста:

---------

Инкапсуляция. У этого слова есть разные определения, в том числе такие что ничего не понять, потому объясню простыми словами.

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

Кроме нескольких публичных методов, остальные методы и свойства закрываются от доступа снаружи модификаторами private или protected. То есть с объектом снаружи ничего нельзя сделать, кроме вызова публичных методов.

Это упрощает понимание кода: тебе не надо читать и разбирать код класса, достаточно прочитать название публичных методов (и может быть комментарии к ним). Также, это упрощает изменение кода: если какое-то свойство имеет уровень private, то доступ к нему возможен только из того же класса и тебе не надо бегать по всему коду и смотреть что там с этим свойством делается, тебе достаточно просмотреть один файл с этим классом.

При инкапсуляции автор класса таким образом задает ограничения, что можно делать с объектом.

Как плюс, мы можем поставить какие-то проверки в методах, и запретить установку неправильных значений свойств. Таким образом, снаружи записать неправильное значение в объект будет нельзя и автор класса может гарантировать его корректную работу в любой ситуации. Если у нас есть публичные свойства, то в них можно записывать что угодно, а приватные свойства изменять снаружи нельзя, можно только вызвать методы, которые что-то делают.

Инкапсуляция это хорошо. Так как весь код, который занимается одной задачей, оказывается заключен внутри одного класса. Противоположный случай это когда код (или знание о его внутреннем устройстве) вылезает из класса и размазывается по всей программе.

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

Вот пример класса с использованием инкапсуляции:

// Объект представляет собой ломаную линию из нескольких сегментов
// Показаны только публичные методы, остальное скрыто
class PolyLine
{
public function __construct(float $x, float $y) { ... }

// Добавляет еще одну точку к ломаной
public function addPoint(float $x, float $y): void { ... }

// Посчитать общую длину линии
public function calculateLength(): float { ... }
...
}

В нем всего 3 публичных метода, включая конструктор, и мы видим, что с объектом можно сделать только три действия:

- создать ломаную, указав начальную точку
- добавить к ломаной еще одну точку
- посчитать длину ломаной

Вот пример использования этого класса:

$line = new PolyLine(1, 1);
$line->addPoint(2, 2);
$line->addPoint(4, 7);
echo $line->calculateLength();

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

(при желании можешь попробовать написать код класса целиком).

--------------

Я бы советовал тебе реализовать инкапсуляцию в коде, чтобы изучить ее и чтобы лучше увидеть разделение ответственности между классами в ООП. То есть сделай все поля приватными и закрой не нужные снаружи методы.

В классе Worker есть проблема: при наследовании от него надо указать базовые ставки в полях, но это не документировано и никак не проверяется. Лучше использовать не поля, а абстрактные методы вроде getBaseSalary() - тогда язык не позволит создать потомка, не реализовав эти методы.

else пишется как } else { в одну строчку со скобками.

> class Department{


> public $salary = 0;


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

> public $workersNumber = 0;


То же самое, лучше без этого свойства.

У тебя в департаменте не хватает метода найма работника вроде hireEmployee(Worker $w). Ты не даешь возможность добавлять работников по одному (это универсльный способ), а вместо этого предлагаешь ограниченный вариант создания работников всего 4 профессий по шаблону. А что, если завтра добавится пятая профессия? Придется код переделывать.

> if ($workerType[3] == 1) {


Неудачный код, так как непонятно, что за элемент с номером 3.

> array_push($title, $workerType[0]);


> array_push($title, $employee);


> array_push($this->workers, $title);


Это неудачное решение так как ты переусложнил код. Достаточно просто сделать массив объектов Worker, а ты зачем то вместо этого сделал массив из массивов. Причем их формат нигде не описан и в итоге чтобы понять, что в нем хранится, надо читать весь код. Почему люди должны тратить на это время? Код должен быть понятнее.

В частности, ты бы мог хранить количество работников прямо в объекте (тогда надо его переименовать в WorkerGroup). Или создавать нужное число объектов.

> public function getDepartmentCost()


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

Также, лучше было сделать 3 отдельных функции, так как непонятно в чем смысл функции, вычисляющей три несвяхзанных значения. Ты просто зачем-то склеил три разных, никак не связанных функции в одну.

> public function displayDepartmentsCosts($names)


Это надо вынести из компании. Тебе может понадобиться делать много разных отчетов, и если ты каждый будешь добавлять в класс Компании, то он превратится в монстра. У класса должна быть одна задача - например хранить информацию о компании, а не генерировать и выводить отчеты.

Также, непонятна логика, почему название департамента не хранится в самом департаменте, а отдельно.
1094 1232225
>>232214
Она должна после плюса идти ещё, так что нельзя вынести. Слишком сложная вышла, потому что у тебя в примерах очень много разных случаев может быть, в архиве смотрел, много людей делали только для нескольких. Про звезды после всей скобки согласен, мой косяк. Спасибо за ответ.
18-6-collectweed5.jpg252 Кб, 768x576
1095 1232258
>>232210

>Ну и программа генерирует всего 1 строку, а не весь стих.


Я так понял. Можно сколько угодно строк генерировать еще одним циклом. Вот
https://pastebin.com/PxZkZRya

Кто ОП? Подписывайся если не трудно.
1096 1232576
Мудрые аноны, подскажите. Есть задача. Форма логина должна открываться ТОЛЬКО, когда в мы передаём в $_GET login=yes . В вёрстке запилил кнопку для открытия этого окна логина, всё в порядке, всё работает. НО встаёт следующая проблема. При неудачном логине введённые данные должны оставаться в полях, а форма открытой. Я нашёл выход в том, чтобы искусственно передать в $_GET необходимые значения, однако получил за это, мол, "НИКОГДА нельзя так делать, изменять и переопределять глобальные массивы - зло во плоти". Так как мне это реализовать?

Вот так это делаю я сейчас. После неверного ввода данных пользователь остаётся в форме логина и там в полях остаются его данные. Если в $_GET не передать значения, то после неверного ввода, пользователя выкинет из формы логина, снова жать кнопку чтобы её открыть и данные в полях не сохраняются.

if ($loginKeyCheck == $passwordKeyCheck) {
$success = 1;
} else {
$_GET = ['login' => 'yes'];
$wrongData = 1;
}

Извините, что сумбурно, мозг кипит уже. Помогите советом.
1097 1232579
>>231909
спасиба солнышко
1098 1232608
>>232576

Ты делаешь неправильно. $_GET предназначен только для хранения пришедших от пользователя данных. Это не хранилище для твоих переменных.

Тебе просто надо завести отдельную переменную $showLoginForm и использовать в коде ее вместо $_GET.

Тогда можно будет написать

else {
$showLoginFor = true
}

Также, у меня есть подозрение что ты можешь неправильно работаь с формами, потому даю ссылку на урок https://github.com/codedokode/pasta/blob/master/forms.md

Для отправки формы логина конечно надо использовать POST-запрос.
1099 1232610
>>232608
А ЛАРЧИК ПРОСТО ОТКРЫВАЛСЯ!
Бля, какой же я долбоёб. Спасибе, тебе, анон. Вот моя проверка, в целом. Это к слову о $_POST. Урок сейчас почитаю.
https://ideone.com/4rlb6D
594-827 1100 1232697
>>219227

Я в консоли просто набираю команду вроде tail -f /var/log/nginx.log и она сама следит за логом и выводит новые сообщения. Это самый простой способ.

Команда tail умеет также следить за несколькими логами сразу.

В случае PHP, надо включить в php.ini display_errors=1 если это не продакшен. На продакшене естественно, выводить ничего на экран нельзя.

>>219235

Ну у тебя там в коде есть элемент displayMessage, может текст сообщения в нем? Используй тогда регулярки.

>>219408

Наверно. Надо прочитать какой-нибудь урок по композеру сначала. Например, надо подключить autoload.php в своем коде.

>>219348

Это FastCGI-сервер и менеджер процессов PHP. Он принимает HTTP-запросы от веб-сервера через FastCGI и передает их на обработку рабочим процессам PHP. Применяется в сочетании с поддерживающим FastCGI сервером, например, nginx или Apache.

Если ты настраиваешь среду для разработки то, по моему, проще использовать встроенный в PHP веб-сервер, а не заморачиваться с nginx.

> Если я сделал apt get install php, этот fpm у меня уже есть, или надо ставить отдельно?


думаю, что отдельно. Ты бы мог посмотреть описание пакета php для начала: apt-cache show php, может там упомянуто.

>>219835

Atom это редактор кода, а не фреймворк. Для твоего проекта может подойти микрофреймворк Slim.
594-827 1100 1232697
>>219227

Я в консоли просто набираю команду вроде tail -f /var/log/nginx.log и она сама следит за логом и выводит новые сообщения. Это самый простой способ.

Команда tail умеет также следить за несколькими логами сразу.

В случае PHP, надо включить в php.ini display_errors=1 если это не продакшен. На продакшене естественно, выводить ничего на экран нельзя.

>>219235

Ну у тебя там в коде есть элемент displayMessage, может текст сообщения в нем? Используй тогда регулярки.

>>219408

Наверно. Надо прочитать какой-нибудь урок по композеру сначала. Например, надо подключить autoload.php в своем коде.

>>219348

Это FastCGI-сервер и менеджер процессов PHP. Он принимает HTTP-запросы от веб-сервера через FastCGI и передает их на обработку рабочим процессам PHP. Применяется в сочетании с поддерживающим FastCGI сервером, например, nginx или Apache.

Если ты настраиваешь среду для разработки то, по моему, проще использовать встроенный в PHP веб-сервер, а не заморачиваться с nginx.

> Если я сделал apt get install php, этот fpm у меня уже есть, или надо ставить отдельно?


думаю, что отдельно. Ты бы мог посмотреть описание пакета php для начала: apt-cache show php, может там упомянуто.

>>219835

Atom это редактор кода, а не фреймворк. Для твоего проекта может подойти микрофреймворк Slim.
1101 1232699
>>220010

Вводить --with-mysqli надо, если ты самостоятельно собираешь интерпретатор php из исходников.

Как ставить расширение, зависит от твоей ОС. Под виндой - многие расширения идут в комплекте и их надо просто включить в конфиге, а остальные скачиваешь и кладешь в папку расширений. Под линуксом обычно ставится через менеджер пакетов вроде apt-get.

>>220011

php-fpm скорее всего тут не при чем. Это лишь менеджер процессов для поддержки FastCGI.

>>220689

Вместо [+]|[-]|[]|[/] лучше писать [+\-/]

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

Лучше было бы разбить строку на один список элементов. Например, через preg_match('~[0-9]+|[+\-*/]|.~u'). Последняя точка ловит любой символ и позволяет обнаруживать ошибочные символы. И далее уже обходить полученный массив элементов.

> if (preg_match("/[.]/", $value)


Тут хватило бы mb_strpos.

Так, вроде работает верно, но я не могу понять, всегда ли она будет так работать. Что, если у нас будет выражение "8 8 8 8 + "?

>>220825

> файлы только пишутся но не читаются;


В чем смысл такого кеша? Я не понимаю из описания, что кешируется и куда.

> На случай утраты инфы из ram при старте один раз траверсить директорию на наличие файлов и их таймстемпы.


Это непрактично. Попробуй поработать с кешем на миллион файлов с большим количеством папок, и у тебя "траверсенье" может занять полчаса.

Практичнее сделать неумирающее приложение и держать список файлов в памяти. Если надо, дампить его на диск и при запуске читать дамп. Также, это лучше писать не на PHP, а на Го, так как тут критична производительность.

То, что у тебя, скорее всего будет работать плохо.

Альтернативный простой вариант - просто складывать файлы на диск и раз в сутки запускать штуку, которая обходит файлы, считает их объем и удаляет лишнее. Старайся использовать минимум подпапок, так как их обход при большом количестве будет знатно тормозить.

Надо помнить, что дисковый трафик не бесконечный. Возможно, что хранить файлы в памяти выгоднее. Мне кажется, для нгикса что-то такое было.

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

Также, у меня ощущение, что я слышал про что-то такое для нгинкса.
1101 1232699
>>220010

Вводить --with-mysqli надо, если ты самостоятельно собираешь интерпретатор php из исходников.

Как ставить расширение, зависит от твоей ОС. Под виндой - многие расширения идут в комплекте и их надо просто включить в конфиге, а остальные скачиваешь и кладешь в папку расширений. Под линуксом обычно ставится через менеджер пакетов вроде apt-get.

>>220011

php-fpm скорее всего тут не при чем. Это лишь менеджер процессов для поддержки FastCGI.

>>220689

Вместо [+]|[-]|[]|[/] лучше писать [+\-/]

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

Лучше было бы разбить строку на один список элементов. Например, через preg_match('~[0-9]+|[+\-*/]|.~u'). Последняя точка ловит любой символ и позволяет обнаруживать ошибочные символы. И далее уже обходить полученный массив элементов.

> if (preg_match("/[.]/", $value)


Тут хватило бы mb_strpos.

Так, вроде работает верно, но я не могу понять, всегда ли она будет так работать. Что, если у нас будет выражение "8 8 8 8 + "?

>>220825

> файлы только пишутся но не читаются;


В чем смысл такого кеша? Я не понимаю из описания, что кешируется и куда.

> На случай утраты инфы из ram при старте один раз траверсить директорию на наличие файлов и их таймстемпы.


Это непрактично. Попробуй поработать с кешем на миллион файлов с большим количеством папок, и у тебя "траверсенье" может занять полчаса.

Практичнее сделать неумирающее приложение и держать список файлов в памяти. Если надо, дампить его на диск и при запуске читать дамп. Также, это лучше писать не на PHP, а на Го, так как тут критична производительность.

То, что у тебя, скорее всего будет работать плохо.

Альтернативный простой вариант - просто складывать файлы на диск и раз в сутки запускать штуку, которая обходит файлы, считает их объем и удаляет лишнее. Старайся использовать минимум подпапок, так как их обход при большом количестве будет знатно тормозить.

Надо помнить, что дисковый трафик не бесконечный. Возможно, что хранить файлы в памяти выгоднее. Мне кажется, для нгикса что-то такое было.

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

Также, у меня ощущение, что я слышал про что-то такое для нгинкса.
1102 1232700
>>220977

Для дешифровки можно перевернуть массив с помощью array_flip и использовать strtr (чтобы он длинные последовательности заменял обратно на буквы).

>>221076

Лучше спросить разрешение у знакомого сначала.

>>221191

У тебя, когда долг становится меньше 5000, ты его заменяешь на ноль:

$credit-=$credit; (проще писать $credit = 0)

Но при этом ты не добавляешь уплаченную сумму в $vsegoPlata.

Ну и не называй переменные kuku, трудно понимать программу из-за этого.

>>221347

Так было лет 20 назад, когда использовался интерфейс CGI. Он подразумевал, что для обработки каждого запроса веб-сервер запускает новый процесс интерпретатора. Это довольно неэффективно.

Сейчас используется либо PHP как модуль Апача (mod_php), либо в составе php-fpm. Интерпретатор запускается один раз и выполняет за свой жизненный цикл много php-скриптов. При этом после завершения php-скрипта все его переменные, функции, классы очищаются и новый скрипт запускается в пустом окужении.

>>221953

Да, верно, PHP код каждый раз инициализируется с нуля. Это имеет свои плюсы: чтобы не делал скрипт, после завершения память будет очищена и это не помешают следующим скриптам.

Решается проблема инициализации за счет кеширования. Чтобы не тратить время на компиляцию подключаемых php-скриптов, используют кеш опкода (opcache). Фреймворки используют свои кеши, чтобы не разбирать сложные конфиги заново. Шаблонизаторы кешируют результат разбора шаблона. И так далее.

Получается не так и плохо, даже если приложение выдерживает всего 10-100 запросов в секунду, часто у него нет столько пользователей, чтобы создать такую нагрузку.

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

Например, для Симфони есть такое решение: https://gnugat.github.io/2016/04/13/super-speed-sf-react-php.html

Надо понимать, что какие-то библиотеки могут быть не рассчитаны на такой режим работы и их придедтся доделывать или искать обходные пути. Также, если библиотека лезет напрямую в $_GET, $_POST, то тебе придется самому заполнять эти массивы.

Есть статья на хабре https://habr.com/post/220393/

Надо понимать, что в этом случае ты можешь столкнуться с багами. Ну например, легко допустить где-то утечку памяти и приложение будет потреблять ее все больше, пока не заполнит всю память. Я читал, что в ноде и руби такое бывает и там люди просто по крону прибивают приложение раз в N часов, не в силах победить утечки. Инструментов для анализа выделения памяти там видимо нету.
1102 1232700
>>220977

Для дешифровки можно перевернуть массив с помощью array_flip и использовать strtr (чтобы он длинные последовательности заменял обратно на буквы).

>>221076

Лучше спросить разрешение у знакомого сначала.

>>221191

У тебя, когда долг становится меньше 5000, ты его заменяешь на ноль:

$credit-=$credit; (проще писать $credit = 0)

Но при этом ты не добавляешь уплаченную сумму в $vsegoPlata.

Ну и не называй переменные kuku, трудно понимать программу из-за этого.

>>221347

Так было лет 20 назад, когда использовался интерфейс CGI. Он подразумевал, что для обработки каждого запроса веб-сервер запускает новый процесс интерпретатора. Это довольно неэффективно.

Сейчас используется либо PHP как модуль Апача (mod_php), либо в составе php-fpm. Интерпретатор запускается один раз и выполняет за свой жизненный цикл много php-скриптов. При этом после завершения php-скрипта все его переменные, функции, классы очищаются и новый скрипт запускается в пустом окужении.

>>221953

Да, верно, PHP код каждый раз инициализируется с нуля. Это имеет свои плюсы: чтобы не делал скрипт, после завершения память будет очищена и это не помешают следующим скриптам.

Решается проблема инициализации за счет кеширования. Чтобы не тратить время на компиляцию подключаемых php-скриптов, используют кеш опкода (opcache). Фреймворки используют свои кеши, чтобы не разбирать сложные конфиги заново. Шаблонизаторы кешируют результат разбора шаблона. И так далее.

Получается не так и плохо, даже если приложение выдерживает всего 10-100 запросов в секунду, часто у него нет столько пользователей, чтобы создать такую нагрузку.

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

Например, для Симфони есть такое решение: https://gnugat.github.io/2016/04/13/super-speed-sf-react-php.html

Надо понимать, что какие-то библиотеки могут быть не рассчитаны на такой режим работы и их придедтся доделывать или искать обходные пути. Также, если библиотека лезет напрямую в $_GET, $_POST, то тебе придется самому заполнять эти массивы.

Есть статья на хабре https://habr.com/post/220393/

Надо понимать, что в этом случае ты можешь столкнуться с багами. Ну например, легко допустить где-то утечку памяти и приложение будет потреблять ее все больше, пока не заполнит всю память. Я читал, что в ноде и руби такое бывает и там люди просто по крону прибивают приложение раз в N часов, не в силах победить утечки. Инструментов для анализа выделения памяти там видимо нету.
1103 1232701
>>221775

strtoupper не работает с кириллицей в utf-8, используй mb_strtoupper. Урок https://github.com/codedokode/pasta/blob/master/php/strings-utf8.md

preg_replace тут не поможет. Тебе надо просто отрезать первую букву и использовать mb_strtoupper.

>>221826

CMS это система для создания и управления сайтом через графический интерфейс с минимумом программирования. В сети легко найти уроки по CMS вроде Друпал или Вордпресс.

> Тяжело ли писать поисковый движок для сайта самому, или уже есть готовые решения, или его не тяжело писать?



Зависит от уровня. Прикрутить к сайту sphinx - довольно рядовая задача.

> Стоит ли пользоваться фреймворками для верстки


Если тебе не нужна уникальная верстка, а подойдет такая же, как в фреймворке то он позволит экономить время.

>>221974
>>222664

Это плохая идея. construct лишь инициализирует объект, и не делает никаких специальных действий. да и это неудобно, так как нельзя создать объект без сохранения.

Вообще, тебе бы лучше подошел такой вариант:

$object = $service->createSomething(...);
$service->doSomething($object, ...); (или $object->doSomething()).

>>222167

"Сохранить состояние" значит просто записать данные куда-то: в файл, в базу данных, в редис итд.

> я в логах nginx не вижу входящего запроса от сервера


Ну тут может быть сотня причин, начиная с настроек и заканчивая правилами фаерфолла. Я бы перехватил трафик с помощью tcpdump и проверил что запрос от сервера приходит. И дальше действовал в зависимости от результата.

Ну например, если ты запускаешь код на домашнем компьютере, и твой провайдер использует NAT, то сервер естественно к тебе подсоединиться не сможет и отправить тебе запрос не сможет (мне-то это очевидно, но людям, которые не изучали сетевые технологии, может быть непонятно). И это лишь одна из сотни возможных причин.
1103 1232701
>>221775

strtoupper не работает с кириллицей в utf-8, используй mb_strtoupper. Урок https://github.com/codedokode/pasta/blob/master/php/strings-utf8.md

preg_replace тут не поможет. Тебе надо просто отрезать первую букву и использовать mb_strtoupper.

>>221826

CMS это система для создания и управления сайтом через графический интерфейс с минимумом программирования. В сети легко найти уроки по CMS вроде Друпал или Вордпресс.

> Тяжело ли писать поисковый движок для сайта самому, или уже есть готовые решения, или его не тяжело писать?



Зависит от уровня. Прикрутить к сайту sphinx - довольно рядовая задача.

> Стоит ли пользоваться фреймворками для верстки


Если тебе не нужна уникальная верстка, а подойдет такая же, как в фреймворке то он позволит экономить время.

>>221974
>>222664

Это плохая идея. construct лишь инициализирует объект, и не делает никаких специальных действий. да и это неудобно, так как нельзя создать объект без сохранения.

Вообще, тебе бы лучше подошел такой вариант:

$object = $service->createSomething(...);
$service->doSomething($object, ...); (или $object->doSomething()).

>>222167

"Сохранить состояние" значит просто записать данные куда-то: в файл, в базу данных, в редис итд.

> я в логах nginx не вижу входящего запроса от сервера


Ну тут может быть сотня причин, начиная с настроек и заканчивая правилами фаерфолла. Я бы перехватил трафик с помощью tcpdump и проверил что запрос от сервера приходит. И дальше действовал в зависимости от результата.

Ну например, если ты запускаешь код на домашнем компьютере, и твой провайдер использует NAT, то сервер естественно к тебе подсоединиться не сможет и отправить тебе запрос не сможет (мне-то это очевидно, но людям, которые не изучали сетевые технологии, может быть непонятно). И это лишь одна из сотни возможных причин.
1104 1232702
>>222800

Да. Почитай например http://denis.in.ua/foreign-keys-in-mysql.htm

>>223115

Ошибку какую-то пишет? Или что именно не так?

>>223286

> abstract class Employee


> public const TYPE_EMPLOYEES = ['manager' => '0',


Одно из условий задачи - возможность добавлять профессии с минимальным изменением старого кода. У тебя из-за этого массива это не сделать.

> int $boss


bool подойдет больше.

> $money = $this->data['money'];


А зачем тут массив непонятной структуры? Почему нельзя сделать $this->money? зачем усложнение?

> class Manager extends Employee


> protected $data = ['money' => '500',


Это плохое решение. У тебя 1) никак не документировано, что наследник должен поместить в поле массив 2) никак это не проверяется. Следовательно, легко сделать ошибку. Наконец, нет никакого смысла заталкивать никак не связанные числа в один массив. В такой ситуации лучше определеить в базовом классе абстрактные методы вроде getBaseSalary(), это решит обе вышеуказанные проблемы.

> public function createEmployee(int $prof, int $rank, int $boss, int $count) {


Та же проблема - это не дает возможности добавлять профессии. Лучше сделать метод addEmployee(Employee $e),а работников создавать снаружи.

> public function getDepStat() {


Вместо этой функции лучше сделать отдельные функции. Так как непонятно, зачем упаковывать не связанные друг с другом свойства департамента в один массив.

> $dep->createEmployee(Employee::TYPE_EMPLOYEES['manager'], "1", "0", "9");


Вообще, для указания на профессию можно было просто передавать имя класса. Оно получается так: Manager::class (мануал http://php.net/manual/ru/language.oop5.constants.php ). Такая запись защищает нас от ошибок (если бы мы использовали строку, мы бы могли опечататься) и позволяет использовать автодополнение в IDE.
1104 1232702
>>222800

Да. Почитай например http://denis.in.ua/foreign-keys-in-mysql.htm

>>223115

Ошибку какую-то пишет? Или что именно не так?

>>223286

> abstract class Employee


> public const TYPE_EMPLOYEES = ['manager' => '0',


Одно из условий задачи - возможность добавлять профессии с минимальным изменением старого кода. У тебя из-за этого массива это не сделать.

> int $boss


bool подойдет больше.

> $money = $this->data['money'];


А зачем тут массив непонятной структуры? Почему нельзя сделать $this->money? зачем усложнение?

> class Manager extends Employee


> protected $data = ['money' => '500',


Это плохое решение. У тебя 1) никак не документировано, что наследник должен поместить в поле массив 2) никак это не проверяется. Следовательно, легко сделать ошибку. Наконец, нет никакого смысла заталкивать никак не связанные числа в один массив. В такой ситуации лучше определеить в базовом классе абстрактные методы вроде getBaseSalary(), это решит обе вышеуказанные проблемы.

> public function createEmployee(int $prof, int $rank, int $boss, int $count) {


Та же проблема - это не дает возможности добавлять профессии. Лучше сделать метод addEmployee(Employee $e),а работников создавать снаружи.

> public function getDepStat() {


Вместо этой функции лучше сделать отдельные функции. Так как непонятно, зачем упаковывать не связанные друг с другом свойства департамента в один массив.

> $dep->createEmployee(Employee::TYPE_EMPLOYEES['manager'], "1", "0", "9");


Вообще, для указания на профессию можно было просто передавать имя класса. Оно получается так: Manager::class (мануал http://php.net/manual/ru/language.oop5.constants.php ). Такая запись защищает нас от ошибок (если бы мы использовали строку, мы бы могли опечататься) и позволяет использовать автодополнение в IDE.
1105 1232703
>>223352

> Если создать класс, единственной целью которого является хранения констант(глупая идея?)


Зависит от ситуации. Если ты решил собрать в один класс константы из всего приложения, то ты нарушаешь принцип разделения ответственности между классами (каждый отвечает за что-то свое и сам хранит свои константы). Если же ты решил собрать в классе константы, относящиеся к чему-то одному, то почему бы и нет. Например, коды ошибок:

class ApiErrors
{
const ERROR_USER_NOT_FOUND = ...;
const ERROR_INVALID_TOKEN = ...
}

Хотя, конечно, ошибки удобнее может быть обозначать исключениями.

> то его придется во все использующие его классы рекваирить?


Изучи автозагрузку https://github.com/codedokode/pasta/blob/master/php/autoload.md

>>223354

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


А ты не рассматривал возможность вынести эти общие методы в отдельный объект? Может, трейт не нужен?

> Есть еще одна пролема: url'ы, на который надо слать запросы(они разные для каждого из двух классов), хранятся в виде констант в этих самых классах, а внутри трейта вызываются как self::MYCONSTANT.


Это делает код непонятным. Как читать твой трейт, если ты (читая трейт) не знаешь, что в этой константе? Трейт вообще не должен обращаться к полям, методам, которых в нем нет. как такой трейт использовать, если ты не знаешь, что ему понадобится?

У меня ощущение, что ты просто плохо знаешь ООП. Если ты пишешь клиент для какого-то API, то это давно уже придумано. Делаем класс для отправки запросов в АПИ:

class SomeApiClient
{
// получить список пользователей через API
public function getUsers(UserFilter $filter): array;
public function getPostsByYear(int $year): array
...
}

Для непосредственно отправки запросов по протоколу HTTP делаем класс HttpClient (а лучше, берем библиотеку вроде Guzzle):

class HttpClient
{
public function get(string $url, array $queryParams, ...): Response;
public function post(...): Response;
}

Вот и все. Не вижу, зачем для такой ситуации нужны трейты, константы и тд. Нужно просто разбить алгоритм на слои, каждый из который использует ниже лежащий слой. А не писать все в одном классе.
1105 1232703
>>223352

> Если создать класс, единственной целью которого является хранения констант(глупая идея?)


Зависит от ситуации. Если ты решил собрать в один класс константы из всего приложения, то ты нарушаешь принцип разделения ответственности между классами (каждый отвечает за что-то свое и сам хранит свои константы). Если же ты решил собрать в классе константы, относящиеся к чему-то одному, то почему бы и нет. Например, коды ошибок:

class ApiErrors
{
const ERROR_USER_NOT_FOUND = ...;
const ERROR_INVALID_TOKEN = ...
}

Хотя, конечно, ошибки удобнее может быть обозначать исключениями.

> то его придется во все использующие его классы рекваирить?


Изучи автозагрузку https://github.com/codedokode/pasta/blob/master/php/autoload.md

>>223354

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


А ты не рассматривал возможность вынести эти общие методы в отдельный объект? Может, трейт не нужен?

> Есть еще одна пролема: url'ы, на который надо слать запросы(они разные для каждого из двух классов), хранятся в виде констант в этих самых классах, а внутри трейта вызываются как self::MYCONSTANT.


Это делает код непонятным. Как читать твой трейт, если ты (читая трейт) не знаешь, что в этой константе? Трейт вообще не должен обращаться к полям, методам, которых в нем нет. как такой трейт использовать, если ты не знаешь, что ему понадобится?

У меня ощущение, что ты просто плохо знаешь ООП. Если ты пишешь клиент для какого-то API, то это давно уже придумано. Делаем класс для отправки запросов в АПИ:

class SomeApiClient
{
// получить список пользователей через API
public function getUsers(UserFilter $filter): array;
public function getPostsByYear(int $year): array
...
}

Для непосредственно отправки запросов по протоколу HTTP делаем класс HttpClient (а лучше, берем библиотеку вроде Guzzle):

class HttpClient
{
public function get(string $url, array $queryParams, ...): Response;
public function post(...): Response;
}

Вот и все. Не вижу, зачем для такой ситуации нужны трейты, константы и тд. Нужно просто разбить алгоритм на слои, каждый из который использует ниже лежащий слой. А не писать все в одном классе.
1106 1232704
>>223981

Код костыльный в том смысле, что ты переплачиваешь, а потом забираешь лишнее. Лучше бы без этого.

>>224308

Фреймворк это основа для твоего приложения. Он дает такую пользу:

- позволяет заново не писать распространенные классы вроде Request, Response, обертку над PDO, читатель конфигов, базовые классы контроллеров, роутер, то, что встречается почти в каждом приложении. Также, там бывает авторизация, заготовки для админки.
- (главное) он позволяет новым людям не разбирать твой самописный код, как у тебя сделан роутер, как отдается ответ, а опираться на знание фреймворка. Представь, что ты переключаешься между 5 проектами, и каждый на своем фреймворке. Это же трата времени. А если они все на Симфони, тог у них похожая структура и все проще.

Главный момент конечно стандартизация. Если ты не используешь фреймворк, это значит, что ты пишешь (не осознавая этого) свой. И людям придется изучать твой никак не документированный фреймворк. А стандартные фреймворки имеют документацию, кучу статей и уроков, кучу ответов в интернете. В твоем самописном коде всего этого не будет.

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

Если ты написал всего 1 сайт, ты это не осознаешь, но если ты напишешь несколько, а также будешь работать с чужим самописным кодом, то, думаю, поймешь.

> Как вообще вкатываться в фреймворки и как/где получить практику



Заходишь в ОП пост. Делаешь файлообменник на Slim и тестхаб на полноценном фреймворке. Читаешь пояснения и комментарии к задачам. Просветляешься.

>>225566

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

>>226279

Вагрант это средство для настройки виртуальных машин. Он по моему запускает виртуальную машину с тем самым линуксом внутри. Соответственно не зная линукса, мне кажется, сложно будет с ним работать.
1106 1232704
>>223981

Код костыльный в том смысле, что ты переплачиваешь, а потом забираешь лишнее. Лучше бы без этого.

>>224308

Фреймворк это основа для твоего приложения. Он дает такую пользу:

- позволяет заново не писать распространенные классы вроде Request, Response, обертку над PDO, читатель конфигов, базовые классы контроллеров, роутер, то, что встречается почти в каждом приложении. Также, там бывает авторизация, заготовки для админки.
- (главное) он позволяет новым людям не разбирать твой самописный код, как у тебя сделан роутер, как отдается ответ, а опираться на знание фреймворка. Представь, что ты переключаешься между 5 проектами, и каждый на своем фреймворке. Это же трата времени. А если они все на Симфони, тог у них похожая структура и все проще.

Главный момент конечно стандартизация. Если ты не используешь фреймворк, это значит, что ты пишешь (не осознавая этого) свой. И людям придется изучать твой никак не документированный фреймворк. А стандартные фреймворки имеют документацию, кучу статей и уроков, кучу ответов в интернете. В твоем самописном коде всего этого не будет.

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

Если ты написал всего 1 сайт, ты это не осознаешь, но если ты напишешь несколько, а также будешь работать с чужим самописным кодом, то, думаю, поймешь.

> Как вообще вкатываться в фреймворки и как/где получить практику



Заходишь в ОП пост. Делаешь файлообменник на Slim и тестхаб на полноценном фреймворке. Читаешь пояснения и комментарии к задачам. Просветляешься.

>>225566

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

>>226279

Вагрант это средство для настройки виртуальных машин. Он по моему запускает виртуальную машину с тем самым линуксом внутри. Соответственно не зная линукса, мне кажется, сложно будет с ним работать.
1107 1232712
Переходите пожалуйста в новый тред: >>1232710 (OP)

Этот тред закрыт. Не пишите здесь больше. На все вопросы я ответил, если вдруг кого-то пропустил, напомните о себе в новом треде.
Помощь с кодом 1108 1233234
Суть: проверка текста/слова на палиндром.Застрял в конце задания, где идет цикл и нужно так сказать взять и сравнить по одному символу с начала и конца строки.Я не понимаю как.Вот ссылка на задачу, прощу помочь
http://sandbox.onlinephpfunctions.com/code/22218979dccb938eb3aaab1772761f3e654185e9
15322884556230.png79 Кб, 353x353
1109 1233580
Поставил эту IDE под XUbuntu.
Запустил сервер регистрации в docker-контейнере.
Опасно так делать, за яйца не возьмут?
1110 1233646
>>233580
Ты даже правоохранительным органам не нужен
1111 1239406
>>233234

Ответил в новом треде: >>1239405
изображение.png92 Кб, 561x677
1112 1239798
3 года изучаю пхп и не знаю, что так можно получить доступ к приватной переменной >.<
1113 1239891
>>239798

мы в новом треде >>1232710 (OP)

такой код писать не надо.
Обновить тред
Двач.hk не отвечает.
Вы видите копию треда, сохраненную 25 августа 2018 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
« /pr/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски