Сохранен 1100
https://2ch.hk/pr/res/919074.html
Архивач перешёл на постоянный домен ARHIVACH.NG. Независимо от дальнейшего развития событий, сайт всегда доступен через Tor.
Ваши пожертвования помогают нам оплачивать хостинг и домены.

Клуб изучающих PHP #85

 Аноним 25/01/17 Срд 09:12:30 #1 №919074 
php-noob-1.png
cat-cafe-osaka.jpg
cat-sad.jpg
welcome-to-php.png
Добро пожаловать в наш уютный тред. Тут мы изучаем язык PHP (а также JS/CSS/HTML/SQL), решаем задачки и даже делаем простые сайты! Зачем? Кто-то хочет научиться программировать, кто-то - делать сайты, кто-то - просто размять мозги и заняться чем-то полезным.

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

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

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

Предыдущий тред был тут: >>898502 (OP)

Еще предыдущие треды в архиве:

- 83: https://2ch.hk/pr/arch/2016-12-26/res/880700.html
- 82: https://2ch.hk/pr/arch/2016-12-01/res/864640.html
- другие: https://www.google.ru/search?q=site:2ch.hk/pr/+%D0%BA%D0%BB%D1%83%D0%B1+php

Мейлач лежит? Есть запасной тред: http://dobrochan.org/s/res/23225.xhtml#i46467

Что самое главное для программиста? Умение аккуратно оформлять код (читай второй пост, прежде чем писать код).

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

У нас есть уроки по основам PHP, они собраны и выложены по адресу http://archive-ipq-co.narod.ru/ Это учебник для изучающих с нуля, то есть если ты вообще ничего не знаешь, то надо начать с него. Он простой и понятный (по крайней мере в начале). Там есть задачи, их надо решать обязательно (чтобы стать программистом, надо писать код — иначе никак). Пости ссылки на решения в тред, мы их проверим, напишем замечания и дадим советы по улучшению.

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

Ты прошел весь учебник? Молодец, но это были лишь основы языка 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 2/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

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

Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания 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

Оформляй код аккуратно!!! — например пропусти через 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
- Можно подробнее про поиск работы, собеседования - нет, ОП писать не будет, но может кто из анонов захочет рассказать. Поищите тред перезвонивших, а также раздел /wrk/.
- Сколько времени надо изучать все это? - все зависит от тебя, но не меньше 6-8 месяцев
- Посоветуйте редактор кода - Sublime Text 3, Notepad++, PhpStorm
- Нужен ли ООП, фреймворки, MVC, git, composer? — Да, однозначно. Посмотри любую вакансию.
- Что самое главное для программиста? Умение аккуратно оформлять код.
- ОП, сделай за меня мою работу или домашнее задание? — Это конечно, хорошая идея, но нет.
- Подскажи сайты для поиска работы, я не умею гуглить? — hh.ru, geekjob.ru, moikrug.ru (склеен с brainstorage.me), fl.ru, upwork.com (бывший одеск). Имей в виду, что кроме фриланса есть еще постоянная удаленная работа (remote job) когда тебе не надо тратить время на поиск заказов и переговоры с неадекватными заказчиками.
Правила Аноним 25/01/17 Срд 09:13:25 #2 №919075 
grammar-nazi.png
Код нужно писать не как попало, а аккуратно и по правилам. Почему? Потому, что на неакуратно написанный код не хочется даже смотреть.

Если тебе лень выравнивать код руками, закачай его на 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

------------------

Итак, ты зашел в тред и решил помочь какому-то анону, дав ему совет или подсказку. Спасибо! Но прочти сначала эти напоминания, чтобы твоя помощь действительно была полезной.

Давай удочку, а не рыбу

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

Будь доброжелателен

Не годится: «Ты мануал хоть раз в жизни открывал, обезьяна?»
Не годится: «В гугле забанили?»
Не годится: «Твой код плохой»
Хорошо: «Вот, как можно улучшить этот код: ...»
Хорошо: «Ты неправильно используешь функцию abc(). Вот ее описание: ссылка, и как видишь ей надо передать строку, а не массив»

Не придирайся к знанию английского или русского языка.

Объясняй

Не очень хорошо: «сделай как в этом коде»
Хорошо: «если ты вставляешь текст от пользователя в SQL запрос, то получается SQl-инъекция, которая позволяет взломать твой сервер (ссылки). Чтобы этого избежать, надо вставлять данные с помощью плейсхолдеров (ссылки)»
Хорошо: «Помни, что код пишется для людей. Если писать такие большие функции, то в них становится трудно разобраться...»

Не проповедуй

Мы учим использованию самых распространненных подходов, стандартов, библиотеки фреймворков. Если ты не любишь ООП, пробелы в коде, jQuery, сам PHP, то рассказать об этом стоит в каком-нибудь другом треде.

Не придирайся к знанию английского языка, анон пишет как умеет.

Ах да. Если тебе кажется, что что-то в учебнике или задачах можно сделать лучше — пиши, обратная связь всегда очень полезна.
Аноним 25/01/17 Срд 09:16:38 #3 №919076 
Кого я пропустил и не ответил в предыдущем треде >>898502 (OP) , напомните тут о себе.

--

Хорошая задача на ООП с собеседования: http://www.cyberforum.ru/php-oop/thread1459985.html

Вы должны решить как минимум Вектор, чтобы взяться за нее. Если вы сделали студентов или файлообменник - эту задачу должны решить легко.
Аноним 25/01/17 Срд 11:39:52 #4 №919129 
>>919076
ОПчик, почему тут цикл состоит только из 1 значения?
http://ideone.com/lcS8qQ
Дело в continue? Мысль была такова, что при положительном итоге проверки на наличие купюр, он их просто пропускает и переходит к следующему номиналу.
Аноним 25/01/17 Срд 13:08:05 #5 №919179 
>>919068

Я уже начал делать MVC сапера отсюда https://github.com/codedokode/pasta/blob/master/js/minesweeper-mvc.md , смысл делать позер-MVC, когда можно полноценное. Вопрос такой, ты помогал советами анонам писать event dispatcher для паттерна observer? Или они брали готовый код (глянул на гитхабе енота, вроде свой). Можешь ли ты подробней расписать про этот паттерн, а то я пока что не понял как работают его методы и как будет устроен класс, понял только что он будет следить за изменением модели за счет addEventListener. Там вроде есть ссылки на эти классы, но мне кажется если я их посмотрю, это будет как подглядывание.
Аноним 25/01/17 Срд 14:04:21 #6 №919227 
>>919179

Класс очень простой, он по сути позволяет сделать 2 вещи:

- добавить обработчик для какого-то события (addEventListener)
- вызвать все зарегистрированные обработчики и может быть передать им параметры события (triggerEvent)

Примерно так:

var ed = new EventDispatcher;
ed.addEventListener(SOME_EVENT, function (event) { ... });
ed.addEventListener(SOME_EVENT, function (event) { ... });

ev.triggerEvent(SOME_EVENT, { data: ... });

Есть еще альтернативный подход, когда класс представляет диспетчер только для одного события (то есть на каждое событие создается отдельный объект):

var someEvent = new EventDispatcher;
someEvent.subscribe(function (event) { ... });
someEvent.trigger({ data: ... });

Ты также можешь посмотреть:

- как устроен встроенный в браузер диспетчер событий: https://developer.mozilla.org/ru/docs/Web/Guide/Events/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B8_%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2_%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D0%B9

- обзор разных подходов (англ): https://github.com/millermedeiros/js-signals/wiki/Comparison-between-different-Observer-Pattern-implementations

Методы иногда называют немного по-другому (notify/dispatchEvent/raiseEvent/fireEvent), но суть та же.

Также можешь погуглить по словам Observer и Event Emitter/Event Dispatcher.
Аноним 25/01/17 Срд 14:12:14 #7 №919229 
$a = [];
for ($i = 0; $i < 1.02; $i += 0.17) {
$a[$i] = $i;
}
echo count($a);

Господа, поясните, почему получается 1?
Аноним 25/01/17 Срд 14:13:25 #8 №919232 
>>919229
Все, я понял. Спасибо.
Аноним 25/01/17 Срд 14:13:56 #9 №919233 
>>919129
ОП, я разобрался сам, не трать время на тот код. Вот посмотри пожалуйста этот, вроде, как сделал: http://ideone.com/Vl5GJ4
Аноним 25/01/17 Срд 16:42:10 #10 №919288 
https://arhivach.org/thread/216627/#899867
>wireshark
>прокси на php
Какие прекрасные подарки вы мне сделали перед НГ, это просто благословение!

https://arhivach.org/thread/216627/#899868
>> .header h1 {
>> font-family: ReklameScriptRegularDEMO, Cambria
>В конце списка шрифтов надо указывать бы стандартный (serif и подобный). Cambria есть только на windows.
Вы кидали сайт где указывались шрифты и статистика использования на разных платформах. Выбрал Кабмрию потому что там было 90%+ и для Эпл и красивенько выглядел.

>> .services .content .box .consectetur::before {
>> background-position: 0px 0px;
>> width: 47px;
>> height: 54px;
>Вот тут проще было для 4 блоков указать одинаковый размер картинки, а не различающиеся на 2-3 пикселя.
В фш так вырезалось что все картинки разных размеров...

>> .services .content .box .fermentum::before {
>я бы убрал тут .content, он выглядит лишним
Как понять 'выглядит'? Разве не нужно соблюдать иерархию дерева? Знаю что не обязательно, но моё субъективное восприятие подсказывает что так выглядит лучше.

>В общем, я вижу, что верстка хорошо сделана (еще бы, после нескольких итераций), единственнй баг - это бекслеши и не работающие в ФФ картинки. Их исправь, а остальное - если будет желание. Если будешь сдавать на проверку, напомни, что единственная претензия у меня была к картинкам.
Исправил: https://www.browserstack.com/screenshots/634b220454c5dd8901b415de1440461f2a47865f/win10_firefox_44.0.jpg

https://github.com/someApprentice/maintaskforlayout/
Аноним 26/01/17 Чтв 00:09:52 #11 №919568 
Есть массив в котором содержатся хлебные крошки, в формате [id]=>[title]. Необходимо сделать так, чтобы последняя ссылка в хлебных крошках не была ссылкой. Могу реализовать двумя вариантами, либо подчистить довольно сложным регулярным выражением, либо же ввести счётчик ($i) и если это будет последняя итерация, то есть условие переменная счетчика равна количеству элементов в массиве просто не записывать html код, то есть не делать ссылку. Как правильнее и быстрее?
$i=1;
foreach($breadcrumbs_array as $id => $title) {
$string ="<a href='?category=$id'>$title</a> / ";
if($i==count($breadcrumbs_array)) {
$string = $title;
}
$breadcrumbs.= $string;
$i++;
}
Аноним 26/01/17 Чтв 14:24:49 #12 №919800 
Аноны, почему тут постоянно пишет, что на 12 строке какое-то невыполнимое условие? В итоге он пишет, что не успевает за 30 сек. всё просчитать.

http://ideone.com/3PFkTf
Аноним 26/01/17 Чтв 15:26:33 #13 №919831 DELETED
>>919800
Во-первых, когда ты используешь unset, то ключи в массиве не сдвигаются.
Допустим, у тебя есть массив $a = [1, 2, 3] и ты используешь unset($a[1]). Массив примет такую структуру:
[0] => 1
[2] => 3
Обходится хаком с array_values: http://stackoverflow.com/a/5217738

Во-вторых, в коде бесконечный цикл, т.к total всегда будет больше либо равно 5.
Как-то так: http://ideone.com/gRDsbR
Учти, что условий твоей задачи я не знаю и за правильность не ручаюсь.




Аноним 26/01/17 Чтв 20:15:02 #14 №919968 
Изучаю сейчас все подробности создания сайтов каталогов, и хочу уже использовать всё это в каком-нибудь реальном сайте. Подскажите, каталог чего можно создать? Только не товаров с возможностью покупки, как в интернет-магазине, а чего-нибудь другого, например каталог сайтов или что-то такое.
Аноним 26/01/17 Чтв 22:32:21 #15 №920065 
Получаю с Select формы массив данных со значениями полей. В нём может быть разное количество элементов, от 1 до 8. Далее мне нужно внести эти данные в таблицу, в котором есть условно два столбца id и text, где текст это значение каждого элемента массива. То есть, если в массиве 6 элементов, я должен записать 6 строк в таблицу. Можно ли это как-то сделать, но без использования запроса к базе данных внутри цикла?
Аноним 27/01/17 Птн 09:44:40 #16 №920199 
Все, пиздец, не могу решить задачу Опа "Считалочка". http://archive-ipq-co.narod.ru/i/l1/l1-bonus-survivor.png
Логика моего решения примерно такова:
создаем пустой массив длиной в 30 символов
пока длина этого массива больше чем количество слогов:
начинаем считать сначала, находим первый элемент который делится на 5 без остатка ( элемент % 5 == 0)
как только находим его, делаем новый массив в который добавляем все числа которые идут после него и до конца.
затем к этому новому массиву добавляем те элементы которые шли сначала и до этого элемента
в итоге получаем массив начинающийся с числа 6 до 30, а далее 1,2,3,4. Это для того чтобы считать дальше начиная со следующего элемента.
скопировать значения из этого нового массива в финальный, чтобы пройтись по нему таким же алгоритмом снова
как только в массиве остается 4 числа, выводим их в ответ


У меня нихуя не получается переназначить первоначальный массив, он всегда остается таким же как был.
Аноним 27/01/17 Птн 09:46:09 #17 №920201 
>>920199
Судя по примерному коду ОПа из этой задачи, у него решение четкое логичное и аккуратное, у меня же как говно. Скорее всего сам алгоритм неверен.
Аноним 27/01/17 Птн 16:16:27 #18 №920322 DELETED
>>920199
> пока длина этого массива больше чем количество слогов:
А количество слогов здесь причём? Тебе нужно оставить какое-то определённое количество девочек с чаем (по условию - 4), эта цифра к количеству слогов в считалке никак не относится.
И как мне кажется, проще манипулировать индексами, а не копировать массивы из одного в другой. У меня как-то так вышло: http://ideone.com/CEZH6d
А за хак с array_values извиняюсь, есть же array_splice.
Аноним 28/01/17 Суб 18:52:55 #19 №920960 
Оп, а можно ли вот так сделать или это неправильно?

http://ideone.com/cWWTRU

Я хочу, чтобы this._field (он представлен в виде массива [{x:1, y:1}, {x:2, y:1} ...etc] остался в таком виде по возрастанию. Если я сделаю на него shuffle, то он пересортируется случайно. Поэтому я делаю неглубокию копию массив и воздействую на элементы массива - объекты, которые соответственно будут меняться и в оригинальном массиве. Вот такой неочевидный абуз. Я получаю, то что мне нужно (минирую поле) и массив по прежнему в порядке возрастания. Наверное надо делать метод setMine и передавать в него элемент скопированного массива, чтобы good code? А этот метод будет минировать поле field.
Аноним 28/01/17 Суб 19:04:14 #20 №920969 
>>919074 (OP)
Спасибо, ОП, за перекат самого годного треда доски. Ради него сюда и захожу еще ради хаскеля
Аноним 28/01/17 Суб 19:13:59 #21 №920973 
>>919074 (OP)
>Кто-то хочет научиться программировать
>PHP (а также JS/CSS/HTML/SQL)
/0
Аноним 28/01/17 Суб 19:29:06 #22 №920988 
>>920960

И еще я думаю как хранить мины, флажки и открытые клетки. Два варианта. Либо это boolean свойства объекта Cell, либо они хранятся в свойствах-массивах this._flags, this._mines, this._openCells. В последнем случае будет еще существовать мета-массив field, в котором будут все клеточки. Получится так, что элементы этих массивов будут ссылаться на одни и те же объекты Cell. Это нормально или делать глубокое копирование?
Аноним 28/01/17 Суб 19:30:07 #23 №920990 
>>920988

> либо они хранятся в свойствах-массива

Здесь имеется ввиду свойства модели MinesweeperGame.
Аноним 28/01/17 Суб 22:51:06 #24 №921117 
Есть файл, в котором находится скрипт обрабатывающий данные приходящие из формы. Как только происходит их обработка, он автоматически перенаправляет пользователя на другой файл. Как закрыть доступ со стороны браузера к этому файлу? Пока что только приходит, сделать так, что если обязательные данные не заполнены, то есть их нет в массиве ПОСТ вызывать exit; Со стороны формы, которая находится в другом файле пустую строку не будет пропускать яваскрипт. Какие есть лучшие варианты?
Аноним 29/01/17 Вск 01:14:20 #25 №921197 
14771288129750.jpg
>>920960

Так же вопрос, можно ли данный метод http://ideone.com/8v7B0B вставить в ConsoleController ? Или в модель это пойдет. Суть его в том, чтобы команды вроде 'a2' из консоли переводить в объекты Cell, ведь наверное нельзя передавать аргументы в контроллер вот так game.setFlag(new Cell(1,5), верно?
Аноним 29/01/17 Вск 02:40:38 #26 №921275 
анончики, расскажите, сложно ли вкатиться в фриланс на похапе?
я знаю жс(+jquery+react+react-native+ember),html,css на уровне 3-4 месяцев практики, сделал тройку сайтов для себя + игру на андроид, и сейчас выбираю между пхп и питоном. На жс+верстке не въехть из за обилия макак, которые имеют сотни отзывов и опыт на сайте, а мой профиль без рейтинга никому не нужен, поэтому хочу попробовать что-то еще. Ну и типа фуллстак же буду.
Аноним 29/01/17 Вск 04:01:25 #27 №921283 
>>921275
Пока ты не начнешь выгрызать и находить себе заказы, ты так и будешь выбирать между пхп и питоном, потом еще из какой нить дрочи и везде будут "обилие макак".
Аноним 29/01/17 Вск 04:37:27 #28 №921290 DELETED
>>919076
https://2ch.hk/pr/res/898502.html#919067

Благодарю за ответ, переделал задачку: http://ideone.com/IscxDU

> Лучше было бы просто переупорядочить правила.
> "если ни одна из предыдущих скидок не применена, и пользователь выбрал 3 или более продуктов, то применить одну из этих 3 скидок в зависимости от количества" - вот это с моей точки зрения самое логичное.
Это конечно же многое облегчает. Да, в задаче чётко написано, что каждый товар должен использоваться лишь один раз.
Аноним 29/01/17 Вск 07:37:53 #29 №921305 
>>921275
В пхп макак еще больше, попробуй java или .net
Аноним 29/01/17 Вск 07:53:43 #30 №921307 
>>921305
Нельзя просто взять и попробовать Яву.
Аноним 29/01/17 Вск 08:48:03 #31 №921309 
Напомню себе, что надо проверить:

https://github.com/masssn/students.loc 29.12 >>903250
https://github.com/anotherCodeMunkey/fileshare (это ведь на проверку?) 07.01 >>907902

Если вы что-то писали в старом треде, и я не ответил, не проверил, напомните о себе тут.

Также, напомню, что в старом треде опубликованы ответы:

>>919067 - про задачу про ООП и скидки
>>919065 про JS задачу на DOM номер 4
>>919061 клавиша шифт, йода, сумма прописью
>>919060 про сумму прописью
>>919059 про калькулятор
>>919058 про preg_match

Старые ответы Аноним 29/01/17 Вск 08:48:25 #32 №921310 
>>907746

> В каком вашем мануале можно прочитать про организацию роутера для URL, контроллеры по умолчанию, index.php в корне сайта?

У нас такой статьи нет. Но можно оизучать фреймворуи вроде Slim, Yii2, Symfony и посмотреть, как роутинг сделан там.

Обычно ислоьзуются такие подходы или их сочетание:

- конфиг, где прописаны шаблоны УРЛ и соответствующие им контроллеры
- шаблоны УРЛ и их обработчики явно прописываются в коде:

$app->get('/about', function () { ... });
$app->get('/help', 'HelpController::indexAction');

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

Ну и процитирую еще пост другого анона с ответом на этот вопрос:

>>908528
> Первый ответ: https://toster.ru/q/321702
> Читать исходники готовых роутеров:
> http://symfony.com/doc/current/routing.html
> https://github.com/auraphp/Aura.Router

>>909285

>>Ты по моему не очень понимаешь, что такое AR. AR это когда класс/объект представляет и строку из базы данных, и содержит методы для ее загрузки/сохранения в БД. Ты уверен, что ничего не перепутал?
> Просто я видел такую фишку, когда делали абстрактный класс model в котором просто были сделаны операции типа insert и delete, а под конкретную типа student от него наследовались, называли это актив рекорд.
Нет, наследование тут не при чем. Главная особенность Active Record - то, что класс-модель сам умеет себя сохранять в базу:

$student = new Student;
$student->name = 'Ivan';
$student->save();

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

>>Лучше иметь сервис, в котором есть методы для проверки и сохранения файла. Чтобы мы всегда могли бы программно сохранить файл (даже если мы не собираемся это делать, просто чтобы код был логически разделен на част).
> О, отлично. Только это же все равно логически относится к моделям, правда?

Да, в MVC это модель.

>>безопасность, чтобы нельзя было сохранить файл с расширением php или именем htaccess
> Такие файлы стоит просто запрещать загружать или же менять им расширение?
Удобнее разрешать загружать, но при сохранении менять расширение на безопасное вроде .txt
Старые ответы Аноним 29/01/17 Вск 08:48:49 #33 №921311 
>>909294

> Начал писать свой пикчехостинг на ларавеле. Вопрос следующий: у меня есть возможность загружать картинку не только с компа, но и по урл. Написал свой формреквест, форма валидируется нормально, но пропускает одновременно оба заполненных инпута, с файлом и урлом (нужен xor). Вопрос: как лучше организовать проверку на xor, писать свой Rule или делать это на стороне контроллера?

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

>>909411
>>909412

> Можете подсказать, почему конечный результат отличается?
Ты в последний месяц, когда там остается выплатить около 4000, выплачиваешь их сразу ( else {$paymentTotal = $paymentTotal + $creditBalance; ), а ведь на них сначала должны начислиться проценты и комиссия. И выйдет больше.

>>909492

> Где phpMyAdmin хранит комментарии к ячейкам таблицы?
phpMyAdmin сам их не хранит, а передает на сервер MySQL для хранения. Эти же комментарии можно добавить и без phpMyADmin, через SQL запрос вида:

CREATE TABLE x (
y INT COMMENT 'Примечание'
) COMMENT 'Примечание';

> Участвуют ли они в запросах?
> Есть ли разница в производительности запросов с ними / без?
Думаю, нет. Но разбираться в таблицах с комментариями гораздо удобнее.

> Какой движок (MyIsam, InnoDb, другой?) подойдет лучше для ситуации:
Почитай про различия между движками, гугли "отличия innodb и myisam"

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

Вообще, тебе лучше бы просто сделать таблицу, скрипт выборки и померять время.
Старые ответы Аноним 29/01/17 Вск 08:50:18 #34 №921312 
>>912063

$b можно было бы вычислять из $i ($b = длина - $i - 1 или даже просто $b = - $i - 1), но твое решение в общем-то тоже верное.

>>919083

>>Конечно, копирует ссылку на функцию.
> Но функция находиться же в объекте obj! В чём подвох?

var o = {};
o.fn = function() {};

Функция o.fn сама по себе никак к этому объекту не привязана. Объект хранит в себе ссылку на функцию, а функция на объект - нет. Потому если мы копируем ее в отдельную переменную, и вызываем, то она про исходный объект ничего уже не знает и this указывает на window:

var f = o.fn;
f();

А вот если мы пишем

o.fn();

То интерпретатор JS видит, что функция вызвыается на объекте, и подсовывает его в качестве this.

Чтобы она "запомнила" свой объект, мы должны использовать bind:

var f = o.fn.bind(o);
f();

>>Задача 1: написать функцию bindContext(fn, that). Она создает новую функцию, которая при вызове вызывает fn с указанным this и переданным аргументами. То по сути есть привязывает произвольное значение this к функции.
> https://jsfiddle.net/Luubgokx/
Все верно.

>>Задача 2: сделать функцию addProperty(object, name, initialValue) для создания приватных свойств с геттерами и сеттерами на объекте или прототипе объекта.
> https://jsfiddle.net/sh21j4p1/
Тут опечатка в коде:

> addProperty(obj, 'test', 10);
> console.log(obj.getName());
Свойство test, а вызывается getName вместо getTest().

По коду: в общем, верный подход, мы прячем переменную в замыкании, но вот не очень понял, зачем использовать defineProperty. Функции get/set можно просто добавить через obj[funcName] = function ...

> name[0].toUpperCase() + name.slice(1)
Это конечно лучше было вынести в вспомогательную функцию.

Задача про фастфуд

> Почему-то не получается https://jsfiddle.net/y28h2o2b/3/
Там надо открыть отладчик (Ctrl + SHift + I) и включить режим "останавливаться на исключении". И там будет видно, что this.menu не определено, отсюда и ошибка.

Ест статья про отладку: http://learn.javascript.ru/debugging-chrome

Аналогичный отладчик есть и в Фаерфоксе, и в Сафари.

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

Электросеть

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

Тут есть разные варианты, надо просто выбрать такой, какой удобнее:

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

Первый подход наверно гибче.

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

> Лучше исключить её из перебора потому, что ЛЭП тоже может вернуть какое-то количество мощности.
Мне кажется, надежнее прописать там ноль, так как мы не знаем, какая у нее мощность. Ну или вообще не делать в ней метода getPower(), чтобы его не пытались даже вызывать.

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

> https://jsfiddle.net/6591a2sL/4/

> this.elements.sort(function (a, b) {
> if (a.price > b.price) {
Вот тут я вижу неточность: в коде предполагается, что у всех элементов сети есть свойство "цена". Но оно есть только у ЛЭП. Потому мы должны отобрать ЛЭП и сортировать только их.

Также, sort меняет порядок следования элементов в this.elements, что может где-то быть нежелательно. Ведь получается что метод с названием get Something фактически изменяет внутреннее состояние объекта, что неожиданно. Лучше получить отдельный массив ЛЭП и сортировать его.

> if (this.elements instanceof PowerLine) {
> price += this.elements.countPrice(balance);
> balance = this.elements.countPower(balance);
Тут нет расчета, сколько именно нужно купить. Нужно покупать не всю доступную энергию, а только ту, что не удалось произвести.

> function Electrostation(power) {
> if (power >= 1 Math.pow(10, 6) && power <= 100 Math.pow(10, 6)) {
> this.power = power;
> this.nightpower = power;
Тут лучше не задавать свойства вручную, а вызывать конструктор предка. Может потом туда допишут еще какой-то код, и тут он не сработает. Принято всегда вызвать конструктор предка, так как именно он отвечает за инициализацию предка. И если его не вызвать, то что-то из задуманного может не выполниться.

> function PowerLine(power, price) {
> this.power = power;
> this.price = price;
> }
Мне кажется, тут неправильно используется свойство power, так как у ЛЭП это не фактически переданная мощность, а пропускная способность (сколько максимум можно купить/продать), и логично для нее использовать другое название, чтобы не было путаницы.

> PowerLine.prototype.countPower = function(power) {
> var thispower = this.power;

> for (var i = 0; i < thispower; thispower--) {
> if (power == 0) {
> break;
> }

> power += power / -Math.abs(power);
что-то я не могу толком понять, что тут происходит. Зачем мы power делим саму на себя? Получится ведь либо 1, либо -1. Тут явно ошибка.

Определение типа переменной

> Что подрузумевается здесь под словом 'хеш'?
Хеш, он же словарь, он же ассоциативный массив, он же объект - это вот это:

var x = { 1: 2, 'x': 'y' };

Я просто написал что вместо switch можно было сделать объект, в ключах которого хранятся значения вроде '[object Function]'. И искать тип в этом объекте.

>>Недостаточно, надо бы проверить что там есть свойства от 0 до length - 1.
>>от 0 до length - 1
> А как это выразить в условии
Написать цикл, проверяющий наличие свойств с помощью оператора in.

15. Напиши функцию неглубокого копирования объектов и массивов

> Опять же, не могу понять что с этим не так: Если это клон объекта, то этот клон должен иметь тот же прототип что и "донор"(?).
Не, до такой степени скопировать объект мы вряд ли сможем. Достаточно копировать только свойства самого объекта, копировать прототип не требуется.

Вообще, в JS не все можно скопировать полностью. Некоторые встроенные объекты, например, массив, функцию-замыкание с захваченными переменными, или исключение, идеально скопировать может не получиться (насчет массива: он ведь мог быть создан в другом ифрейме, тогда копирование через var copy = [] не даст точную копию). Потому в задаче и не требуется все копировать полностью, а только то, что описано в условии.

> Лучше использовать for ... object.length вместо for in?
У объектов нету object.length, length есть только у массивов. Лучше использовать либо for .. of из ES5, либо проверку через hasOwnProperty() из ES3.

> https://jsfiddle.net/uyey3at1/1/
Тут в коде, я вижу, есть поддержка копирования объектов Date и обычных объектов, а что с массивами? Для них ведь надо изначально создавать пустой массив и копировать элементы. Иначе тест вроде Array.isArray() не пройдет на копии.

Глубокое копирование

> https://jsfiddle.net/j8pydqsg/2/
> var clone = new object.constructor;
Неприавльно вызывать конструктор. Мы ведь не знаем, какие аргументы у него есть и что в них надо передать. Надо делать так:

- если источник - это Date, то создать новый Date, можно сразу передать правильное значение даты
- если источник - массив, создать новый массив и скопировать элементы
- если источник - другой объект создать пустой объект и скопировать все его свойства, не относящиеся к прототипам
- иначе, если источник - не объект (а число, строка, null и тд), можно просто вернуть его

Тут из-за кучи цитат становится уже трудно понимать некоторые ответы, если что-то непонятно, можно просто задать вопрос отдельно.
Старые ответы Аноним 29/01/17 Вск 08:50:37 #35 №921313 
>>911927

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

> А ещё интересно было бы узнать, как по уму реализовывать хранение конфига системы в базе данных (как у всех популярных cms).
Сделать таблицу вида key | value, то есть 1 строка = 1 настройка. Если данные разных типов, то можно сделать key | int_value | string_value и тд.

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

> отдельная модель UserConfig с отдельной таблицей в БД, сохраняющая при каждом изменении данные в кэш.
Ты усложняешь раньше времени. Кеш можно добавить, но тогда надо решать, как именно его делать: 1 ключ для всех настроек или для каждой настройки свой ключ. И на малонагруженном сайте скорее всего с кешем будет примерно такая же скорость, что и с БД.

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

> Всё это дело выполняет отдельный миддлвэр для всех запросов к серверу.
middleware - это в смысле что-то аналогичное middleware в Слиме? Оно явно не для настроек и конфигов предназначно.

> для всех запросов к серверу.
Вообще, логичнее читать конфиг, только если он нужен.
Аноним 29/01/17 Вск 09:23:35 #36 №921320 
>>919229

Скорее всего, дробные числовые индексы у массивов округляются до целого.

>>919179

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

>>919233

> while (($amount >= $value) and ($count > 0)) {
> $amount -= $value;
> $countBills += 1;
Цикл с вычитанием нужно заменить на деление. Учесть ограничение на число имеющихся банкнот можно с помощью min/max.

>>919568

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

Также тут есть еще идеи:

http://stackoverflow.com/questions/1070244/how-to-determine-the-first-and-last-iteration-in-a-foreach-loop
> end($array);
> $lastKey = key($array);
...
> if ($key === $lastKey)

Ну и я бы советовал вынести HTML в шаблон. И не писать array в названии переменной.

>>919968

А чем создание каталогов отличается от каких-то других сайтов? Ну не знаю даже что, сделай каталог уроков по программированию например, если своих идей нет.

>>920065

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

>>920199

Тут надо правильно выбрать формат массива. Например, можно сделать так:

- ключ обозначает текущий порядковый номер девочки от 0 до N (и ключи пересчитываются заново при удалении с помощью array_values/array_splice), а значение - исходный номер (когда еще все были в круге). На определенном шаге мы имеем такой массив:

[0] => [2]
[1] => [3]
[2] => [5]
[3] => [7]
...

Тогда нам достаточно иметь просто счетчик, который мы увеличиваем на X с переполнением, и удаляем девочку с таким индексом (например, через unset или array_splice). Переполнение счетчика делается через взятие остатка от деления на текущий размер массива.

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

И изучи функцию array_splice, она может быть полезна.
Аноним 29/01/17 Вск 09:23:58 #37 №921321 
>>920960

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

И в коде конечно ошибки, например:

> if (typeof x != "number" || y != "number") {
Должно быть typeof y

Также, не уверен, что нужно свойство nearMines у Cell. Зачем оно там?

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

>>920988

Ну тут надо думать, какой подход будет удобнее. Оба подхода имеют право на жизнь. Главное отличие, что в случае массивов this._mines, this._flags информация хранится в классе Field, а не в объектах Cell.

Тут надо сравнивать такие вещи:

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

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

>>921117

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

Яваскрипт-проверка легко обходится злоумышленником.

>>921197

Можно в контроллер, можно в вспомогательный utility класс.

> var regex = new RegExp("^\\w(\\d){1," + Util.getNumberLength(this._minesweeperGame.MAX_HEIGHT) + "}$", "i");
Это уже переулсожнение, проще просто потом проверить значение числа.

> ведь наверное нельзя передавать аргументы в контроллер вот так game.setFlag(new Cell(1,5), верно?
Да, в условиях задачи требуется передавать человекопонятные обозначения.
Аноним 29/01/17 Вск 12:03:23 #38 №921358 
>>921283

как я тебе выгрызу заказ, куда уже 30 мухамедов постучалось, которые имеют рейтинг ~500 и говорят, что сделают не за 100$ а за 10?

>>921305
так и заказов дохуя, вот и спрашиваю.
Аноним 29/01/17 Вск 14:24:09 #39 №921447 
>>921321

>Также, в твоем массиве не очень удобно искать ячейку по координатам.

Это связано что я выбрать подход с объектом Cell, а не с двумерным массивом поля? Если да, то ты же сам в задаче предлагаешь такой вариант.
Аноним 29/01/17 Вск 14:26:11 #40 №921453 
>>921447

И еще, я так понял, ты намекаешь, что все таки надо делать глубокое копирование объектов.
Аноним 29/01/17 Вск 22:51:53 #41 №921748 DELETED
https://2ch.hk/pr/res/898502.html#914237
https://github.com/kubk/students

> PageObject
Пока гуглил, заметил, что многие понимают PageObject по-разному: кто-то предлагает просто выносить селекторы в объекты со статическими свойствами, кто-то считает, что PageObject должен предоставлять интерфейс страницы, пользователи которого не знают ничего о селекторах и взаимном расположении DOM-элементов. Мне второй вариант понравился больше.

> поиск по фамилии зависит от регистра букв
Этого бы не произошло, если был бы написан тест: https://github.com/kubk/students/blob/master/tests/StudentGatewayTest.php

Насчёт теста функции экранирования:
> - передаем строку с тегом и проверяем, что на выходе тега нет
> - вызываем html_entity_decode на результате и проверяем, что получилась исходная строка
> - аналогично можно проверить кавычки, а также отдельные угловые скобки, что их нет в результирующей строке
Если правильно понимаю, то второй пункт работает, только если искомая строка не будет найдена. В противном случае результат будет содержать тег b или mark, и исходную строку от такого результата не получим. В общем, сам тест: https://github.com/kubk/students/blob/master/tests/StudentTwigExtensionTest.php#L71

> тут https://github.com/kubk/students/blob/master/src/LinkGenerator.php#L54 HTML в коде, и ссылка не экранируется как положено.
> Лучше было бы использовать для HTML кода макрос твига, а генерировать в PHP только сам URL.
Теперь html в php нет https://github.com/kubk/students/blob/master/src/LinkGenerator.php#L47
, но как мне кажется, тут https://github.com/kubk/students/blob/master/templates/student-list.twig#L14+L15
какой-то низкоуровневый код в шаблоне. Ну и ссылка генерируется только в одном месте, нужен ли макрос, который будет использоваться лишь один раз?

> Насчет авторизации по паролю - лучше в куке (и в БД) хранить не пароль, а его соленый хеш. Чуть безопасней, а так у тебя пароль в открытом виде на каждый запрос шлется. И в базе лежит. Украли базу/куки - и можно идти проверять, подойдет ли этот пароль к почте, к соцсетям итд.
В базе был только хеш, а насчёт кук - да, сглупил.

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

Хероку без подтверждения кредитки даёт только постгрес (а ещё на нём почему-то тесты прогоняются раза в 2-3 быстрее, чем на MySQL).
Впредь постараюсь быть внимательнее и лучше тестировать то, что отдаю на проверку.
Аноним 30/01/17 Пнд 15:27:57 #42 №922034 
Нужно ли проверять переданные параметры в js функциях? В некоторых проектах этого не делают, а пишут перед методами/функциями комментарий для jsdoc с текстом вроде @param {number} [value]. Разве он что-то сделает если туда передать допустим строку?
Аноним 30/01/17 Пнд 17:26:45 #43 №922117 
Нашел неплохую книгу по PHP
Написана может не очень хорошо, но неплохие практики, перед прочтением пройдите туториал от ОПа.
>Бретт Маклафлин - PHP & MySQL. The Missing Manual, 2nd Edition / PHP и MySQL. Исчерпывающее руководство, 2-е издание
Аноним 30/01/17 Пнд 17:40:33 #44 №922138 
14784084455820.webm
>>921309
>>это ведь на проверку?
Возможно. Кажется, я как-то неправильно использую кастомные ограничители в валидаторе. Получается гораздо запутанней, чем если бы я написал свой класс валидатор. Стандартные ассерты, определенные аннотациями не работают, возможно из-за кастомного constraint validator. Я так понимаю, что нужно использовать для создания формы entity класс, но в форме всего 2-3 поля, а в классе их больше, к тому-же хочется проверять сразу класс, а не поля отдельно друг от друга. Я создал отдельные классы форм, это выглядит как костыль. По какой-то причине ошибки, выдаваемые валидатором при использовании метода getMessage() не имеют ключей и просто выдают месседжи об ошибке без привязки к полю объекта формы. Если тянуть ошибки из формы, то там их вообще нет. Я где-то накосячил и не пойму где.
В общем нужны советы и мб какието пояснения по коду. Про то, что нужно сделать бутстрап файл, я уже догадался. И возникла странная проблема: если поместить сонфиг подключения к бд в ини файл и сделать parse_ini_file, вставив значения в DoctrineServiceProvider(), то консоль не может подключиться к базе данных, хотя приложение ее видит и сайт работает.
Аноним 30/01/17 Пнд 18:29:33 #45 №922237 
>>922117
>mysql_connect, ни слова про ООП, html+php в одну кучу в 2k17
>неплохие практики
Это ты так пытаешься конкуренцию на рынке труда снизить?
Аноним 30/01/17 Пнд 19:11:33 #46 №922276 
Поясните за yii2, какие-нибудь годные ресурсы для изучения?
Аноним 30/01/17 Пнд 20:02:21 #47 №922351 
>>922237
kek. Если бы я нашел что-то лучше...
Просто того же Робина читал, у него вперемешку представление и код, тут хотя бы разделение, обрезание пробелов, что-то еще, что довольно неплохо. Нет ООП, да, это плохо, но хотя бы учат писать код правильно (до того места, где я дочитал).

Есть еще книга украинского программиста, но такое ощущение, что она писалась в разное время разными людьми, он более-менее кода, до вырвиглазного.
Из нормального мне понравилась только книга с рецептами, но там же не учат с нуля. Да и вообще актуальных книг не могу найти.
Аноним 30/01/17 Пнд 20:07:55 #48 №922357 DELETED
>>922276
Документация + исходный код (в коде Yii просто стены комментариев).

>>922034
JSDoc используется для генерации доков/api классов по коду:
http://www.yiiframework.com/doc-2.0/yii-widgets-activeform.html#validate()-detail
https://github.com/yiisoft/yii2/blob/master/framework/widgets/ActiveForm.php#L374
и для помощи IDE при анализе кода (помогаем IDE помочь нам).

> Разве он что-то сделает если туда передать допустим строку?
Это ведь просто комментарий. Многих людей не устраивает такая расхлябанность и они берут TypeScript/Flow. Первый похож на C#, второй подойдёт если просто хочешь добавить тайп-хинты.
Интересный доклад о важности типизации: https://www.youtube.com/watch?v=Ui8YfxzjaTY
Аноним 30/01/17 Пнд 20:40:30 #49 №922390 
>>922357

Значит стоит смириться и не ставить ифы для проверки типа переданных аргументов и выброса исключения?
Аноним 30/01/17 Пнд 21:27:11 #50 №922454 DELETED
>>922390
И тогда в функцию будет прилетать непонятно что и тебе самому сложнее будет с таким кодом работать.
И вопрос, что у тебя в ифах? Если проверка через typeof, то учитывай, что он выдаёт "object" для null и "number" для NaN. Такой уж язык, что даже для проверки типов нужно извращаться с toString.
Мне проще поставить Flow.
Аноним 30/01/17 Пнд 23:57:33 #51 №922684 
Дорогой ОП, сделал калькулятор - http://ideone.com/PBnVRM
Это первая задача (не считая самые базовые), которую сделал полностью сам, не подсматривая код вообще нигде. Приятное чувство )
Аноним 31/01/17 Втр 01:25:35 #52 №922738 
как же уничтожает мозг $ в имени переменных и отсутствие объявления. раньше писал на жс
все задачки переделываю раза по два, потому что по привычке ебашу var/let и без $, особенно в цикле фор.
Аноним 31/01/17 Втр 01:38:58 #53 №922743 
1332515058809[1].png
>>922738
> и отсутствие объявления
Это реально пиздец. Даже в древнем бейсике (Visual Basic 6 1998-го года) можно было включить режим обязательного объявления. А вот в PHP 2017-го года - нет. Воистину СЛАДКИЙ ХЛЕБУШЕК
Аноним 31/01/17 Втр 02:04:20 #54 №922753 
>>922738
>как же уничтожает мозг $ в имени переменных
>раньше писал на жс
>жс
Чья бы корова мычала.


>>922738
>отсутствие объявления
Объявления чего?
Аноним 31/01/17 Втр 02:19:40 #55 №922760 
>>922753

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

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

еще не очень нравится, что СКЛАДЫВАНИЕ строк происходит ТОЧКОЙ, но это уже хуй с ним.
язык как язык, не знаю, чому его критикой до уровня 1С опускают
Аноним 31/01/17 Втр 02:21:22 #56 №922761 
>>922753

и да, если ты подразумеваешь, что все жс-юзеры дрочат $$$$$$ в жквери, то ты ошибаешься. У нас там уже реакт, нода, и куча всего, чем успешный говнокодер может лепить говносайты и взламывать глаза и логику хороших кодеров.
Аноним 31/01/17 Втр 02:22:15 #57 №922762 
>>922760
потому что код превращается в этот самый хлебушек
Аноним 31/01/17 Втр 02:33:40 #58 №922764 
>>922762
я покушать принес:
http://uglycode.com/tag/php/
Аноним 31/01/17 Втр 02:41:19 #59 №922768 
>>922760
>Человеческого объявления переменных
>>php
$ti = 'loh';
>>js
var ti = 'loh';

>>с областями видимости и все такое.
Что с ними не так? По существу можешь сказать?

>>922762
>потому что код превращается в этот самый хлебушек
Это проблема программиста, а не языка.
Аноним 31/01/17 Втр 02:47:18 #60 №922770 
>>922768

for (let i = 0; i < array.length; i++) {}
for ($i = 0; $i < $length; $i++) {}
1. читабельно без $$$$, переменная i создается на время действие цикла и выгружается из памяти после его конца, есть отдельный метод, читающий длинну строки, массива, аллаха.
2. я очень люблю доллары, но тут они не настоящие, чтоб читать длинну массива, надо ее записать в переменную, либо делать огромное условие.

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

и да, foreach применяется не везде, так что .length - важная фича.
Аноним 31/01/17 Втр 02:49:40 #61 №922771 
>>922768

еще в пхп ругается интерпретатор, если я задаю переменную внутри чего-то, того же цикла. Надо как дебилу сначала до него написать $x = 0 или "".
Аноним 31/01/17 Втр 02:56:01 #62 №922773 
>>922770
> читабельно без $$$$
Исключительно вкусовщина.

>for ($i = 0; $i < count($array); $i++) {// переменная доступна только в теле цикла, после его завершения память освобождается.}

Проблемы?

> foreach применяется не везде
В php 99% это foreach.

>>922771
>еще в пхп ругается интерпретатор, если я задаю переменную внутри чего-то, того же цикла. Надо как дебилу сначала до него написать $x = 0 или "".
Шо? Это как?.





Аноним 31/01/17 Втр 03:04:26 #63 №922779 
>>922773

ну, типа я пишу тот де форич иии { $буква = значение... }, и потом смотрю, что это надо было вынести и поставить до начала функции.
В общем, забей, это просто мои барибухи с непривычки, вот и все.
Аноним 31/01/17 Втр 03:11:27 #64 №922781 
>>922779
Это не баг, а фитча.
Область видимости переменной не может выходить за рамки контекста в котором она определена.( локальные переменные )
Можно конечно продлить жизнь временным данным, но это уже другая история
Аноним 31/01/17 Втр 04:21:57 #65 №922793 
Есть что почитать клевое по паттернам и ооп? Пробовал Зандстру и дропнул как раз на той главе где начинаются шаблоны, тупо льет воду, не могу читать такое.

Мне надо не рассусоливать о том как круты паттерны проектирования, а что: вот есть у нас проблема, и вот смотри какой есть элегантный способ её решить, го расскажу!
Аноним 31/01/17 Втр 04:39:53 #66 №922795 
>>922793
Kristopher Wilson - The Clean Architecture in PHP
Аноним 31/01/17 Втр 05:44:17 #67 №922799 
>>922795
>Kristopher Wilson - The Clean Architecture in PHP
только на английском бывает?
Аноним 31/01/17 Втр 09:47:36 #68 №922856 
>Кевин Янк - PHP и MySQL. От новичка к профессионалу - 2013


Тут вместо mysql_connect ПДО.
Аноним 31/01/17 Втр 18:57:58 #69 №923235 
Опытные аноны, поясните: почему свойство-лямбду нельзя вызвать?

Типа такого кода:
> $obj = array('show' => function() { echo 'test'; });
> $obj = (object) $obj;
> $obj->show(); // кидает ошибку `Call to undefined method stdClass::show`
.

Зачем? Почему? Там ведь даже контекст не нужен (`$this` не используется), так почему в языке так нельзя?
Аноним 31/01/17 Втр 19:08:19 #70 №923261 DELETED
>>923235
Код странный, ты из руби? У нас тут не принято манкипатчить. Объявляй класс по-человечески, не нужно магии с конвертацией массива в объект.

Вот так будет работать (но не нужно этого делать): http://ideone.com/0RSDQP

сall_user_func это аналог call из JS, только без указания контекста.
Аноним 31/01/17 Втр 19:18:59 #71 №923274 
>>923261
>ты из руби?
Нет, из JS, лол.

>У нас тут не принято манкипатчить
Дык я не собирался.
Пришлось в коде конвертировать объект в массив, вспомнил о том, как когда-то давно с этим экспериментировал и как обнаружил эту странность. Решил спросить.

>сall_user_func
Ну так оно, по сути, работает уже с переданной лямбдой. Так не интересно.

Короче, как я понял, эта дрянь формируется где-то на уровне транслятора, а потом можно только "вызвать метод strClass::show в контексте объекта obj", но не "получить свойство show объекта obj и вызвать его".
Видимо, я мыслю слишком "по-JSному". Охуевал когда узнал, что, по сути, в PHP нет большой разницы между статичными методами и обычными.

В любом случае, лучей добра тебе ^_^
Аноним 31/01/17 Втр 19:37:52 #72 №923286 DELETED
>>923274
Ещё нужно учитывать как работает конвертация массива в объект: http://php.net/manual/en/language.types.object.php
> An array converts to an object with properties named by keys and corresponding values,

class stdClass#3 (1) {
__public $show =>
__class Closure#2 (0) {
__}
}

То есть тут мы видим, что нет метода show, есть только свойство со значением Closure. Поэтому PHP говорит всё верно.
Аноним 31/01/17 Втр 19:39:33 #73 №923288 
>>923286
Я об этом-же.
PHP позволяет
>"вызвать метод strClass::show в контексте объекта obj"
вместо
>"получить свойство show объекта obj и вызвать его"
. Хрен знает почему, но так, видимо, нужней. Ну и хуй с ним.
Аноним 31/01/17 Втр 20:25:46 #74 №923333 
Безымянный.png
При запуске скрипт показывает процесс импорта – номер позиции и количество использованной PHP-памяти. Когда количество памяти приближается к 350 Мб – импорт замедляется. Первые 11000 позиций обновляются приблизительно минут за 10-15. Затем доходит до 1 позиции за 3 секунды.

Анончик там лимит на оперативку и свопится начинает? Оперативки на сервере 8 гигов
Аноним 31/01/17 Втр 20:27:53 #75 №923336 
Анон, все мое программирование закончилось на первом курсе универа на паскале. В школе в блокноте писал какие то одностраничный примитивные сайты. И венец творения калькулятор, возводящий в степень и производящий выделения корня, написаный в паскале. И тут в 25 решил вкатиться в программирование. Собственно прочитал гайд и понял, что нужно пошагово как в гайде учиться.верно? И сильно я сосну с маком? Надо ли накатывать винду на него?
Аноним 31/01/17 Втр 20:29:45 #76 №923339 
>>923336
>Собственно прочитал гайд и понял, что нужно пошагово как в гайде учиться.верно?
Да.
>И сильно я сосну с маком? Надо ли накатывать винду на него?
С ним даже удобнее будет.
Аноним 31/01/17 Втр 22:49:02 #77 №923499 
Поясните кто-нибудь за побитовые операторы.
То есть смещается вправо или влево? Это про запятую, то есть было 1, стало 100?
Аноним 31/01/17 Втр 22:54:34 #78 №923502 
>>923499
Нет, это про биты.
Почитай об этом лучше в учебнике по JS: learn.javascript.ru/bitwise-operators - там намного лучше описано что это и где применяется, нежели в документации PHP.
Аноним 31/01/17 Втр 23:08:16 #79 №923513 
>>923333
Похоже здесь какие-то циклы разрастаются, в результате этот единственный процесс как было 90% процессорного времени занимал, так и сейчас занимает, но скорость обновления товара все сильнее падает. Анончик помоги это выше моего уровня

foreach($rows as $r => $row){

$i++;
if($i < 0) {
// continue;
}

print $r.' - '.round(memory_get_peak_usage()/1024/1024) . PHP_EOL;

$item = explode(';',$row);
foreach($item as $k=>$v){
$v = ltrim($v, '"');
$v = rtrim($v, '"');
$item[$k] = $v;
}
if(is_numeric($item[0])){
import_product($item);
}

$row = null;
$item = null;
}
Аноним 31/01/17 Втр 23:18:00 #80 №923519 
>>923513
Ну и что это за хуйня?
Аноним 01/02/17 Срд 00:01:23 #81 №923548 
>>923519
В общем путем расставления микротаймов выявил тормоз в левой функции, а конкретнее в этом участке,

if(!$product){
$product = commerce_product_new('product');
$product->status = '1';
$product->uid = '1';
$product->created = $product->changed = time();
$product->is_new = TRUE;
//print 'Creating new product!'.PHP_EOL;

}
Аноним 01/02/17 Срд 00:21:24 #82 №923565 
>>923548
> if(!$product){
Вот в этой суке. Что означает восклицательный знак? == "" ?
Аноним 01/02/17 Срд 00:30:20 #83 №923573 
>>923565
>>Что означает восклицательный знак?
ой, лооооооооооооооооооооол
Аноним 01/02/17 Срд 00:46:02 #84 №923578 
Безымянный32.png
>>923573
Вот какого хуя антош? какого хуя? Исполнение функции дальше не проходит! все стопается на этапе сравнения!
Аноним 01/02/17 Срд 02:19:13 #85 №923602 
>>923578
>стопается на этапе сравнения!
После какого сравнения?
Аноним 01/02/17 Срд 02:20:42 #86 №923604 
>>923602
UPD. Если у тебя $product - это строка, то выводится его длина и выполнение программы прекращается.
Аноним 01/02/17 Срд 02:20:43 #87 №923605 
>>923602
Уже нашел. Теперь ищу фукцию, она где-то в другом файле, в подключаемых нет
Аноним 01/02/17 Срд 02:21:49 #88 №923606 
>>923605
Сделай отступы и переходы строки нормальные, а то как долбоеб.
Аноним 01/02/17 Срд 11:26:12 #89 №923725 
Безымянный.png
В общем методом дедукции и расставлением микротаймов было выяснено, что скрипт в основном тратит время чтобы пройти участок кода return $controllers[$entity_type];

$entity_type - это commerce_product
$controllers[$entity_type]; - не содержит ничего
count ($controllers[$entity_type];) - не содержит ничего

Не знаю почему участок тормозит.
Вот вся цепочка которую я раскручивал:
---------------


function import_product($item){
$product = commerce_product_load_by_sku($item[14]);

----------------

function commerce_product_load_by_sku($sku) {
$start = microtime(true); //начало измерения
print "^^^^ 0 $start ";
$products = commerce_product_load_multiple(array(), array('sku' => $sku));

$end3 = microtime(true); //конец измерения
print "3 $end3 !!!";

return $products ? reset($products) : FALSE;
}

-----------------

function commerce_product_load_multiple($product_ids = array(), $conditions = array(), $reset = FALSE) {

$end2 = microtime(true); //конец измерения
print "2 $end2 !!!";


if (empty($product_ids) && empty($conditions)) {
return array();
}

return entity_load('commerce_product', $product_ids, $conditions, $reset);
}

-------------------

function entity_load($entity_type, $ids = FALSE, $conditions = array(), $reset = FALSE) {
$start = microtime(true); //начало измерения
print "^^^^ 5 $start ";
if ($reset) {
$end2 = microtime(true); //конец измерения
print "6 $end2 !!!";

entity_get_controller($entity_type)->resetCache();

$end3 = microtime(true); //конец измерения
print "7 $end3 !!!";
}

$end8 = microtime(true); //конец измерения
print "8 $end8 !!!";

return entity_get_controller($entity_type)->load($ids, $conditions);
}
Аноним 01/02/17 Срд 11:34:20 #90 №923730 
>>923725
> $controllers[$entity_type]; - не содержит ничего
Ошибся. Там единица. Сраная единица!
Аноним 01/02/17 Срд 11:36:56 #91 №923731 
Я только вкатываюсь в пхп, полностью с нуля. Мне вообще ничего не понятно. Это нормально ?
Аноним 01/02/17 Срд 12:07:56 #92 №923743 
>>923731
Нет, иди лучше кричать "свободная касса", там тебе понятней все будет.
Аноним 01/02/17 Срд 12:39:01 #93 №923762 
>>923743
Какой добряк, ты наверное на концертах Петросяна кричать любишь
Аноним 01/02/17 Срд 12:45:15 #94 №923769 
>>923731
Лучше спросить что непонятно, чем дожидаться поддержки здесь
Аноним 01/02/17 Срд 13:14:36 #95 №923779 
>>923762
Да, ухахатываюсь просто.
Аноним 01/02/17 Срд 13:53:47 #96 №923817 
API может быть сделано только посредством JS?
Аноним 01/02/17 Срд 14:10:44 #97 №923824 
>>923817

А ты вообще понимаешь, что такое API?
Аноним 01/02/17 Срд 14:26:37 #98 №923835 
>>923824
По своей сути это что-то что позволяет общаться друг с другом различным программам и не только...

Я точнее хотел спросить -API можно предоставить только посредством JS или есть ещё какие-то другие варианты?
Аноним 01/02/17 Срд 15:46:33 #99 №923894 
>>923835

API обычно это либо набор функций в библиотеке, либо (в случае веб-сервисов) набор URL, к которым можно обратиться. Яваскрипт тут вообще не при чем. Это можно делать на любом языке программирования.

Аноним 01/02/17 Срд 16:38:56 #100 №923921 
>>923835
>Я точнее хотел спросить -API можно предоставить только посредством JS или есть ещё какие-то другие варианты?
Твое API что должно делать? Ты знаешь различия между front end и back end? Твоему API нужны какие данные, которые необходимо формировать на стороне сервера?
Аноним 01/02/17 Срд 16:40:02 #101 №923922 
>>923731
Вообще ничего? Вот открыл книгу для самых новичков и с первой же страницы ничего не понял? Нет, это ненормально.
Аноним 01/02/17 Срд 16:42:30 #102 №923924 
>>923336
Я маки терпеть не могу, но стоит признать, что как ОС она в чем-то намного более прямая и правильная. Возможно, будут проблемы с выбором инструментария разного рода - на винде арсенал шире в разы.
Аноним 01/02/17 Срд 16:57:08 #103 №923937 
>>923924
вряд ли будут у него проблемы с этим, лол.
Все хорошие IDE и редакторы кода прекрасно там работают + есть терминал.
Аноним 01/02/17 Срд 18:17:43 #104 №923981 
Есть кто? Нужна помощь, я года 3 назад работал на пхп, всё забыл.
Аноним 01/02/17 Срд 19:03:42 #105 №924019 
>>923894
Сам себя запутал. Я видел пример как подключают js файл в шапке html документа по ссылке, и подумал что уже этот js файл взаимодействует с сервером где находиться этот файл.

Значит подключение API зависит от среды в которой его нужно подключить и каждая API это каждый отдельный случай?

Всё равно не понятно каким образом API взаимодействует с отдельным сервером.

Допустим я хочу воспользоваться API от сайта example.com на своем сайте mysite.org
Что должен предоставить сайт example.com чтобы предоставить свой функционал для моего сайта?

>(в случае веб-сервисов) набор URL, к которым можно обратиться
Этим пользуются с помощью html-тэга iframe? Есть ещё какие-нибудь варианты?

>>923921
У меня не какой-то конкретный случай. Пытаюсь разобраться как работает любое API.
Аноним 01/02/17 Срд 19:34:44 #106 №924046 
>>924019
Какие ЯП ты изучал/знаешь?
Аноним 01/02/17 Срд 19:55:07 #107 №924077 
>>924019

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

Если ты хочешь выполнять код в браузере пользователя то да, нужен яваскрипт (API тут не при чем, просто большинство браузеров поддерживают только JS). Если ты не ограничен браузером, то можно использовать любые языки.
Аноним 01/02/17 Срд 20:15:25 #108 №924085 
Дали тестовое - написать свой парсер для html тегов на пыхе. Что-то я залип на этой теме. Это же дохуя объёмна работа, не?
Аноним 01/02/17 Срд 20:29:22 #109 №924097 
>>924085
А что твой парсер делать в итоге должен то?
Аноним 01/02/17 Срд 20:32:56 #110 №924104 
>>924085
Смотря что подразумевается под "парсером для html тегов".
Аноним 01/02/17 Срд 20:40:45 #111 №924112 
>>924097
>>924104
типа считать теги на странице, которую ему дадут. Вроде реализуемо и даже прогресс есть, но я ебал такие тестовые делать для каждой вакансии, блядь (это не единственный вопрос, как вы, наверное, уже догадались)
Аноним 01/02/17 Срд 20:46:43 #112 №924117 
>>924112
>типа считать теги на странице, которую ему дадут.
Просто получить количество тегов на страничке? А какие-то требования были дополнительные? Ну потому что вроде тут из сложнго только подумать в каком виде представить базу данных с тегами. Я конечно не делал, но так вроде с помощью парочки регулярок и циклов можно сделать.
Аноним 01/02/17 Срд 20:49:20 #113 №924121 
>>924077
>А кто-то обращается к API
Но как можно обратиться к нему, если оно находиться на стороннем сервере? Как, например, посредством php получить доступ к функции, например, getAllPost(...) из этого API, которое находиться на другом сервере? Или как это делается. Я это понять не могу.
Аноним 01/02/17 Срд 20:51:52 #114 №924128 
>>924117
Это я как раз уже сделал, но из требований: оформить всё в правильный ООП, чтобы решение было расширяемым, мать его. Ну и всякие по мелочи отдать в виде xml и html (не понимаю, как можно отдать результаты поиска тегов в виде хтмл?) короче, не имея опыта с этой хуйнёй чувствую, что написал полное дерьмо
Аноним 01/02/17 Срд 20:57:33 #115 №924132 
Продолжаю изучать книгу
>Кевин Янк - PHP и MySQL. От новичка к профессионалу - 2013


Что хорошо:
пхп код отделен от HTML;
Рассказывают о том, данные от пользователя не безопасны;
Для полдключения к бд используется PDO, как им пользоваться, основные команды.
Например по книге делаем сборник анекдотов: создаем таблицы с шутками, авторами, у шуток есть категории. Все это вместе соединяем, создаем, редактируем и тому подобное.

В книге не разъясняется синтаксис html и css, азовые вещи скорее всего тоже пропущены, но я сам начал смотреть книгу где-то с 3 главы.

По беглому взгляду не нашел MVC, паттерны, продвинутое ООП и так далее.
Книга подойдет начинающим, если вы до этого что-то читали.



Аноним 01/02/17 Срд 20:59:45 #116 №924133 
>>924128
>оформить всё в правильный ООП
Ну тут хз конечно, но видимо они хотят что бы ты сделал так, что бы например каждый класс выполнял только одну роль и все такое.
>чтобы решение было расширяемым, мать его.
Это о том, что твой код должен быть простым и очевидным настолько, насколько это возможно без ущерба функциональности и стандартам.
>не понимаю, как можно отдать результаты поиска тегов в виде хтмл?
В смысле? Тебе список тегов надо вернуть в итоге? Ну так почитай как сохранять инфу в виде хмл.
Аноним 01/02/17 Срд 21:03:54 #117 №924135 
>>924133
Ну я правильно понимаю, что если мне надо вернуть список "тег" - "колво" в HTML формате, то я внутри php скрипта генерю html страницу в виду гигансткого string'a и в него в <table> загоняю свои значения? Или это не так делается?
Аноним 01/02/17 Срд 21:05:15 #118 №924136 
>>924135
и если правильно понимаю, то надо ли отдавать только <table>куча инфы</table> или надо отдавать строку аж с !DOCTYPE ?
Аноним 01/02/17 Срд 21:06:02 #119 №924138 
>>924135
Запости лучше саму задачу.
Аноним 01/02/17 Срд 21:09:56 #120 №924144 
>>924138
да не хотелось бы палить текст задачи, гуглиться же на раз будет, поймут сразу, что я на форуме для девочек ответы спрашивал
Аноним 01/02/17 Срд 21:33:54 #121 №924166 
>>919074 (OP)
Привет, аноны.
Какой лучше всего способ использовать для подключения к дб?
<?php
require_once 'login.php';
$conn = new mysqli($hn, $un, $pw, $db);
if ($conn->connect_error) die($conn->connect_error);
?>


Или $connect = mysqli_connect('localhost', 'root', '12345', 'mydb');
Вообще будет ли это юзаться где или же сразу надо копать какой-нибудь нетбим ОРМ?
Аноним 01/02/17 Срд 21:35:21 #122 №924168 
>>924166
Лучше юзай PDO.
Аноним 01/02/17 Срд 21:37:31 #123 №924170 
>>924168
>PDO
Есть какой самоучитель хороший или прямо http://phpfaq.ru/pdo тут начинать? Почему не стоит через ORM?
Аноним 01/02/17 Срд 21:37:59 #124 №924171 
>>924166
глянь книгу
>Кевин Янк - PHP и MySQL. От новичка к профессионалу - 2013

Тут расписано.
Аноним 01/02/17 Срд 21:38:33 #125 №924173 
>>924171
>Кевин Янк - PHP и MySQL
Благодарю, анон, сейчас гляну. Много книг смотрю и одна хуйня, ей богу
Аноним 01/02/17 Срд 21:43:02 #126 №924177 
>>924170
Причем тут ORM? ORM это уже архитектурные изыски. Ты явно путаешь это с драйвером БД. PDO это просто самая удобная на данный момент обвязка драйвера БД.
Аноним 01/02/17 Срд 21:54:10 #127 №924188 
>>924177
Как причем? Коннектиться с помощью орм, через её код, и всё, самое безопасное подключение с помощью ретбин настолько я знаю
Аноним 01/02/17 Срд 22:12:40 #128 №924203 
Аноны, тупой я, что значит этот -> оператор?
и die
Я так понял это что-то типа break?
Аноним 01/02/17 Срд 22:20:13 #129 №924207 
Поясните пожалуйста, зачем нужно делать отдельно файл для каждого класса если можно сделать библитеку и её инклудить? Помогите дауну
Аноним 01/02/17 Срд 22:25:31 #130 №924212 
>>924203
-> вызов свойства или метода объекта
а вообще php.net
Аноним 01/02/17 Срд 22:29:15 #131 №924215 
>>924188
Ты все таки хуиты где-то нахватался. Тот же mysqli это просто расширение для работы с бд в пхп, это еще не ORM в полном виде. ORM в целом это уже нечто посложнее, погугли что такое active record, data mapper и т.п, освоишь это а там уже до доктрины какой-нибудь дорастешь. Если же тебе интересно какое расширение лучше - сейчас почти все юзают пдо.
Аноним 01/02/17 Срд 22:40:19 #132 №924227 
Анончики, особенно кто делал задачу про файлообменник, возникла у меня проблемка, а именно - про сохранении файлов на сервер с кирилическими названиями вместо оных появляются кракозябры, т.е. понятное дело проблемы с кодировкой.
public function upload(\Slim\Http\UploadedFile $file)
{
$params = $this->getFileParams($file);
$file->moveTo($params['link']);
}
В парамсе у меня хранятся данные о файле, но не суть. Что интересно, кириличные имена файлов с помощью mb_detect_encoding() определяются как ютф-8, а латинца - асц2. Как решить проблему? В гугле все советуют не париться и латинизировать названия, но мне бы хотелось все таки сохранять в кирилице. Алсо в БД имена сохраняются как положено.
Аноним 01/02/17 Срд 23:09:49 #133 №924245 
>>924166
Юзай ООП.
Аноним 01/02/17 Срд 23:10:28 #134 №924246 
>>924203
>что значит этот -> оператор?
То же самое, что точка в псевдокоде.
Аноним 01/02/17 Срд 23:13:42 #135 №924249 
Аноны, не нашёл SQL-треда, поэтому пишу сюда. Не могу найти нормальную статью по этому вопросу.

>tinyint(1)
значит, что я могу хранить только 1 или 0 в этой колонке, или что могу хранить числа 0-9?

Логично было бы предположить, что 1/0, но всё-таки.
Аноним 01/02/17 Срд 23:21:35 #136 №924253 
>>924249
Можешь хранить числа в ренже -128..127. И ничего не спрашивай больше, храни просто и все.
Аноним 01/02/17 Срд 23:23:18 #137 №924256 
>>924253
Стоп, а если я напишу
>tinyint(3)
, например?
Аноним 01/02/17 Срд 23:31:31 #138 №924263 
Всё, уже разобрался. Параметр size нужен для всяких ZEROFILL.

>>924253
Спасибо :з

>>924256-кун
Аноним 02/02/17 Чтв 00:14:22 #139 №924306 
где взять опыт разработки проектов? начал изучать yii2
Аноним 02/02/17 Чтв 00:16:41 #140 №924308 
>>924306
сделать свой
Аноним 02/02/17 Чтв 01:21:07 #141 №924341 
Сап. Изучаю Symfony 3, хочу сделать магазин на нем для закрепления знаний.
Но так как мне немного лениво и от крудов тошнит, да и с php я хорошо знаком, писал уже на Yii, то реквестирую более-менее готовый каркас для создания магазинов или crm на симфони. Есть же, наверное, какой-то открытый компонент такой на гитхабе с базовым функционалом магазина? Чтобы можно было доделать его, добавить какую-то фичу по желанию, управление акциями, например.
Аноним 02/02/17 Чтв 01:55:49 #142 №924357 
>>924207
Так намного удобней код редактировать.
Аноним 02/02/17 Чтв 02:54:59 #143 №924374 
Screenshot from 2017-02-02 02-50-04.png
Я только что вкотился, поясните как сделать в нетбинсе, чтоб результат сразу показывало в браузере? В настройках выбираю пикрел, когда пытаюсь запустить, в браузере нихуя. Надо похапе установить или что? Если что я на убунте.
Аноним 02/02/17 Чтв 03:38:32 #144 №924385 
>>924341
Уебище, ты даже загуглить не в состоянии, какой crm???
Возьми cms и уебывай.
Аноним 02/02/17 Чтв 07:49:45 #145 №924424 
>>924121

А как по-твоему браузер загружает страницы? И как яваскрипт обращается к API на удаленном сервере?

Две программы, расположенные на разных компьютерах, могут установить сетевое соединение через Интернет и обмениваться данными. Обычно для соединения используют протокол TCP, поверх которого работает какой-нибудь высокоуровневый протокол вроде HTTP.

Вот пример АПИ, которое предоставляют Яндекс-карты (API геокодера). Оно позволяет определить по адресу координаты точки или наоборот: https://tech.yandex.ru/maps/doc/geocoder/desc/concepts/input_params-docpage/

Там в самом начале написано:

> Запрос к геокодеру представляет собой обращение по протоколу HTTPS к URL https://geocode-maps.yandex.ru/1.x/.

То есть необходимо установить сетевое соединение с узлом geocode-maps.yandex.ru и далее отправить по нему HTTPS-запрос.

Я тебе советую почитать про такие темы:

- протокол TCP/IP
- протокол HTTP
- сокеты (не вебсокеты, а сокеты Беркли)

Аноним 02/02/17 Чтв 08:00:53 #146 №924429 
>>924135

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

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

>>924203

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

Про die можно прочесть в мануале.

>>924227

> Что интересно, кириличные имена файлов с помощью mb_detect_encoding() определяются как ютф-8, а латинца - асц2.
Эта функция не работает и возвращает случайные значения. Почитай например мой урок про кодировки и сам поймешь, почему в принципе невозможно 100% точно определить кодировку (можно только угадывать с какой-то вероятностью): https://github.com/codedokode/pasta/blob/master/cs/strings.md

Насчет имен файлов - тут такая ситуация:

Имена файлов скорее всего приходят в $_FILES в той кодировке, которая исользовалась на HTML-странице. Насколько я знаю, браузер вообще все данные форм ($_POST, $_FILES) кодирует кодировкой страницы, где эта форма расположена. Данные в _GET - не уверен, то ли кодировкой страницы, то ли всегда utf-8

Функции работы с файлами вроде fopen, file_put_contents, move_uploaded_file принимают имена в той кодировке, которая определяется ОС и ее настройками:

- в Windows они принимают имена в 8-битной кодировке, зависящей от языка системы. Для русского языка это Windows-1251
- в Mac они принимают имена в utf-8
- в Linux имена файлов не имеют определенной кодировки. Но отображение имен файлов использует заданную в системе кодировку, как правило, это utf-8. То есть в linux скорее всего надо передавать имена в utf-8

Теперь у тебя есть понимание, как решить проблему?

Аноним 02/02/17 Чтв 08:30:41 #147 №924446 
>>924374

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

Разберись с тем, какие варианты есть. Если что, они тут на англ. описаны: https://netbeans.org/kb/docs/php/project-setup.html#runConfiguration

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

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

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

>>924341

Я знаю, что есть фреймворк Magento, но он не на Симфони.

>>924306

В ОП посте есть задачи на разработку файлообменника, сайта TestHub.

>>924249

Цифра задает рекомендуемую ширину колонки для вывода чисел. На хранение в базе данных это никак не влияет.

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

Вот офиц. мануал на англ, проясняющий этот вопрос:

- https://dev.mysql.com/doc/refman/5.7/en/integer-types.html
- https://dev.mysql.com/doc/refman/5.7/en/numeric-type-attributes.html

Обрати внимание, что для дробных чисел цифры в скобках имеют другой смысл:

- https://dev.mysql.com/doc/refman/5.7/en/floating-point-types.html
- https://dev.mysql.com/doc/refman/5.7/en/fixed-point-types.html

>>924253

Что значит "не спрашивай"? Как раз надо спрашивать, если что-то непонятно.

>>924188

Ты путаешь. Использование ORM никак не влияет на "безопасность" подключения.

>>924166

А ты понимаешь разницу между этими вариантами кода? У меня ощущение, что тебе рановато браться за базы данных и надо подучить сам язык.

>>924128

Проверяют, знаешь ли ты ООП.

>>924132

> Рассказывают о том, данные от пользователя не безопасны;
А что с этим делать и как решать эту проблему, рассказывают?

> В книге не разъясняется синтаксис html и css,
Предполагается что ты уже их знаешь.

>>924085

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

>>923981

Ну смотри сколько постов тут нафлудили. Конечно, есть.

>>923924

Ну не знаю, я использовал когда-то хакинтош и у меня осталось ощущение, что он тормозной. Конечно, может это из-за того, что это хакинтош, но у меня ощущение, что оно рассчитано на мощное железо и например на стареньком Core 2 duo с медленным HDD быстро не заработает. А Windows XP - заработает.

И там вроде до сих пор не научились раскрывать окна на весь экран?

>>923731

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

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

>>923725

Видимо, ты что-то считаешь неправильно. Также, надо учесть что под виндой точность функции microtime(true) составляет около 15 мс, то есть время может получиться либо 0 либо 15 мс, но не 1 или 2 мс например. И если ты попадешь на границу между 2 интервалами то вернется 15 мс даже если в реальности там было намного меньше.

Лучше бы использовать профайлинг в xdebug.

> return $controllers[$entity_type];
Если $controllers - это массив, то это мнговенно выполнится, но если это объект с магическими методами или ArrayAccess, то конечно возможны варианты.

Аноним 02/02/17 Чтв 08:40:58 #148 №924455 
>>923578

У тебя в коде ошибка. Переменная $size создается внутри блока if, но используется снаружи, и возможно, что она в некоторых случаях даже не создается (или выводится старое значение). То есть тебе стоило бы язык PHP подучить для начала.

>>923565

Открой мануал http://php.net/manual/ru/language.operators.logical.php

>>923513

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

>>923499

Битовые операторы работают с представление числа в двоичном виде (из нулей и единиц). Сдвигается именно число в двоичном представлении. Начни с изучения двоичной системы счисления:

- https://ru.wikipedia.org/wiki/%D0%94%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%B0%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F
- https://ru.wikipedia.org/wiki/%D0%91%D0%B8%D1%82%D0%BE%D0%B2%D1%8B%D0%B5_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8

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

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

Когда-то их еще использовали для оптимизации (сдвиг влево на 1 разряд равносилен умножению на 2, только выполнялся быстрее), но это неактуально для высокоуровневых языков вроде PHP/JS и не дает никакой выгоды.
Аноним 02/02/17 Чтв 08:54:27 #149 №924460 
>>923333

Проверить, свопится или нет, можно так:

- командами top, htop, free посмотреть сколько памяти используется в свопе, сколько свободно
- посмотреть процент использования CPU процессом - при своппинге он падает и становится намного меньше 100% (хотя это может быть вызвано и другими причинами: чтение файлов, ожидание данных из сети).

>>923235

Можно, только надо использовать синтаксис, не похожий на вызов метода:

$fn = $obj->fn;
$fn();

или ($fn->obj)();

То, что ты пишешь, $obj->fn() - это вызов метода fn, которого у тебя нет, отсюда ошибка.

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

>>923274

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

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

>>922793

Для ООП есть глава в нашем учебнике из ОП поста.

Для паттернов надо взять код, где они используются, например, компоненты Symfony Forms, Symfony Validation, Doctrine, и изучать их параллельно с паттернами. Так, просто в теории их изучать смысла нет.

>>922771

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

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

>>922770

Если ты хочешь тут поискать претензии к PHP, советую сразу брать статью https://habrahabr.ru/post/315152/

Ты к ерунде придираешься, а реальных проблем не видишь. Ну и в JS их не меньше, кстати. Чего стоит только отсутствие нормального ООП.

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

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

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

Аноним 02/02/17 Чтв 09:49:31 #150 №924484 
>>922684

Молодец, решено правильно.

>>922454

Справедливости ради, NaN это разновидность дробного числа в стандарте IEEE https://habrahabr.ru/post/112953/

>>922034

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

>>922390

Можно ставить, хуже не будет.

>>922276

Документация.

>>922138

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

Вот тут в документации, например, ограничения задаются статическим методом, а не аннотациями: http://symfony.com/doc/current/components/validator/metadata.html

А вот тут описывается, какие способ загрузки аннотаций есть: http://symfony.com/doc/current/components/validator/resources.html

Ты используешь AnnotationLoader?

Далее ты должен передать правильно настроенный Валидатор в FormFactoryBuilder как в примере тут: http://symfony.com/doc/current/components/form.html#validation

Я вижу, ты используешь SilexFormProvider. Выясни, как именно он настраивает компонент форм и валидатор.

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

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

Такая штука есть во всех фреймворках, в Юи например ограничения описываются массивом: https://yiiframework.com.ua/ru/doc/guide/2/input-validation/

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

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

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

Либо же разобраться с аннотациями и как-то брать описание формы из класса модели формы.

Также, ты вызываешь валидацию вручную через $this->validate(). Но формы интегрируются с валидатором и умеют сами его вызывать.

Что касается регистрации - регистрация это создание пользователя, и наверно, там в качестве модели для формы выгоднее использовать сразу модель пользователя, нет?

> Я так понимаю, что нужно использовать для создания формы entity класс, но в форме всего 2-3 поля, а в классе их больше, к тому-же хочется проверять сразу класс, а не поля отдельно друг от друга
Не обязательно. В самой Симфони форма может использовать в качестве модели массив, а не Entity. Или просто обычный класс, не связанный с доктриной. То есть там как раз все максимально гибко сделано. И ты можешь привязать и форму симфони, и валидацию к обычному классу или даже массиву.

Насчет этого: https://github.com/anotherCodeMunkey/fileshare/blob/master/App/Validator/ValidatorServiceProvider/LoginValidatorServiceProvider.php

Не очень понял, а зачем тут провайдер? Почему нельзя записать что-то в контейнер $app напрямую? Провайдеры обычно используют для каких-то библиотек, чтобы достаточно было добавить в прилоежние один провайдер и не надо было описывать инициализацию библиотеки, и каждый сервис из библиотеки прописывать в DI контейнер вручную. Но у тебя там всего один сервис и объявляется (validator.login), и он не универсальный, его нельзя использовать в другом приложении.

То есть как я понял, провайдер используется как этакий "мост" для простого подключения сторонней библиотеки в Silex.

В документации написано: http://silex.sensiolabs.org/doc/2.0/providers.html

> Providers allow the developer to reuse parts of an application into another one.

Вот видишь, "reuse parts of an application".

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

Насчет вот этого: https://github.com/anotherCodeMunkey/fileshare/blob/master/App/Validator/Constraints/LoginConstraintValidator.php

Я все же думаю, что это уже не задача формы - проверять логин. Задача формы:

- принять данные от пользователя
- проверить их на соответствие заданному формату и ограничениям

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

Должно быть примерно так:

if ($form->validate()) {
$email = $form->email;
$password = $form->password;

if (!validateEmail($email, $password)) {
$form->addViolation('неправильный логин или пароль');
}
}

Насчет этого: https://github.com/anotherCodeMunkey/fileshare/blob/master/App/Validator/Constraints/RegisterConstraint.php

Я думаю, тут должно быть 2 класса-ограничения: одно для проверки логина, другое для email. А может какое-то более уникальное ограничение для проверки уникальности любого поля. Так как по задумке Constraint - это одно ограничение, а не много.

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

if ($form->password == ...) {
$form->addViolation(..);
}

if ($model->email == ....) {
return new ValidationError(....);
}

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

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

- свой constraint
- использовать CallbackConstaint
- попробовать использовать события https://symfony.com/doc/current/form/events.html

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

Тут вообще HTML-код в контроллере вместо использования шаблона: https://github.com/anotherCodeMunkey/fileshare/blob/master/App/Controller/CommentController.php#L39

Я предлагаю для начала разобраться с формами, моделями и валидацией, а дальше посмотрим остальные проблемы в коде. Я тут написал много текста, так что уточняй, если что-то неясно.
Аноним 02/02/17 Чтв 09:59:39 #151 №924496 
>>921447

Я предлагал это как один из возможных вариантов. Если подумать, то логично как-то оптимизировать поиск объекта Cell по координатам, и тут есть варианты:

- хранить их в словаре вроде cells[y][x]
- хранить их в массиве в определенном порядке, чтобы их можно было найти по формуле вроде cells[y * columns + x]

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

Ну вот смотри, сколько тут опций:

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

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

Аноним 02/02/17 Чтв 10:04:41 #152 №924502 
>>924429
>Теперь у тебя есть понимание, как решить проблему?
Т.е. надо на стороне винды поменять кодировку?
Аноним 02/02/17 Чтв 10:28:23 #153 №924523 
>>924502

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

Вообще, конечно, это большая проблема. Ведь в русской версии винды используется одна 8-битная кодировка, а в американской - другая. Почему разработчики PHP не хотят использовать юникодные функции или хотя бы сделать дополнительные функции для юникода (в идеале для utf-8)? PHP формально кроссплатформенный, но от решения этой проблемы он самоустранился.
Аноним 02/02/17 Чтв 10:29:16 #154 №924525 
>>924446
>А что с этим делать и как решать эту проблему, рассказывают?

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

На странице данные выводятся через htmlspecialchars, с константами (потом пишется обертка для нее).
В mysql данные передаются через псевдо-переменные PDO
Аноним 02/02/17 Чтв 11:11:29 #155 №924545 
>>924523
>Проще подстроить приложение и для винды перекодировать имена в нужную ей кодировку. Для этого можно сделать слой совместимости, который скрывает эти особенности внутри.
Я нихуя не понял. И вообще, это в пхп работа с кодировками адов труд, или я слишком неофит?
Аноним 02/02/17 Чтв 11:54:05 #156 №924570 
>>924545

Вместо того, чтобы вызывать функцию вроде file_put_contents напрямую, сделай свою функцию, которая проверяет ОС и если надо, перекодировывает имя файла.
Аноним 02/02/17 Чтв 12:17:46 #157 №924586 
>>924424
Я догадывался что это выполняется посредством http-запроса, но мне не понятно как отправить его посредством, к примеру, php. Я видел как обрабатываются http запросы, но не разу не видел чтобы они отправлялись.

Хорошо знаком только с php.
Аноним 02/02/17 Чтв 12:43:29 #158 №924602 
мой код - http://pastebin.com/DuUKpSvz
код автора - http://pastebin.com/VJc7w0tp

страница управления авторами.
/admin/authors/
[Новый автор]
имя-фамилия [редактировать] [удалить]
Кнопка удалить работает.

Создать нового и редактировать - не работает.
При создании нового - переходит в admin/authors/?add
Открывается форма
label+input
[Добавить автора]

Ввожу данные, жму, попадаю на страницу admin/authors/addform
с ошибкой 404.

С редактированием аналогично, только переход на /editform

Код автора работает, книга Кевин Янк - PHP и MySQL. От новичка к профессионалу - 2013

7 глава.
Некоторые данные под себя делал, поэтому вариант скопировать код у автора не подходит, 3 раза прочитал, все нормально, не могу найти ошибки.
Аноним 02/02/17 Чтв 12:49:05 #159 №924607 
>>924602
у автора книги скрипт не перенаправляет на /addform или /editform
Аноним 02/02/17 Чтв 15:11:26 #160 №924676 
>>924306
>>924341

Не страдайте хуйней, напишите годную САМОСТОЯТЕЛЬНУЮ библиотеку и залейте ее на гитхаб. (генератор чартов, например)
Аноним 02/02/17 Чтв 15:51:10 #161 №924708 
Стикер
>>924602
Нашел баг.

Моих эмоцией не описать словами
Аноним 02/02/17 Чтв 17:49:49 #162 №924780 
14759586916270.gif
>>924484
>>Возможно, он рассчитан на использование совместно с аннотациями, тогда ведь получается проще? Или с каким-то конфигом, где описаны ограничения.
Да, в официальной документации приводятся примеры использования yaml конфига, как альтернатива аннотациям, но проблема в том, что я использую силекс, а не симфони и тут все не так, как в симфони. В сети не так уж много инфы по использованию некоторых модулей симфони с силексом. И хотя я не искал варианты использования yaml конфигов с силексом, в надежде на кастомные констранты, я пока не могу представить как это все будет выглядеть. Чем больше модулей симфони прикручивается к силексу, тем больше мне кажется, что он изначально не предназначался для этого.

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

>>То есть как я понял, провайдер используется как этакий "мост" для простого подключения сторонней библиотеки в Silex.
Да, это так. Я много гуглил этот вопрос и нагуглил то, что если я собираюсь использовать констранты с кастомным валидатором, ведь мне нужно впихнуть в валидатор entity manager, то мне придется зарегистрировать эти валидаторы как отдельный сервис.

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

>>Еще у тебя я вижу в коде стремление писать все в контроллерах и не использовать сервисы. Ну например, регистрация/авторизация/получение текущего пользователя - для этого нет готовых методов. Нет сервиса для работы с комментариями. То есть ты вместо MVC пишешь толстые контроллеры.
Что значит использовать сервисы? У тебя есть уроки использования или примеры таких сервисов?

Аноним 02/02/17 Чтв 18:54:37 #163 №924834 
>>919074 (OP)
Привет аноны.
Решил учить PHP, пока для себя, потом как получится. Несмотря на ококолоайтишную вышку, последний раз пытался погромировать в школе, на делфи.
Ну да ладно, делаю сейчас по вот этой ссылке - http://archive-ipq-co.narod.ru/, и такое чувство возникает странное, я вроде не совсем идиот, но в этих задачках больше сижу и думаю как как это реализовать в коде, а как хотя бы понять что вообще требуется и как бы я делал это допустим вручную. (например считал каждый месяц на калькуляторе в задачке про школьника). Я совсем конченый или еще нет? Что это? Проблема с воображением или что? С этим можно жить?
вот и задачка, мож кто посмотрит
http://ideone.com/TKF4VQ


Наверняка и тут хуйни понаписал, всмысле в посте.
Аноним 02/02/17 Чтв 18:59:07 #164 №924838 
>>924834
Ну я же говорил.

Пофиксил
> думаю не как это реализовать в коде
Аноним 02/02/17 Чтв 19:41:11 #165 №924874 
https://www.work.ua/jobs/2404619/
В копилку про забавные вакансии.
Аноним 02/02/17 Чтв 22:27:36 #166 №925011 
за день пролистал весь сайт ОПа на народе, вроде все более-менее разжевали и в рот положили, хотя некоторые задачки можно укоротить, если не читать начало решения.
Постарался еще сделать красивый вариант калькулятора. :З
http://ideone.com/q71hdO
интересная штука, оказалось, планирую прикрутить еще скобочки туда, а потом последовательность действий человеческую
Аноним 02/02/17 Чтв 22:40:05 #167 №925028 
>>924834
У меня вот так вышло.
http://image.prntscr.com/image/f9da8eaaa3ac4faeb6f9a9e7797a536f.png
Аноним 03/02/17 Птн 00:22:12 #168 №925109 
Объясните:

Я зеленый нуб, пошел качать php для Windows для обучения и увидел вот такое:

Thread Safe и Non Thread Safe.
Начал искать информацию о разницы, на русском ничего не нашел. На англ не понял, ибо база знань информатики желает быть лучше.

Прошу совета.
Аноним 03/02/17 Птн 00:26:12 #169 №925115 
И да, учиться по этому http://www.denwer.ru
Смысла нет?
Аноним 03/02/17 Птн 00:31:48 #170 №925120 
Может кто знает нормальный проект(репозиторий) на ларавел для ознакомления с фреймворком, чтобы поковырять и приступить к реальной работе на бирже? Буду благодарен
Аноним 03/02/17 Птн 00:39:35 #171 №925125 
>>925115
1. Там старый софт.
2. Помогать тебе если что то не будет там работать не будут. Т.к. Что там авторы намутили всем лень разбираться.

Если ты почитаешь ссыли из шапки, то там есть гайд от ОПа по установке PHP и прочее в Windows. Вообще, там есть все что нужно человеку для начала изучения. + Мы всегда поможем. Только учти, что тред медленный.
Аноним 03/02/17 Птн 00:54:13 #172 №925131 
>>925109

Для использования вместе с Апачом под виндой нужен ThreadSafe. Для использования без Апача или под линуксом можно и Non-Thread-Safe. Это поддержка многопоточности.
Аноним 03/02/17 Птн 00:54:15 #173 №925132 
>>925125
Да, я видел шапку и внимательно ее прочитал, но все равно туго доходило. В общем, я пока прохожу:
1. на этом сайте php https://www.codecademy.com/ - немного сложновато в понимании информации и поэтому сижу со словарем. Но, главный минус - это примитивные задания.
2. ну и скачал книжку PHPTheRightWay.
3. сервер скачал отсюда http://www.wampserver.com (вроде уже не старые технологии), или это плохая идея и мне таки лучше всего уже самому учиться ставить апачи, пхп, mysql?

чем-то манить работать в направлении back end.
Аноним 03/02/17 Птн 00:55:25 #174 №925136 
>>925120
https://github.com/laravel/laravel/graphs/contributors

>>925115
Йобаный буллшит. Просто поставь себе Linux и caddyserver.
Аноним 03/02/17 Птн 02:19:14 #175 №925165 
есть ли хороший и приятный гайд, где тебе разжевывают создание вебсервиса на похапе с нуля?
типа рейлс фор зомбиз. Там тебе и про руби, и про рейлс, и про архитектуру, а пока рассказывают, ты делаешь свой твиттер.
Большую часть книг и сайтов что я нашел можно выкинуть, т.к они втирают про сам язык и программирование, а я хочу про его применение в вебе - написать сайт с формами етц, опыт набивать короче.
Заранее спасибо большое. :3
Аноним 03/02/17 Птн 02:48:23 #176 №925172 
Кто-то из анонов может запостить свои проекты\проект?
Мне чисто из интереса.

\тот самый нуб-анон, который спрашивал про Thread Safe и Non Thread Safe, и про denwer\
Аноним 03/02/17 Птн 11:42:39 #177 №925277 
У меня одного на идеоне когда пишу строки русского текста каретка сдвигается в ебеня?
Аноним 03/02/17 Птн 12:49:18 #178 №925338 
>>925165
Веб-сервис это что у тебя? Сделай задачку про студентов, а там уже можешь аналог твиттора пробовать пилить.
Аноним 03/02/17 Птн 14:15:52 #179 №925387 
Извините, что беспокою.
Помогите, пожалуйста, понять этот эльфийский:
preg_match('/^['.$Line['text'][0].']{3,}[ ]([\w-]+)?[ ]$/', $Line['text'], $matches)

Я вот почитал статью: http://archive-ipq-co.narod.ru/l1/regexp.html и расшифровал фразу как-то так:
Ищется точное совпадение шаблона в строке $Line['text'] (символы ^ в начале и $ в конце строки). В начале ищется повторение три и больше раз строки, которая находится в $Line['text'][0]. Потом идет много пробелов. Потом идет строка из одного или нескольких буквенных символов, которые могут встретиться или не встретиться. Потом идет один или несколько пробелов
Аноним 03/02/17 Птн 14:17:56 #180 №925388 
AbuBaka.PNG
Абу съел звездочки. Спасибо, Абу.
Аноним 03/02/17 Птн 15:59:33 #181 №925461 
Сапер MVC. Оп, я правильно работаю со словарями? http://ideone.com/petHF7 Решил отказаться от объектов Cell. Теперь везде появился вложенный цикл, там где раньше был простой перебор массива с объектами, что меня смущает.
Аноним 03/02/17 Птн 16:23:55 #182 №925484 
>>925461

И еще, стоит ли писать вот такую обертку вокруг метода реализации чтобы не кидать каждый раз свойства объекта ему в аргументы http://ideone.com/Bom4oP ?
Аноним 03/02/17 Птн 17:38:54 #183 №925554 
Объясните мне на живом примере, где круто использовать switch-case. Spasibo.
Аноним 03/02/17 Птн 18:07:22 #184 №925572 DELETED
>>925165
Ну а применить знания из "рейлс фор зомбиз" в PHP нельзя? Там наверное рассказывают про HTTP, ну и в рельсах есть MVC, ActiveRecord, ServiceObjects. Всё это используется в PHP, просто открываешь доку по заинтересовавшему тебя фреймворку и пишешь приложение.

>>925387
Ты описал более-менее верно, только строка "пробел-звёздочка" значит не "один или несколько пробелов", а "произвольное количество пробелов, в том числе и отсутствие". Ну и сама регулярка написана странно, квадратные скобки означают "один из символов", потому в части "[ ]✱" эти скобки бессмысленны.

>>925388
Это не Абу, а язык разметки текста на бордах, существовавший ещё до сосача: http://noobtype.ru/wiki/Wakaba_mark

>>925277
У меня всё норм.

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

Аноним 03/02/17 Птн 18:13:19 #185 №925573 
>>925461
JS в пхптреде(9((9((9
Вложенный цикл - это норма.

>>925554
Там, где у тебя много if'ов получается.
Раньше в DLE так роутинг работал:
switch ($route) { case "/home": ....

>>925387
Я не понимаю, тебе за это платят? Попробуй доверить это дело regex101.com
Аноним 03/02/17 Птн 18:50:41 #186 №925605 
>>925338

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

>>925572
> Ну а применить знания из "рейлс фор зомбиз" в PHP нельзя? Там наверное рассказывают про HTTP, ну и в рельсах есть MVC, ActiveRecord, ServiceObjects. Всё это используется в PHP, просто открываешь доку по заинтересовавшему тебя фреймворку и пишешь приложение.

проблема в том, что я их не проходил, просто знаю, что там вот так, а не иначе. В серверном программировании я ноль полный.
Аноним 03/02/17 Птн 18:53:10 #187 №925607 
>>925554
я вот тут прикрутил, например. >>925011
Свитч повышает читаемость кода, а так можешь и ифы пихать.
Аноним 03/02/17 Птн 19:33:09 #188 №925646 
>>925607
Я что-то даже не понял, что твой код делает, а значить и не понял, почему там прикрутили switch-case. Можешь объяснить?

/я только, как 2 изучаю php/
Аноним 03/02/17 Птн 21:16:43 #189 №925772 
>>925484

Оп, а вот в этой строке здесь https://github.com/codedokode/pasta/blob/master/js/minesweeper-mvc.md :

> Тут есть 2 варианта, как это хранить: в виде 2-мерного массива, например this.openCells[y][x] = true помечает клеточку открытой ...

...ты имел ввиду действительно двумерный массив ([ [true, false], [false, false], [false, true], [true, false]) или словарь ( {1: {1: true, 2:false}, 2: {1: false, 2: false}, 3: {1:false, 2: true})? Мне кажется, ты имел ввиду первое, а я делаю через второе и в некоторых местах трудности (например мучаюсь как создать мины при такой структуре чтобы не было вечного рандома. Когда у меня был массив объектов Cell я просто делал на него shuffle и превращал в мины n-ое количество равное числу мин).
Аноним 04/02/17 Суб 00:15:47 #190 №925964 
>>925646

не хочу смущать тут всех своим вариантом, потому что я либо подскажу новичкам развернутое и полное решение, либо задурю им мозги. Напиши мне в телеграмм? Да и учить вместе веселее будет.@Kyooni
Аноним 04/02/17 Суб 07:28:21 #191 №926076 
Блин ребят , может кто ссылку кинуть на урок или гайд ?
Я просто вообще не вдупляю как пэхапэ в общем связывается в коде с html и как его туда вставлять
Аноним 04/02/17 Суб 07:31:38 #192 №926077 
Интересный пост для тех, кто изучает JS, о тонкостях и возможностях языка: https://m.habrahabr.ru/post/321078/

А вот еще интересный список, на который я наткнулся в сети: http://reestr.rublacklist.net/distributors/
Аноним 04/02/17 Суб 09:42:58 #193 №926132 
>>919074 (OP)
Посоветуйте пожалуйста книжку почитать, желательно современную, но на русише.
В программировании не новичок, с php уже дело имел, сейчас нужно все это вспомнить.
someApprentice 04/02/17 Суб 10:12:11 #194 №926153 
>>926077
Картинка в посте очень правдоподобная :>
someApprentice 04/02/17 Суб 12:27:43 #195 №926219 
>>916131
>Тут (англ) есть сложные пояснения: http://dev.mysql.com/doc/refman/5.7/en/charset-unicode-sets.html
>Тут немного на русском: http://gahcep.github.io/blog/2013/01/05/mysql-utf8/
А какие проблемы могут решить эти пояснения?

>https://github.com/someApprentice/Students/blob/master/app/init.php#L10
>> use App\Model\Helper\LoginHelper;
>> use App\Model\Helper\LoginHelper as Authorizer;
>Тут зачем-то класс 2 раза импортирован
Хотел задать пространство имен для ЛогинХелпера. Ведь это же и Авторайзер в то же время.

>https://github.com/someApprentice/Students/blob/master/app/Controller/Controller.php
>Вот тут конечно методы вроде getPageQuery или getSortQuery явно не очень правильно смотрятся. Ведь это базовый контроллер, и в него надо класть только то, что может пригодиться в любом контроллере, а это явно функции для вывода таблицы постранично. Возможно, стоило их поместить в унаследованный класс BaseTableController, возможно - вынести в Helper. В принципе, это исправлять не надо, но в дальнейшем надо задумываться, куда лучше поместить метод.
А я спрашивал насчет этих методов. Конечно, сейчас мне очевидно, что по-хорошему нужно сделать какой-нибудь дочерний контроллер для этих методов. Переносить их в Хелпер - плохая идея потому, что хелпер это модель, и заниматься GET-запросами должны контроллеры.

>Действия Search и просто вывод таблицы стоило бы объединить. Это ведь почти одно и то же, и там и там есть и сортировка, и пагинация, проще использовать один код и в нужных местах просто поставить пару if.
Не совсем понимаю как это сделать - согласен, и там и там есть общий код, но он минимален, и ведет себя как свойственно контроллеру:
1. получаем запросы\конфигурацию.
2. создаем паджер, обращаемся к БД.
3. выводим шаблон

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


>https://github.com/someApprentice/Students/blob/master/app/Controller/SearchAction.php#L19
>> if ($_GET) {
>Я бы не советовал так проверять, так как в теории в GET могут быть какие-то неотносящиеся к поиску параметры (их могут добавить позже). Лучше проверять, например, что $_GET['query'] не пуст.
А если пользователю захочется найти всех пользователей, т.е. сделать пустой запрос? Или, например, я хочу объеденить способ получения всех записей и поиска, передавая в метод тот же пустой запрос? Или, например, я хочу объеденить методы получения всех записей и поиска, опять же отправляя пустой запрос?
Обязательно ли вообще делать проверку на гет-запрос?

https://github.com/someApprentice/Students/commit/25476b949c720cc75eb8b3c8f03edb0b827ae196#diff-f2d1af9c4ccbbb1fb81e9cd1a194f5e3L19

>> $this->render('templates/search.phtml', compact('query', 'pager'));
>> } else {
>> $this->render('templates/search.phtml');
>Вот это тоже странно. Один и тот же шаблон может вызываться как с переменными, так и без. Как писать надежный код, если ты даже не знаешь, передана такая переменная или нет? Да и неудобно, перед любым использованием переменной надо писать if (isset()). Не стоит так делать, тут стоит оставить единственный вызов render, в который передаются все нужные переменные.
А как выводить один и тот же шаблон если к странице могут обратиться и без запроса? Этих переменных просто может не быть, потому что в них нету пока надобности.

>Теперь посмотрим на использование класса Pager. Это класс, в котором много неудачных решений:
>
>Во-вторых, почему-то для передачи аргументов в конструктор используется массив. Причем вместе идут как параметры, которые не зависят от номера страницы (query, sort), так и номер текущей страницы. Тоже нелогично, мне кажется, что номер страницы должен идти отдельно.
>Опять же, если мы хотим использовать класс, то неочевидно, что за массив надо ему передать, и что в нем должно быть.
Это не просто массив а массив запросов - $queries. По моему, по названии перемной должно быть понятно что это запросы. Я использовал такой подход в попытке сразу передать этот массив в метод http_build_query($queries) на практике ничего не получилось и, к тому же, не всегда известно какие запросы понадобиться передать ещё для формирования ссылок.
someApprentice 04/02/17 Суб 12:28:19 #196 №926220 
>>916132
>https://github.com/someApprentice/Students/blob/master/templates/index.phtml#L10
>> <a href="logout.php?token=<?= $token ?>&go=/public/index.php">logout?</a>
>LogOut лучше бы делать отправкой POST-запроса (например, пустой формы с одной кнопкой). Это ведь изменяет состояние залогиненности, а GET запросы обычно не меняют состояние сервера.
А я спрашивал почему в популярных соц.сетях разлогинивание сделано через форму.

Нужно делать сущность LogoutForm со всеми вытекающими для этого?

Есть какой-нибудь css хинт чтобы форма с кнопкой выглядела как ссылка или как любой другой элемент?

>Это ведь изменяет состояние залогиненности, а GET запросы обычно не меняют состояние сервера.
А можно по подробней на этот моменте? Чем POST-запросы лучше GET-запросов? Ведь по сути они оба просто массивы.
И как разлогинивание меняет сосотяние сервера? Мы же не используем локальные кукисы и не добавляем ничего нового например в БД.


>Могу предложить посмотреть вот такую реализацию класса авторизации: https://github.com/kubk/students/blob/master/src/AuthService.php
https://github.com/kubk/students/blob/11bc17f3b87e48f04cebc2715dd415af89d2332b/src/AuthService.php
Там на Симфони написано - сложно определить в чём кардинальное различие. Подозреваю что там то же устройство, только другая технология. Можно подсказку на что мне нужно обратить внимание?

>use Symfony\Component\HttpFoundation\{ParameterBag, Cookie, ResponseHeaderBag};
Что означает тут синтаксис в литералах? Это перечисление разных классов в одной и той же директории?

>public function registerStudent(Student $student): Student
И тут, что означает : Student в объявлении функции?

Мне нравиться такой код. Я тоже научусь пользоваться фреймворками.

>К нему даже написан тест, который проверяет например, что если вызват метод залогинивания, получить куки и скормить их этому классу, то мы получим нужного пользователя:
У меня тоже можно написать такой тест, у меня есть функция которая возвращает пользователя по кукисам: https://github.com/someApprentice/Students/blob/master/app/Model/Helper/LoginHelper.php#L16


>Далее, тут https://github.com/someApprentice/Students/blob/master/app/Controller/RegisterAction.php#L58 мы не завершаем контроллер после редиректа.
Про это я тоже спрашивал. Мне сразу показалось не естественно делать ридерект по серди класса, к тому же, как вы тогда ответили, нет смысла что-то делать после ридеректа. Нужно выполнить exit()\die() после него? Не совсем понимаю как правильно завершить работу контроллера.

>https://github.com/someApprentice/Students/blob/master/app/Model/Validators/StudentValidations.php
>Константы вроде const GENDER_MALE = "Man"; логичнее поместить в студента. Это ведь его свойства, а не свойства валидатора. В валидатор можно поместить константы вроде VALIDATE_MIN_LENGTH, относящиеся к валидации. Представь, что нам не нужна валидация и мы удалим этот класс. И вместе с ним удалятся константы, обозначающие пол, хотя они-то нам еще нужны.
А класс валидации не присваивает эти значения. Присваивает форма. Класс валидации только проверяет что значения правильные, и это его задача знать внутреннее устройство или механику проверки.

>https://github.com/someApprentice/Students/blob/master/app/Model/Validators/RegisterStudentFormValidations.php
>А интересно, почему здесь StudentValidations передается как зависимость, а не наследуется? По идее ведь RegisterFormValiadtions мог бы расширять StudentValidations, или это неудобно?
Нет, вы правы. Это ошибка.
Просто на тот момент казалось, что это разные сущности и не могут наследоваться друг от друга.


>И тут получается похожий код:
>
>- https://github.com/someApprentice/Students/blob/master/app/Model/Validators/RegisterStudentFormValidations.php#L32
>- https://github.com/someApprentice/Students/blob/master/app/Model/Validators/StudentValidations.php#L58
>
>Может стоит сделать метод validateByRules($entity, $rules, $errorList) в базовом классе?
А может не нужно придумывать такую сложную функцию в таком маленьком задании? Я могу придумать её, только это сложно будет и отнимет временя и силы. Такая головоломка меня вряд ли чему-то научит.
Может даже функция не сложная, но не хочется даже думать как её сделать.

>Хотя, конечно, не очень понятно, как тогда там вставить код, меняющий правила проверки пароля:
Мне вообще кажется, что смена пароля должна осуществляться отдельно.


https://github.com/someApprentice/Students/blob/master/app/Controller/Controller.php#L11
Это ошибка отправлять пустую строку если нет запроса? А если бы это было отдельный случай к примеру получение запроса поиска?


https://github.com/someApprentice/Students/


>Ну и дальше стоит начинать изучать фреймворки, хотя бы микрофреймворки для начала, так как тут мы писали все с нуля, и на практике конечно эффективнее учиться использовать готовый код. Также потом стоит глянуть шаблонизатор twig и, может быть, библиотеку-data mapper для работы с БД под названием Doctrine.
Не терпиться уже начать!

>Doctrine
Даже после прочтения сложных определений в гугле не до конца понимают что это такое. Оно заменяет Mysql или любую другу БД?


....

Это нормально отвлекаться на постороние вещи во время изучения? Хоть я и настроен на продуктивную работу, всё равно, сложно сконцентрироваться на каком-то сложном вопросе. Я подумал, что мозг может работать в пассивном режиме, например, как ты когда что-то пытаешься вспомнить, и это потом сомо, через какое-то время, вспыхивает у тебя в голове. Ведь, в конце концов я самостоятельно решаю этот вопрос.
С этим всё нормально? Я хорошо справляюсь?
Аноним 04/02/17 Суб 12:52:29 #197 №926233 
elePHPant[1].jpg
>>919074 (OP)
К чему эти коты в шапке, весь все знают, кто является настоящим маскотом языка PHP.
Аноним 04/02/17 Суб 13:34:22 #198 №926254 
190dfd858a9a1687e93362ed996002eb.jpg
>>926233
Аноним 04/02/17 Суб 13:36:53 #199 №926256 
Аноны, помогите правильно вкатится в PHP и стать junior.
21 с лишним хромолет. Есть высокий интерес к этому, но даже школьного курса информатики не помню, могу только шиндовс переустановить и по интернету полазить. С чего начать и через какой срок уже можно начать парится макакой. Мамка гонит, тем не менее время есть и желание тоже. Сильно не обоссывайте. В шапке хорошая инфа, но мне хочется, чтобы аноны поделились со своим опытом, с чего начинать
Аноним 04/02/17 Суб 13:39:17 #200 №926260 
1485585639667.jpg
>>926256
>хромолет
Аноним 04/02/17 Суб 13:52:02 #201 №926267 
1[1].png
>>926256
Аноним 04/02/17 Суб 16:23:22 #202 №926346 
Сделал тут пару задачек на ООП. Посмотрите, плз, как оно ?
http://ideone.com/qRGcXB - Компания Вектор.

http://ideone.com/WeGENR - Вопросы с абстрактными классами.
Аноним 04/02/17 Суб 17:06:14 #203 №926381 
Посмотрите, пожалуйста, как сделал задания. Заранее благодарю)

http://ideone.com/9wsu8g - Игра в кубики;
http://ideone.com/sRvu3e - мини "калькулятор";
http://ideone.com/8x1TeV - Игра в кубики с Пекой;
http://ideone.com/pJ4TO8 - Пхп без смс;
http://ideone.com/8GN4S3 - депозит;
http://ideone.com/O7tPEA - Айфон в кредит;
http://ideone.com/7SJzev - Задание со стихами;
http://ideone.com/MGrQkg - Регулярка на номера телефонов
Аноним 04/02/17 Суб 18:54:56 #204 №926446 
>>926381
Ебать, спасибо тебе за эти задания с циклом, ибо я чёт никак не мог вдуплить как оно работает, а теперь дошло.
Аноним 04/02/17 Суб 19:21:44 #205 №926464 
>>926381
В депозитах поменяй переменную возраста с 1 на 16
Аноним 04/02/17 Суб 19:48:54 #206 №926491 
>>926464
Я даун и не так понял задания, лол.
Аноним 04/02/17 Суб 20:40:02 #207 №926534 DELETED
>>926220
>>use Symfony\Component\HttpFoundation\{ParameterBag, Cookie, ResponseHeaderBag};
> Что означает тут синтаксис в литералах? Это перечисление разных классов в одной и той же директории?
В одном и том же пространстве имён. Так чуть точнее, потому что в PHP классы с разными пространствами имён могут находиться не то, что в одной директории, но и в одном файле: https://secure.php.net/manual/en/language.namespaces.php#118554

>>public function registerStudent(Student $student): Student
> И тут, что означает : Student в объявлении функции?
Тайп-хинт для возвращаемого значения метода.
Обо всём этом написано тут: https://secure.php.net/manual/en/migration70.new-features.php

Кстати, в этом году выйдут новые версии Laravel и Symfony, которые будут требовать PHP 7 и выше: https://murze.be/2016/12/laravel-5-5-will-require-php-7-0/
А новый PHPUnit уже требует PHP 7: https://github.com/sebastianbergmann/phpunit/blob/master/composer.json#L23
Аноним 04/02/17 Суб 21:56:13 #208 №926597 
Screenshot9.png
пытаюсь начать программировать на похапе так, как это задумывалось, а не только решать задачки.
Научился выводить скрипт на страницу и отправлять запросы в бд(MySQL) + немного работы через PhpMyAdmin.
Стоит ли мне сразу вскочить на фреймворк и набегать на создание сайтов, обмазываясь гайдами, т.е поступать в стиле руби он рейлс или надо сначала осознать как это все делать на чистом пхп, итд?
посмотрел тут решение задачки про студентов, охуел от количества файлов. Без фреймворков можно с ума сойти же.
Аноним 04/02/17 Суб 22:02:19 #209 №926603 
>>926597
Когда перейдешь к фреймворкам после задач, то понимаешь, что все твои решения задач это корявые велосипеды и в реальной разработке не нужны. Но они учат понимать язык и его возможности.
Аноним 04/02/17 Суб 22:04:17 #210 №926604 
>>92659>>926597
нужно знать как работает инструмент, чтобы им пользоваться.
сначала сделай сам, потом можешь юзать фреймворки
someApprentice 04/02/17 Суб 22:10:00 #211 №926609 
>>926534
Весьма исчерпывающие ответы - спасибо!

>PHP 7
У меня уже давно phpfmt выдает ошибку на старую версию - из-за чего везде на гитхабе у меня съежает оформление кода, потому что раньше для отступов я использовал символ табуляции (т.к. это стояло по умолчанию в настройках sublimetext): https://github.com/someApprentice/Students/blob/master/app/Controller/Controller.php

Аноним 04/02/17 Суб 22:12:33 #212 №926613 
>>926604
Ради фана или развития может быть, а по факту обычному разработчику этого знать не надо.
Тебе совершенно не надо знать как работает мешалка массива, когда тебе его тупо надо перемешать.
Или тебе должно быть похер как отправляются данные в БД, твоя задача лишь знать куда и что отправляешь, а как уже оно там будет работать тебе должно быть чхать, если оно правильно работает.
Аноним 04/02/17 Суб 22:51:14 #213 №926644 
tyomnyj-omich110622717orig[1].jpg
>>926613
Кек, представил, если бы врачи работали по таким принципам:

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

Хотел порофлить но так походу в 95% случаях и происходит, лол

(No offence)
Аноним 04/02/17 Суб 23:02:15 #214 №926651 
>>926604

но ведь создавая с десяток MVC компонентов самостоятельно я убью неделю на то, что требует часа с фреймворком. Плюс, я могу просто посмотреть что создает именяет то или иное мое действие, и точно так же разобраться.
Ну и я не имею ввиду, что я просто научился писать if else и сразу ВБОЙ ЕБАНА. Я почитаю самые основы этой ебони, а дальше фреймворки.

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

>>926644

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


В общем, вы меня вдохновили на почитать основы, как минимум.
Подскажите еще, пожалуйста, какой фреймворк актуален в сфере зарабатывания денег при выполнении работы рабодниками на работе?
я так понимаю, что йии2 и симфони2 сейчас топовые, но который из них?
Аноним 04/02/17 Суб 23:02:18 #215 №926652 
>>926597
а что сложного в том, чтобы сделать на чистом пхп? никто же не заставляет нуба сразу все это на МВЦ ООП хуярить (хотя было бы неплохо)
Аноним 04/02/17 Суб 23:16:45 #216 №926669 
>>926652

то, что на MVC это логически проще, что ли. Ну или это потому что я уже почитал про мвц, а про то, как это сделать на чистом пхп я не могу сообразить, потому что в сети мало толковой информации про такое.
Ну и потому что это будет некрасивым, медленным велосипедом. Так то, я могу тебе и на реакте сейчас написать сайт со всем этим и уместить в одном index.js, но это будте жутко уродливо.
Аноним 04/02/17 Суб 23:18:19 #217 №926674 
>>924460
>Разница есть
Тогда почему обычный метод можно вызвать статический через ::, а статический обычным -> ?
Аноним 04/02/17 Суб 23:19:11 #218 №926675 
>>925772

Вопросы все еще по MVC саперу. А вот в какой-то момент я буду тестировать несколько domView, а там на html странице будут повторяющиеся id. От id в шаблонах наверное вообще отказаться тогда и заменить на классы?
Аноним 04/02/17 Суб 23:23:42 #219 №926684 
>>926669
>про то, как это сделать на чистом пхп я не могу сообразить
1) У тебя не должно быть глобальных переменных;
2) Только функции, принимающие данные на вход и бросающие в ответ изменённые данные;
3) Функции эти надо собрать в пространства имён, в виде дерева, а данные — в классы;
4) На вход им передавать другие функции, создавая таким образом композицiю их;
5) Логи и сообщения не должны оставаться всю ночь до утра;
6) Интерфейсы программ твоих приноси в дом господа, бога твоего;
7) Не еби TCP-сокет в контексте окружения его.
Аноним 05/02/17 Вск 00:12:17 #220 №926725 
>>919074 (OP)
Аноны, почему не пашет у меня
https://github.com/codedokode/pasta/blob/master/soft/web-server.md

>Чтобы веб-сервер использовал скрипт маршрутизации, его надо запускать такой командой:

>php -S localost:9001 router.php

Запускаю не из цмд, а с опенсервера. Создал отдельные файлы, всё как надо, в результате нихуя!
Аноним 05/02/17 Вск 00:19:39 #221 №926730 
>>926669
хоспаде, туториал погугли (мвц на пхп), просто берешь и повторяешь. вообще умение хуярить мвц на чистом пхп - оно и не нужно по сути. Возьми фреймворк. А можешь даже попробовать взять цмску и поправить ее мвц код под свои нужды, у тебя сразу будет рабочий вариант с красивой админкой - такие задачи чаще всего и встречаются в рабоче пхпшника. Но перед этим лучше ООП поучить, про паттерны занстра, pdo почитать, а то с ходу в коде цмски не разберешься.
Аноним 05/02/17 Вск 00:48:03 #222 №926747 
>>926725

создай index.php, в нем скинь

$router = new Router();
$router->run();

в файле router.php опиши класс Роутер и его функционал через публичную функцию run(), и не надо пердолить сервер командами
Аноним 05/02/17 Вск 00:50:22 #223 №926748 
>>926747

забыл, в индексе еще ж надо файл запросить.

define('ROOT', dirname(__FILE__));
require_once(ROOT.'/components/router.php');
Аноним 05/02/17 Вск 00:54:33 #224 №926751 
>>926730
Что за хуйню ты ему втираешь?
Что значит "чистое пхп"? Как правило имеется ввиду отсутствие фремфорка.
ООП вообще часть языка блять.
А вот мвц это всего лишь патер, пусть пользует, хорошо и полезно.
Аноним 05/02/17 Вск 00:56:43 #225 №926753 
>>926751
>Как правило имеется ввиду отсутствие фремфорка
Как правило имеется в виду, что PHP сам себе сервер - без всяких Апачей.
Аноним 05/02/17 Вск 01:03:00 #226 №926755 
14843727450250.jpg
>>926747
Благодарю, анон, сейчас попробую
Аноним 05/02/17 Вск 01:09:54 #227 №926760 
>>926651
В фреймворках бывают недостатки и неудачные решения.
Например, в команде Yii есть какой то любитель пользовать указатели, что в пхп имхо не нужно вообще, и из за этого была большая ошибка в их RBAC модуле.

Возможности фремворка это расширение возможностей ПХП и не зная толком ПХП можно просто не понять или упустить многие возможности фреймворка.
>велосипед для нестандартного случая
Не для всех общих случае есть готовые хорошие решения, что говорить про нестандартные.
Вот хорошая статья на тему http://www.habrahabr.net/thread/1716

>мрт - тот же фреймворк
Плохой пример.
Мрт и врач это, как программист и монитор.

>Подскажите еще, пожалуйста, какой фреймворк актуален в сфере
Yii проще и популярнее в СНГ, Symfony сложнее, но вроде как более грамотно сделан.
Там еще кажется Symfony3 вышел, но я его не смотрел.
Аноним 05/02/17 Вск 01:22:39 #228 №926769 
>>926748
>в файле router.php опиши класс Роутер и его функционал через публичную функцию run()
Окей, а как это сделать?
Аноним 05/02/17 Вск 02:24:43 #229 №926829 
asd.jpg
Аноны, как сделать так, чтобы после обновления страницы сбрасывались значения передаваемые через гет? А то вот так вот выходит всё.
И почему echo $_SERVER['HTTP_USER_AGENT'];
Показывает почему-то не мой браузер, а несколько штук?
Аноним 05/02/17 Вск 02:45:05 #230 №926842 
>>926829
>страницы сбрасывались значения передаваемые через гет

На PHP никак, кажется

>несколько штук
У тебя хром
http://webaim.org/blog/user-agent-string-history/
Аноним 05/02/17 Вск 02:49:09 #231 №926844 
>>926842
>На PHP никак, кажется
Да, ошибся.
Так можно: http://php.net/manual/ru/function.header.php
Аноним 05/02/17 Вск 02:53:31 #232 №926847 
>>926842
> and the user agent string was a complete mess, and near useless, and everyone pretended to be everyone else, and confusion abounded.
Именно так и вижу этот список.
Мельком прочитал эту новеллу, но все-таки как быстро узнавать какой браузер?
Аноним 05/02/17 Вск 02:55:02 #233 №926851 
a5P77k7n5RA.jpg
>>926844
Благодарю, анон-с
Аноним 05/02/17 Вск 10:04:52 #234 №926910 
кривой цикл.png
Подскажите криворукому, что не так ?
Аноним 05/02/17 Вск 10:10:01 #235 №926912 
>>926910
$y вычисляется один раз, перед входом в цикл
Аноним 05/02/17 Вск 10:12:33 #236 №926913 
Так как js тред умер напишу тут. Есть у меня в общем фронтэнд сторона, где есть форма и в ней генерятся разные поля, и это все потом отправляется php скрипту для обработки. Есть там поле с загрузкой нескольких изображений, надо что бы после загрузки юзер мог видеть то, что загрузил и менять порядок картинок, есть ли какая либа готовая под это дело? И в каком формате отправлять лучше на серв, если у меня там и картинки и текстовые поля в одной форме?
Аноним 05/02/17 Вск 10:21:46 #237 №926916 
>>926912
понял, спасибо
Аноним 05/02/17 Вск 12:38:47 #238 №926986 
анончики, нужна помощь в php по интернет магазину на yii, если есть такие молодцы, то вброшу вводные
Аноним 05/02/17 Вск 15:50:45 #239 №927086 
Сап, пыхыпышники. Что нужно знать в JS для PHP разраба?
Аноним 05/02/17 Вск 15:51:32 #240 №927087 
rfefd4.jpg
Wgifef4Cc.jpg
Аноним 05/02/17 Вск 15:55:51 #241 №927089 
Поигрался я с ideone, установил phpstorm, в общем когда он открывает браузер там error502, как в таком случае поступают настоящие гуру пхп? Нужно установить веб сервер? А какой? Денвер?
Аноним 05/02/17 Вск 16:00:08 #242 №927093 
>>927089
Да. Денвер прост для установки, полно гайдов:
http://www.denwer.ru
http://www.denwer.ru/base.html

А вообще заимей хост, так проще.
Аноним 05/02/17 Вск 16:05:35 #243 №927098 
>>927093
Чому проще? Можно его заиметь бесплатно без регистрации и смс?
Аноним 05/02/17 Вск 16:09:51 #244 №927102 
>>927098
Бесплатно - вряд-ли.
Обычно 100 р. за месяц.

А так - Денвер проще,
Аноним 05/02/17 Вск 16:14:34 #245 №927107 
>>927102
Жаль что я еще и туповат. Был у меня давно хостинг+домен, хотел туда сайтик залить на джумле но так и неосилил.
Аноним 05/02/17 Вск 17:22:29 #246 №927145 
Кто-то смотрел курсы от php-start.com? , как они вам?
Аноним 05/02/17 Вск 17:59:07 #247 №927169 
1.jpg
2.jpg
Это нормально что он по 3 раза подряд одно и то же "случайно" выбирает? Или мой косяк?
Аноним 05/02/17 Вск 18:35:24 #248 №927190 
<form action="main.php" method="GET">
Видел в какой-то книжке как делался запрос сам на себя здесь, стоит ли делать как там или и так пойдет?
Аноним 05/02/17 Вск 18:40:36 #249 №927195 
>>927190
Как хочешь, так и делай.
Аноним 05/02/17 Вск 18:44:29 #250 №927199 
>>927195
Ну как я написал очевидно меньше писать придется, там же писалось что-то типа $_SERVER[EBALA_TYDA_SUDA];
Аноним 05/02/17 Вск 18:49:23 #251 №927204 
>>927087

Как кота зовут? На бухгалтера учишься?
Аноним 05/02/17 Вск 18:52:55 #252 №927205 
>>927098
опенсервер поставь. Там все включено(и пхп, и сикьюэль, и аллах) и он гипер-простой и бесплатный.
Аноним 05/02/17 Вск 18:55:13 #253 №927206 
>>927169
> Это нормально что он по 3 раза подряд одно и то же "случайно" выбирает? Или мой косяк?
разве array rand не возвращает случайное значение?
Попробуй выводить $рандом, а не массив[рандом]
Аноним 05/02/17 Вск 19:34:32 #254 №927219 
14826897161270.jpg
https://github.com/codedokode/pasta/blob/master/soft/web-server.md
Как последнюю задачу с куки делать то блять?
Не было ничего нихрена о ней сказано
Аноним 05/02/17 Вск 19:41:54 #255 №927223 
1474728811996.jpg
public function __construct($first_name, $last_name) {
$this->first_name = $first_name;
$this->last_name = $last_name;
}
Аноны, почему они не пишут сразу $this->$first_name?
Зачем писать first_name? какого значение этой хуйни? Она ведь нигде не употребляется больше, это не переменная, ничто
Аноним 05/02/17 Вск 19:43:06 #256 №927224 
>>927223
И далее
public function say_name() {
echo "My name is " . $this->first_name . " " . $this->last_name . ".\n";
}
Почему нельзя написать вместо $this->first_name просто $first_name?
Аноним 05/02/17 Вск 19:54:47 #257 №927233 
545344319413414peyvodku.jpg
>>927223
>>927224
Люди ведь подумать могут что ты наркоман.
Аноним 05/02/17 Вск 20:01:41 #258 №927240 
>>927233
Я нихуя не понимаю зачем всё усложнено
Аноним 05/02/17 Вск 20:02:32 #259 №927243 
>>927169
http://php.net/manual/ru/function.array-rand.php
https://ru.wikipedia.org/wiki/Динамическая_типизация
Аноним 05/02/17 Вск 20:11:38 #260 №927251 
>>927240
Усложнено настолько, что это просто охерено упрощает остальные 100500 ситуаций.
Давай представим, что у тебя класс 40 свойств. И наизусть ты их не помнишь. Предположим, что ты добавляешь в класс новый метод, в котором ты создаешь новые переменные и работаешь с ними. Создал метод, все вроде работает, нормально вызывается, но иногда почему этот класс начинает работать непонятно как и в нем совершенно другие значения свойств, а не те, которые ты ожидаешь. Лезешь в код и видишь, что переменная $item, которую ты создал в методе оказывается перезаписала свойство $item у этого же класса, а ты не знал, что в классе такое свойство есть. И таким образом, взглянув на код ты не можешь сразу визуально определить в каком случае работа происходит с локальной переменной метода, а когда затрагивается свойство класса.
Аноним 05/02/17 Вск 20:13:33 #261 №927253 
14862083420120.webm
>>927223
>>927224
ДА ТЫ ЖЕ УПОРОТЫЙ!
Аноним 05/02/17 Вск 20:33:27 #262 №927263 
P1250302.JPG
>>927204
Кота зовут Лис.
Бухгалтер не я - моя тян.
А я - обычный вебмакак с котом, который не любит похапе и любит JS
Аноним 05/02/17 Вск 20:35:19 #263 №927268 
1G0LZmF4tg.jpg
>>927087
Учи php!
Учи лучше!!!11
Аноним 05/02/17 Вск 21:03:27 #264 №927289 
14627338928871.jpg
>>927263
>любит JS
Аноним 05/02/17 Вск 21:35:07 #265 №927302 
>>927223

Ты понимаешь, что обозначает $this->first_name? Это не то же самое, что переменная $first_name, это другая вещь. Это поле объекта. Соответственно, слева от стрелки указывается объект, а справа - название поля в нем.

Если что, в учебнике в ОП посте есть глава про ООП. Там это вроде объясняется.
Аноним 05/02/17 Вск 21:36:15 #266 №927304 
>>927219
>Не было ничего нихрена о ней сказано
Там же написано: "необходимо изучить куки, переменную $_COOKIE и функцию setcookie()". При запуске скрипта проверяешь, прислал ли тебя пользователь куку с именем, скажем, "hui". Если прислал, то выводишь сообщение с текущим значением, увеличиваешь ее значение на единицу и ставишь пользователю, если не прислал - то ставишь ему эту куку со значением 1. Все, блядь, больше вообще ничего не надо.
Аноним 05/02/17 Вск 21:36:36 #267 №927305 
>>926256
> информатика
> интерес
> PHP
Ты СОВЕРШЕННО не понимаешь в чем суть PHP. PHP это не SICP "о, привет чуваки, зацените решение задачки на скиме, писал два месяца". PHP это не псевдоинтеллектуальные обсуждаения алгоритмов и структур данных. PHP это не сложные вычисления, нейроночки или динамические интерфейсы. PHP это язык, где люди могут побыть говнокодерами — ужасными, тупыми, безразличными ко всему рабами галер, которыми они на самом деле и являются. json_decode возвращает null, а мы смеемся. Кусок стэйта рендерится на сервере в глобальной области видимости, а мы смеемся и обмазываемся миддлварями на ноде. Три сеньор разработчика спрыгнули с крыши, пытаясь отрефакторить движок корпоративной CMS на 4-й пыхе, а мы смеемся и просим еще. Лапшекод, регулярочки, критические уязвимости — мы смеемся. Мы бездушно подпишемся на любой проект, где нам заплатят дошираком, наши предпочтения не основаны на логике программирования, бесцельное внедрение сторонник библиотек — наша стихия, мы — истинное лицо вебдевелопмента.
Аноним 05/02/17 Вск 21:56:47 #268 №927324 
>>927263

Моар кота.
Аноним 05/02/17 Вск 22:16:07 #269 №927334 
5fg45g54.jpg
>>927324
Не буду кидать, ибо оффтоп.
А вообще - ОП-няша.
Добра ему, всех благ и в нелегком деле обучения ньюфагов.
Именно благодаря ему сей тред не тонет.
Домо, PHP-ОП-сан!


Аноним 05/02/17 Вск 23:19:31 #270 №927369 
Курс по Laravel от webformyself годный? С учетом того, что он записан не на актуальной версии
Аноним 05/02/17 Вск 23:22:31 #271 №927371 
>>927369
Зачем какие-то непонятные русские курсы , если есть laracast
Аноним 05/02/17 Вск 23:40:56 #272 №927381 
>>927302
Не понимаю нихуя, вот и спросил
Аноним 05/02/17 Вск 23:45:58 #273 №927382 
начал делать 1 упражнение из основ ООП http://ideone.com/xHIidQ не могу понять в чем ошибка, нужно передавать во 2 foreach массив из ответов на вопросы, для которого писать отдельную функцию?
Аноним 05/02/17 Вск 23:49:58 #274 №927383 
>>927371
Потому что я ленивый славскам не очень хорошо знающий английский
Аноним 05/02/17 Вск 23:50:51 #275 №927384 
Пацаны у меня трабл. Нужно сделать на старом сервисе одном подобие апи, что бы отдавать расписание.

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

Поэтому буду делать просто php файлом в корне проекта.

Суть проблемы в следующем:

Например есть много эвентов, и сторонний сервис, который будет моё "апи" опрашивать, требует под каждый эвент отдельный урл.

Под каждый эвент я не хочу хуярить отдельный файл вот так:
site.ru/event1_scheduale.php
site.ru/event2_scheduale.php
site.ru/event3_scheduale.php
site.ru/event3_scheduale.php

На фреймворке с нормальным роутингом я бы наебенил очень просто через 1 метод в 1 классе всё и урлы бы были вида:
site.ru/api/sceduale/event1
site.ru/api/sceduale/event2
site.ru/api/sceduale/event3


Но как так изебнуться что бы сделать в 1 пхп файле так? Что бы не копипастить всё это дело?

Ебаться с htaccess?

Я бы очень хотел сделать 1 файл, что бы пусть даже был некрасивый урл типа такого:

site.ru/scheduale.php/event1
site.ru/scheduale.php/event2
site.ru/scheduale.php/event3
Аноним 05/02/17 Вск 23:54:51 #276 №927386 
>>927382
>foreach ($question->answers as $letter => $answer) {

$question->answers должен быть ассивом или объектом, а у тебя
в описании класса там простая переменная
>public $answers; // варианты ответов
Аноним 06/02/17 Пнд 00:10:30 #277 №927389 
Хочу в классе объявить закрытое поле и сразу его инициализировать:

private $QueryFormPath = __DIR__ . '/' . 'queryform';

На что получаю сообщение об ошибке:
>Parse error: syntax error, unexpected '.', expecting ',' or ';'
Безобидное же действие, что не так?
Аноним 06/02/17 Пнд 00:16:00 #278 №927391 
>>927384
Чем тебя GET-запросы не удовлетворяют, поехавший?
Аноним 06/02/17 Пнд 00:21:21 #279 №927394 
>>927386
http://ideone.com/VwBMac
спасибо
почему то не получается сделать через новую функцию
Аноним 06/02/17 Пнд 00:29:30 #280 №927398 
>>927391
Меня то они как бы устроят, но смотри я делаю вот что бы эти ребята могли опрашивать
http://mir-kvestov.ru/integration
вот их мануал:
https://docs.google.com/document/d/1b_MV2wfUgq0O9L-xjuPsbLlaVYJqNkSotaARvfBShS8/edit

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

Одновременно гет и пост вообще работать будут?
Аноним 06/02/17 Пнд 00:41:41 #281 №927401 
Всё я кажется понял. Я сделаю урлы вида:

site.ru/scheduale.php/event1
site.ru/scheduale.php/event2
site.ru/scheduale.php/event3

и буду из
$_SERVER дергать:
event1
event2
event3
кусочек. Должно сработать.
Аноним 06/02/17 Пнд 00:56:21 #282 №927404 
>>927401
AcceptPathInfo только настроить не забудь.
Аноним 06/02/17 Пнд 00:59:14 #283 №927406 
>>927404
>AcceptPathInfo
Это ты про то, что бы никто не мог лазить по папкам и запускать скрипты которые не в корне лежат или другие файлы скачивать/смотреть вообще?
Спасибо за совет.
Аноним 06/02/17 Пнд 01:03:53 #284 №927407 
>>927406
Нет, если эту хуиту не включить, то запрос вида /shitcode.php/another_shit будет просто отклонен и у тебя ничего не получится.
Аноним 06/02/17 Пнд 01:06:04 #285 №927408 
>>927389
http://ideone.com/3vjYE3
Все же работает если выполнить. Хоть ideone и пишет ошибку.
Аноним 06/02/17 Пнд 01:06:35 #286 №927409 
>>927407
Но у меня уже работает, видимо для modx наворачивали, для чпу.
Аноним 06/02/17 Пнд 05:55:40 #287 №927449 
887dfa952327be6d79c99ccuxp.jpg
Ребят, пытался пару раз вкатиться в пхп, пытался начать с заданий с сайта, но вообще не вдупляю как делать задание, хотя до этого прочитал фак, это я про http://archive-ipq-co.narod.ru/, может какую то литературу прочитать до того как начать знакомство с переменными и тд
Аноним 06/02/17 Пнд 06:01:10 #288 №927451 
>>927449

PHP исчерпывающее руководство

В свое время(годик назад) когда вообще ничего не понимал да и сейчас ничего не понимаю, дало неплохой старт, теперь могу спокойной пилить какие нибудь проектики для себя
Аноним 06/02/17 Пнд 06:02:04 #289 №927452 
>>927451
но там совсем для тупиц вроде меня, но если ничего прям не понимаешь, тебе зайдет
Аноним 06/02/17 Пнд 09:38:24 #290 №927488 
>>926132
bump
Аноним 06/02/17 Пнд 09:42:05 #291 №927491 
>>927488
Зандстру хвалят
Аноним 06/02/17 Пнд 09:51:27 #292 №927498 
>>927451
>PHP исчерпывающее руководство
а можно автора? а то там много похожих
Аноним 06/02/17 Пнд 10:04:27 #293 №927501 
>>927498
Держи

https://www.ozon.ru/context/detail/id/18089735/
Аноним 06/02/17 Пнд 10:11:34 #294 №927502 
>>927491
А я не хвалю. Там первые несколько глав конечно хорошо подают основы ООП, а вот дальше начинается вода, так что я даже дропнул не дойдя до собственно паттернов, ну не смог я читать то, что тупо срет тебе в мозг без конкретики.
Аноним 06/02/17 Пнд 10:14:35 #295 №927503 
>>927502
я тоже дропнул, хз, вообще оч скучно как то заходят книжочки всегда, единственное шо почти фулл прочитал, исчерпывающее руководство
Аноним 06/02/17 Пнд 11:25:44 #296 №927521 
Что лучше всего юзать для получения случайного значения из массива?
Аноним 06/02/17 Пнд 11:36:30 #297 №927524 
>>927521
дефолтные фукнции для работы с массивом?
http://php.net/manual/ru/function.array-rand.php
Аноним 06/02/17 Пнд 11:38:08 #298 №927528 
>>927524
Говорят что стандартная функция хуево рандомизирует.
Аноним 06/02/17 Пнд 11:42:19 #299 №927529 
>>927528
ну, в голову напрашивается самое дефолтное из дефолтнейших решений

узнать сколько всего значений, потом rand, потом взять случайный элемент из массива
Аноним 06/02/17 Пнд 12:00:24 #300 №927535 
>>927528

Конкретнее? Ты ведь не шифрование там пишешь наверно.

Если мне не изменяет память, функция rand() использует линейный генератор: https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%BD%D0%B3%D1%80%D1%83%D1%8D%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4

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

Также, есть улучшенный генератор (mt_rand) на основе Мерсенновского перемешивателя чисел: https://ru.wikipedia.org/wiki/%D0%92%D0%B8%D1%85%D1%80%D1%8C_%D0%9C%D0%B5%D1%80%D1%81%D0%B5%D0%BD%D0%BD%D0%B0

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

Для критографии нужно использовать специальные особо надежные функции, вроде

http://php.net/manual/ru/function.random-bytes.php (PHP7+)
http://php.net/manual/ru/function.openssl-random-pseudo-bytes.php

Они используют функции ОС, на Линукс например это /dev/urandom, который собирает случайные значения из окружающей среды (время нажатия кнопок, прихода сетевых пакетов и тд). Надо понимать, что тут скорость генерации ограничена.

В серьезных системах могут использоваться аппаратные генераторы случайных чисел, которые генерируют совсем непредсказуемые последовательности, например, слушая тепловой шум (столкновения молекул): https://ru.wikipedia.org/wiki/%D0%90%D0%BF%D0%BF%D0%B0%D1%80%D0%B0%D1%82%D0%BD%D1%8B%D0%B9_%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80_%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB

Аппаратный ГСЧ встроен в некоторые процессоры Intel: https://ru.wikipedia.org/wiki/RdRand
Аноним 06/02/17 Пнд 12:02:18 #301 №927537 
>>927528

И если уж на то пошло, почему бы тебе не написать самому простой линейный ГСЧ и посмотреть на числа, которые он генерирует, чтобы проверить, насколько они получаются случайными? В статье википедии выше есть формулы и константы, если что. Знаний PHP особых не нужно, достаточно знать циклы.
Аноним 06/02/17 Пнд 12:03:28 #302 №927538 
>>927529

array_rand это и делает, только она поддерживает массивы с любыми ключами, а не только с идущими подряд номерами.
Аноним 06/02/17 Пнд 12:31:14 #303 №927549 
Аноны, такая хуйня. Есть у меня такое СПА, которое формы слать должно на сервер. Но роутинг осуществляется через якоря в урле. Все формы аяксом отправляются. Серв на пхп. Как он воспримет гет запрос с якорем внутри. Или все постом делать, что бы урл не трогать?
Аноним 06/02/17 Пнд 13:01:51 #304 №927560 
14649883764650.jpg
Ок. Опять я со своим говнокодом.
>>924484
>>924780

Значит с формами и валидатором я разобрался. Хотел использовать entity класс для создания формы регистрации, но отказался и вот почему: 1 - я не храню пароль в базе, а в форме он должен быть 2 - для проверки полей на UniqueValue() нужно установить doctrine bridge и doctrine bundle и как-то это прикручивать к силексу и здесь смысл использования entity класса исчезает. Поэтому проще сделать отдельную форму и написать для нее свой unique constraint.

Все еще не ясно, что ты имеешь ввиду под использованием сервисов. В 83 треде ты писал, что:
> $app['validator'] = function() use($app){return new App\Helper\Validator($app);};
>Это по моему нарушение принципа DI, получается не DI, а Service Locator
Нужно регистрировать сервис провайдеры или что?
Аноним 06/02/17 Пнд 13:04:26 #305 №927562 
>>927305
А где иначе то?
Увы это болезнь не только PHP
Аноним 06/02/17 Пнд 13:29:18 #306 №927572 
>>927305
>Три сеньор разработчика спрыгнули с крыши, пытаясь отрефакторить движок корпоративной CMS на 4-й пыхе, а мы смеемся и просим еще
Проиграл бы если бы сам с таким не сталкивался.
Аноним 06/02/17 Пнд 13:49:42 #307 №927583 
>>927549
Аноны, ну че вы ну, знаете ведь небось. Гет запрос аяксом по-любому все обрабатывали.
Аноним 06/02/17 Пнд 13:53:30 #308 №927586 
>>927549
>Но роутинг осуществляется через якоря в урле
Ето невозможно
http://stackoverflow.com/questions/2317508/get-fragment-value-after-hash-from-a-url-in-php
Аноним 06/02/17 Пнд 19:15:13 #309 №927790 
В задачке про TestHub создание теста должно осуществляться на одной странице при помощи джаваскрипта или каждый вопрос на отдельной странице?
Аноним 06/02/17 Пнд 20:31:19 #310 №927837 
Поясните за ORM. Нахуй он нужен?
Я работал с Yii-шным ActiveRecord и Doctrine 2, а также с чистым PDO в других проектах.
Для простых крудов да, ООП, вся фигня, код с объектвми выглядит сладко. Но описывать более сложные SQL-запросы (с подзапросами, джойнами..) через квери-билдеры в ORM - Я ЕБАЛ!!1 Это ж ебаный бойлерплейт!
->select('kokoko')
->from('yoba')
->where('1=1')
Куча ебаных геттеров-сеттеров! Структура базы, связи между таблицами описывается внутри doc-комментов! Это я про доктрину. В Yii вообще пиздец без identity map, апдейты по всем полям, даже если ты изменил одно поле.
Ну что за пиздец?
Аноним 06/02/17 Пнд 20:52:46 #311 №927847 
14861488646060.webm
>>927837
Что тебе мешает использовать DQL той-же доктрины? Как по мне, доктрина очень годная ORM. Анотации, консоль, DQL, query builder, интеграция в симфони и дохуя чего еще. Но можно просто обмазываться PDO. Никто не запрещает.
Аноним 06/02/17 Пнд 21:07:58 #312 №927852 
Подскажите книжку где хорошо разбираются какие-то задачи с ООП, или просто что бы с решением было и комментариями.
Аноним 06/02/17 Пнд 21:45:02 #313 №927863 
>>927852
Dive into haskell
Аноним 07/02/17 Втр 00:27:34 #314 №927979 
>>927847
Бля, есть моар с душами что-нибудь?
Аноним 07/02/17 Втр 00:40:55 #315 №927983 
анон, пробегись по моему коду, пожалуйста. Я почти доделал по одному гайду недосайт и ЖЕЛАЮВСЕМТЕЛОМ советов по улучшению читабельности/качества кода ну и, если есть, ошибки какие. С учетом того, что я js-джун и с бакэндом столкнулся три дня назад.4 дня до этого еще подучил синтаксис похапе

https://github.com/sylenien/php-news-site/

алсо дома лежит толстая здоровенная, сука, подробная книга по node.js, стоит ли начать читать ее вместо пыхи?
Аноним 07/02/17 Втр 01:00:17 #316 №927985 
>>927983
Что за книга по ноду?
Аноним 07/02/17 Втр 01:19:50 #317 №927990 
P70205-171230.jpg
>>927985

hands on node.js + пик. Люблю скупать книги такие, а по пыхе не было ничего.
Аноним 07/02/17 Втр 01:31:40 #318 №927995 
>>927990
ЛЕЛ, скачал после своего вопроса точно такую же
Аноним 07/02/17 Втр 01:38:27 #319 №927998 DELETED
>>927983
Очень бегло.

https://github.com/sylenien/php-news-site/blob/master/models/News.php#L13
SQL-инъекция

https://github.com/sylenien/php-news-site/blob/master/models/News.php#L25
Зачем синглтон для соединения с БД? Лучше прочитай про паттерны для работы с БД тут: https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md

SQL запросы прямо в контроллере, это не MVC: https://github.com/sylenien/php-news-site/blob/master/models/News.php#L28

https://github.com/sylenien/php-news-site/blob/master/components/router.php
В роутер пусть REQUEST_URI приходит в качестве аргумента (конструктора/метода), так роутер можно протестировать, не запуская сервер.
Аноним 07/02/17 Втр 02:13:01 #320 №928002 
Анон, дико туплю ночью.
Подскажи неосилятору как сделать эти умножения?
<?php
for ($x = 1; $x <= 10; $x++){
echo "$x*$x=\n";
}
1×1 =
2×2 =
Аноним 07/02/17 Втр 02:30:50 #321 №928006 
>>927998
Схуяли там инъекция? Там intval, защищает от хуйни.

Схуяли sql в контроллере это не mvc? Обмажутся своими active record и ябут друг друга в жеппу! В идеале выделить работу с sql в прослойку - маппер, чтобы она не была в model. Но если нет, то где ей больше место - в model или controller?
Аноним 07/02/17 Втр 02:50:34 #322 №928011 
>>928002
http://ideone.com/m5feS2
Аноним 07/02/17 Втр 03:19:50 #323 №928015 
>>928006

Почему ты даун?*
Аноним 07/02/17 Втр 04:06:07 #324 №928019 
>>928011
Спасибо, не туда переменную ставил.
Аноним 07/02/17 Втр 08:05:23 #325 №928032 
>>927998

поясни, почему инъекция, пожалуйста. Я думал, что если айди числовое, то посрать?
Аноним 07/02/17 Втр 08:14:48 #326 №928036 
>>928032
>>927998

ну и да, что ты можешь про ноду сказать?
а то я боюсь потратить год на пхп, если лучше сразу то
Аноним 07/02/17 Втр 08:33:36 #327 №928039 
анончики, вопрос жизни и смерти, срочно нужен совет знатока по YII, можно за $
Аноним 07/02/17 Втр 08:44:56 #328 №928044 
14624569503050.webm
>>927979
Не, недавно пак проебал.
Аноним 07/02/17 Втр 10:10:31 #329 №928063 
>>927998
>Зачем синглтон для соединения с БД?
Всмысле? А почему бы ему не быть синглтоном?

мимо-код-не-смотрел
Аноним 07/02/17 Втр 10:30:58 #330 №928072 
Господа, как убрать пробелы из значений элементов двумерного массива?
Вроде как сделал через foreach и сомневаюсь, что так "правильно" - для одномерных массивов можно сделать array_map('trim', $array)
Аноним 07/02/17 Втр 12:08:24 #331 №928097 
Я ознакомился со статьёй о безопасной авторизации на хабре:
https://habrahabr.ru/post/13726/ -Безопасный метод авторизации на PHP
И имею вопрос. Вот пользователь. Он ввёл свои данные, скрипт поискал юзера, нашёл, сравнил пароли, при совпадении создал ему новый хеш, записал куки и перенаправил работу скрипту проверки. Скрипт проверки сравнивает то, что записано в куках с тем, что записано в базе (как я понял) и в случае совпадения, возвращает "ок".

А теперь дурацкий вопрос. Как этим пользоваться? Сами скрипты я повторил у себя на хостинге, они работают. Допустим, у меня есть ещё пара php файликов, которые хочу доверить только авторизованным пользователям. Как это сделать?
Аноним 07/02/17 Втр 12:21:05 #332 №928103 
>>928097
Немного исправлю ссылку: https://habrahabr.ru/post/13726/

И сразу ещё один вопрос.
Там используется конструкция
header("Location: check.php"); exit();
Я погуглил на тему header(), и везде пишут, что так отправляются заголовки html страницы. А в коде это используется для передачи управления другому скрипту. Как так-то?
Аноним 07/02/17 Втр 13:07:05 #333 №928125 
Помните например такой проект как спрашивай.ру, который существует и сейчас. Проект с довольно большой аудиторией, на чём надо писать подобные сайты чтобы они нормально работали? Обыкновенного ПХП ООП и обычной базы данных хватит? Или нужно что-то сложнее?
Аноним 07/02/17 Втр 13:34:29 #334 №928135 
Анон, проверь у тебя ideone работает? Ввожу код, жму ран и страница перезагружается
Аноним 07/02/17 Втр 13:49:21 #335 №928139 
>>928097
Там смысл в том, что на страницах, которые ты хочешь отдавать только авторизованным пользователям, проверяются куки. Соответственно на любой такой странице тебе надо выполнять код скрипта проверки, если куки пользователя проходят проверку - отдавать содержимое, если нет - посылать нахуй или на страницу регистрации.
>>928103
Это не передача управления, а редирект на любую страницу, все правильно пишут. В статье просто демонстрируется проверка сразу после регистрации.
Аноним 07/02/17 Втр 14:26:36 #336 №928166 
>>928139
То есть, весь код из check.php должен выполняться перед любым кодом со страницы, (допустим, index.php), а вместо print "Привет, ".$userdata['user_login'].". Всё работает!"; писать тело страницы со всеми хидерами и футерами?
Аноним 07/02/17 Втр 14:31:59 #337 №928170 
>>928166
Да, именно так.
Аноним 07/02/17 Втр 14:35:34 #338 №928171 
>>928170
Спасибо за разъяснение.
Аноним 07/02/17 Втр 15:10:08 #339 №928191 
https://daylerees.com/php-pandas
https://laracasts.com/series/php-for-beginners
http://exercism.io/languages/php/exercises
https://code.tutsplus.com/articles/25-resources-to-get-you-started-with-php-from-scratch--net-2223

https://nixsolutions.github.io/design-patterns/
https://toster.ru/q/368853

http://onlinetestcentre.com/search/php.html

http://blog.nikolaposa.in.rs/2017/01/16/on-structuring-php-projects/

Делюсь полезными ссылками.
Аноним 07/02/17 Втр 19:43:47 #340 №928320 
А допустимо ли делать скачивание файла в задачке про файлообменник(и вообще) вот так вот:
<a href="/{{file.link}}" download>Скачать бесплатно и без смс</a>
Или надо как-то сложнее изворачиваться?
Аноним 07/02/17 Втр 19:48:26 #341 №928323 
>>928320
Повалят скриптами.
Каптча нужна хотя бы простенькая.
Аноним 07/02/17 Втр 19:49:54 #342 №928325 
>>928323
Для меня это еще сложно. Не покажешь как правильно делать то?
Аноним 07/02/17 Втр 20:00:52 #343 №928331 
>>928325
Два массива со значениями от 1 до 10.
Если "введённое в поле" равно $arr1[$i] + $arr2[$o], то echo ссылка.
При обновлении страницы $i++, а $o+2 либо - array_rand.
Ну и вывод значений на странице соответствующий.
Аноним 07/02/17 Втр 20:07:50 #344 №928336 
>>928331
Не, ну это ненадежно. Пусть как у Гугла делает. "Отметьте картинки на которых есть Абу".
Аноним 07/02/17 Втр 20:11:26 #345 №928338 
>>928336
Можно прикрутить рекапчу эту самую.
Аноним 07/02/17 Втр 20:15:46 #346 №928339 
http://ideone.com/3pc0qC
сделал метод getOvertimeHours(), но он выводит нули в массиве, и при выведении ошибка Notice: Array to string conversion
Аноним 07/02/17 Втр 20:32:07 #347 №928343 
>>928331
>Два массива со значениями от 1 до 10.
>Если "введённое в поле" равно $arr1[$i] + $arr2[$o], то echo ссылка.
>При обновлении страницы $i++, а $o+2 либо - array_rand.
>Ну и вывод значений на странице соответствующий.
Сложна. Это что, делать отдельный шаблон и перенаправлять на него для этой хуиты?
>>928336
>>928338
Это сложно? Я вот погуглил, вроде гугл капчу нельзя прикрутить на локалхост, не?
Аноним 07/02/17 Втр 20:44:34 #348 №928349 
>>928339
Так а вопрос в чем?
Аноним 07/02/17 Втр 21:01:19 #349 №928356 
>>928343
> Это что, делать отдельный шаблон и перенаправлять на него для этой хуиты?
Вроде того.
>Это сложно? Я вот погуглил, вроде гугл капчу нельзя прикрутить на локалхост, не?
Это сложнее. Прикрутить можно, если сервер на твоем локалхосте имеет доступ в Интернет.
Аноним 07/02/17 Втр 21:08:46 #350 №928358 
>>928356
>Вроде того.
Да не, это какой-то изъеб. Вот был же ex.ua, там можно было качать без капчи и регистраций, как они это делали не боясь что им завалят сервера?
>Это сложнее. Прикрутить можно, если сервер на твоем локалхосте имеет доступ в Интернет.
Ладно, только гугл подсказывает только сраные плагины на вордпресс.
Аноним 07/02/17 Втр 21:12:17 #351 №928361 
>>928358
Ну я хз, вот тут как-то сделано на жабаскрипте: http://biotualet1.ru/otzyvy.html
То, что я имел в виду.
Но там после ввода ответа и нажатия срабатывает POST, а ты бы просто ссылку выдавал.
Аноним 07/02/17 Втр 21:14:05 #352 №928362 
>>928358
Тебе не нужно геморроиться.
Только желающие повалить будут писать скрипты под тебя.
Ты можешь действия там менять рандомно (минус, плюс, деление, умножение) и т.п.
Аноним 07/02/17 Втр 21:15:34 #353 №928363 
>>928349
>928339
https://ideone.com/YfDjGW
да уже ни в чем, я просто невнимательно смотрел, вместо числа массив передавал
Аноним 07/02/17 Втр 21:18:32 #354 №928367 
>>928361
>Но там после ввода ответа и нажатия срабатывает POST, а ты бы просто ссылку выдавал.
В то то вот и дело, что я не знаю как это сделать.
>>928362
Ну как такое сделать я понимаю, но хотелось бы именно не "лишь бы работало", а правильно сделать.
Аноним 07/02/17 Втр 21:20:14 #355 №928371 
ex.ua.png
>>928358
>ex.ua
Там, где нет капчи, пользуются другими методами - типа блокировки известных прокси и ограничениями на количество запросов/одновременных подключений для остальных. Но это, вроде, уже к настройкам сервера ближе, а не PHP.
Аноним 07/02/17 Втр 21:24:39 #356 №928374 
>>928367
> POST
> не знаю
Прочитай первые главы учебника по пыхе "PHP 5 в подлиннике". Его принято поливать говном и считать за днище, однако это единственный учебник, где прежде, чем перейти к профессиональному программированию, освещается необходимый для этого дела минимум по запросам и формам.
Аноним 07/02/17 Втр 21:27:31 #357 №928375 
>>928374
Ты меня не понял. Я не хочу постоянно перенаправлять пользователя туда-сюда. Я хочу как-то впилить туда капчу.
Аноним 07/02/17 Втр 21:31:53 #358 №928377 
>>928375
Ну напиши простейший скрипт на JS, который AJAX запрос отправляет и получает ссылку на скачивание ответом.
Аноним 07/02/17 Втр 21:32:56 #359 №928379 
>>928377
>Ну напиши простейший скрипт на JS, который AJAX запрос отправляет и получает ссылку на скачивание ответом.
Я так и думал. Проблема в том, что я толком то JS не знаю, не то что бы аякс. Ну да ладно, будет как раз повод его освоить.
Аноним 08/02/17 Срд 00:50:54 #360 №928462 
Посоны, есть куча PHP классов от вебсервиса, сгенерированных из XSD. Там собственно только поля, сеттеры и геттеры. Данные получаются на вебсервис и разгоняются по этим классам автоматом. Вопрос - как загнать эти классы в БД автоматом? При том, что там поля не соответствуют полям в БД? Есть какие-то готовые решения? Или все вручную катать?
Аноним 08/02/17 Срд 00:53:02 #361 №928464 
>>928462
Вручную не нравится - классов полно, методов на вебсервисе тоже. Что хотелось бы - какую-то маппилку, которая просто берет готовые классы, маппит по какому-нибудь правилу или списку на классы из БД и все сама пишет в БД.
Аноним 08/02/17 Срд 06:17:06 #362 №928496 
критическая.png
В чем ошибка?то уже второй час долблюсь
Аноним 08/02/17 Срд 06:24:39 #363 №928497 
>>928496
Измени условие на ошибочное и запусти. Это ведь Codeacademy? Днище, на самом деле, не всегда ясно, чего от тебя хотят, сам с этого охуевал. В данном случае, очевидно, хотят, чтобы ты сначала проверил верное утверждение ("3<7"), а потом изменил его на неверное ("3>7") и опять проверил.
Аноним 08/02/17 Срд 06:48:33 #364 №928506 
>>928497
спасиба, добрый человек:ззз
Чего посоветуешь новичку для изучения PHP?
Аноним 08/02/17 Срд 07:00:04 #365 №928509 
>>928506
Обзорно можно познакомиться например здесь: http://php720.com. Все довольно понятно, дизайн не выворачивает, читабельно.
Аноним 08/02/17 Срд 07:52:14 #366 №928514 
Допустим пишу я сеттер для свойства класса и в нём делаю проверку. Например для $id я делаю проверку на то, что это число и оно больше либо равно нулю. Если всё хорошо, то присваиваю значение. Что лучше делать если условие не проходит? Выкинуть исключение и в нём написать в чём проблема или тупо вернуть false (или null) и ничего не делать?
Аноним 08/02/17 Срд 09:04:07 #367 №928529 
>>928514
я ничего не делаю, так как у меня простые пути. Тупо если запросили несуществующее id с базы например, то и хуй с ним. Будет тупо редирект на уровне контроллера если модель ничего не вернула на 404 или вообще нахуй в личный кабинет, ибо нехуй лазить по чужим заявкам/страницам/платежам и пр.
Аноним 08/02/17 Срд 09:10:50 #368 №928531 
>>928529
А записывать ты туда всякий мусор разрешаешь? Меня в данном случае сеттер волнует. Да конечно на сайте может быть валидация на стороне пользователя, но разве можно быть на 100% быть уверенным в том, что мы получили валидные данные от пользователя?
Аноним 08/02/17 Срд 09:33:41 #369 №928535 
Прохожу от нехуй делать курсы битрикса (на самом деле, работодатель попросил).
В принципе, там много неоднозначных ответов (в одном тесте например правильный ответ - может работать на любом вебсервере умеющем в похапе, в другом - бэкэнд это строго апач с похапе).
Дурдом, короче. Зато теперь я трижды сертифицированный говноед.
Четвертый курс (Huiload) сдавать буду на следующей неделе у них в офисе.
Аноним 08/02/17 Срд 09:45:43 #370 №928541 
>>928535
Ты сюда повыёбываться пришел или я не понял смысловой нагрузки твоего поста?
Аноним 08/02/17 Срд 09:55:46 #371 №928542 
>>928531
Не разрешаю, тоже анально игнорирую если у меня попытались хуйню протолкнуть. А вообще я даже логирую пользовательские действия, и если кто-то попытался отключить фронт-энд проверки и споткнулся на бек-энд проверках, то так и заношу в базу, что вот дескать этот хуй пытался МАМ,ХАКЕРИТЬ)))
Аноним 08/02/17 Срд 10:42:10 #372 №928556 
>>928514
Исключение конечно. Причем проверку не в сеттере лучше делать, а отдельный метод написать, который из сеттера вызывается. Вот метод этот уже true/false возвращает. А сам сеттер выглядит вроде этого:
if ($this->parameterIsValid($parameter)) {
$this->parameter = $parameter
}
throw new \UnexpectedValueException('Parameter is not valid');
Аноним 08/02/17 Срд 10:43:06 #373 №928557 
>>928556
return в if блоке забыл
Аноним 08/02/17 Срд 10:49:19 #374 №928561 
Что бы изучит и уметь создавать вирусы, шпионские проги и т.д. А так же антивирусы к ним, это в какой язык нужно вкатываться ?
Аноним 08/02/17 Срд 10:51:45 #375 №928563 
>>928561
ассемблер
Аноним 08/02/17 Срд 12:43:10 #376 №928615 
Как проверить, существует ли метод у статического класса?
Аноним 08/02/17 Срд 13:02:58 #377 №928630 
Безымянный.png
Я тут немного костылей нагородил, теперь вот не знаю, правильно или нет.

В общем, есть на странице селект, содержимое которого берётся при генерации страницы из бд с помощью функции:
<div id="div_change">
<?php
list_selector($table, $column, 'list_id', 'list_name');
?>
</div>

Содержимое селекта - список предметов. И этот список можно менять, добавляя или удаляя предметы.
Сделал это через аякс: нажимаем кнопку, срабатывает js-крипт, запускает через ajax php-код, а тот прописывает добавление/удаление предмета в БД.

И тут мне восхотелось сделать так, чтобы список на странице тоже обновлялся без перезагрузки страницы. И сделал это так: как только у аякса срабатывает success, тут же запускает через ещё один аякс ещё один пхп-файл, который принимает через _POST данные для генерации list_selector и запускает его с этими данными. Функция возвращает собранный html-код в тот файл, который вызван через второй аякс, оттуда код возвращается в js-скрипт и селектор обновляется.

Кривость какая-то, но проще способа не нашёл. Это так и должно быть, или я уже шизею?
Аноним 08/02/17 Срд 14:37:04 #378 №928702 
C1Bmz6uVQAAx5ZC.jpg
Привет котаны. Дело в том, что я уже достаточно долго пилю свой бложек на php, теоретически я хотел бы показать его своему потенциальному работодателю. Стоит ли мне это делать, либо у меня пиздец какое позорище получилось? Буду благодарен за любое мнение.
https://github.com/honeydev/s-blog
Пример для понажимать - http://honeytype_0ayl98.radius-host.net/
Аноним 08/02/17 Срд 14:50:55 #379 №928713 
Screenshot2017-02-08-14-53-24.png
>>928702
Ну хуй знает. Это при попытке создать новый пост с загруженной картинкой. Тестами покрывал?
Аноним 08/02/17 Срд 15:11:56 #380 №928730 
>>928702
Ну так на вскидку:
Нет публичной папки, весь код доступен пользователю.
Не используешь никаких паттернов управления данными. Все круды в контроллерах или что это там у тебя в перемешку с логикой.
4 класса в одном файле https://github.com/honeydev/s-blog/blob/master/app/src/authorization.php

Короче, может быть это и работает, но выглядит как свалка.
Аноним 08/02/17 Срд 15:19:02 #381 №928739 
>>928702
>>928730
Дальше смотреть не стал.
Тут аноны кидают свои гитхабы. Полазь по ним, посмотри как они делают.
Аноним 08/02/17 Срд 15:37:52 #382 №928746 
>>928730
Нет, не покрывал не умею в функциональное тестирование.
>>928713
Просто у меня классы контроллеров не вынесены в отдельные файлы, но сами классы разделяются.
Короче буду все переделывать, спасибо. Все же нужно было изучать паттерны сначала, а не писать лижбы написать.
Аноним 08/02/17 Срд 16:51:09 #383 №928793 
>>928630
Почему ты не хочешь сразу в первом аяксе обновлять список?
Аноним 08/02/17 Срд 17:00:56 #384 №928807 
>>928702

github/sylenien -> php site
почитай роутер.пхп. Знакомый похапе миддл одобрил, правда, с придирками.
Аноним 08/02/17 Срд 17:26:46 #385 №928830 
>>928793
Вообще, да. Можно. Но тогда через аякс нужно будет передавать все данные и для апдейта таблицы и для апдейта селектора. Надо будет подумать на свежую голову завтра.
Аноним 08/02/17 Срд 18:10:29 #386 №928887 
Не работает PDO->lastInsertId(), всегда ноль возвращает. В чем может быть причина?
Аноним 08/02/17 Срд 18:26:17 #387 №928910 
error1.png
error2.png
error3.png
error4.png
Нужна помощь, пытаюсь динамически вывести значения из БД
Пикрелейтед ошибка:

А вот скрины SiteController, модель CategoryPhp, и вывод во вьюху.

Пробывал проверить через is_array, тогда просто ничего не выводит.
Аноним 08/02/17 Срд 18:26:43 #388 №928911 
error5.png
>>928910
Db.php
Аноним 08/02/17 Срд 18:28:15 #389 №928912 
>>928910
>>928911
Все эти статические хуитки выглядят довольно опасно.
Аноним 08/02/17 Срд 18:31:11 #390 №928914 
>>928912
Дело в том что я прохожу по видеокурсам, и там на этом моменте все работает, даже дамп базы импортнул - все равно не пойму в чем проблема.
Аноним 08/02/17 Срд 18:37:26 #391 №928916 
>>928914
>Дело в том что я прохожу по видеокурсам
Какие-то хуевые видеокурсы. Чисто на первый взгляд
>include_once 'c:\openserver что-то там дальше
Во-первых, там и правда учат так пути прописывать? Во-вторых, инклюдить что-то в скрипте с объявлением класса это тихий ужас, это говнокодище за которое руки отрывать надо. Учи что такое неймспейсы и автозагрузка классов. В третьих, там какая-то дикая мешанина из статики и динамики. Короче исправь первые два пункта и потом попробуй написать тоже самое, только без статики.
Аноним 08/02/17 Срд 18:39:20 #392 №928917 
>>928911
Алсо нихуя не понял зачем ты там еще и тру возвращаешь. Это же пхп, тебе не надо париться по поводу того что ты там возвращаешь в методе/функции.
Аноним 08/02/17 Срд 18:39:27 #393 №928918 
>>928916
через PATH у меня почему-то не видит
Аноним 08/02/17 Срд 18:42:16 #394 №928920 
>>928917
Вот полный код проекта
https://github.com/victor-zinchenko/shop.php-start.com
Аноним 08/02/17 Срд 18:45:37 #395 №928922 
>>928920
Честно говоря, я не знаю как такая хуитень может работать без пространства имен.
Аноним 08/02/17 Срд 19:11:17 #396 №928939 
>>928887
Ошибки в коде ищи. Такая же параша была. Смотри, что было выше.
Аноним 08/02/17 Срд 19:13:32 #397 №928942 
14861400014632.webm
>>928920
Ну теперь все встало на свои места. Хохол-быдлокодер хуже индуса.
Мой тебе совет:
Не надо проходить мутные курсы в стиле 'Магазин дилдаков за 24 наносекунды'.
В ОП посте есть учебник. Лучше порешай задачи из него и попробуй сделать студентов.
Аноним 08/02/17 Срд 19:51:31 #398 №928964 
С какой стороны зайти к студентам?
Аноним 08/02/17 Срд 20:08:37 #399 №928985 
>>928964
ПАЦАНЫ, С БОКУ ЗАХОДИ! А НУ, ЧИКИ-БРИКИ И В ДАМКИ!
Хотелось бы услышать конкретный вопрос.
Аноним 08/02/17 Срд 20:18:09 #400 №928999 
>>928964
Сам не знаю с какой стороны подойти, но можно попробовать в тетради расписать свою архитектуру.
Аноним 08/02/17 Срд 20:44:43 #401 №929028 
>>928964
>>928999
Для начала стоит написать индексный файл и заинклюдить туда шаблон главной страницы, прикрутив к нему бутстрап. Потом можно уже добавлять функционал. Можете посмотреть гитхабы анонов уже сделавших студентов.
Аноним 08/02/17 Срд 20:58:29 #402 №929038 
>>929028
как найти гитхабы анонов которые уже это делали?
Аноним 08/02/17 Срд 21:18:41 #403 №929053 
Поясните, почему хранить разметку в бд зашквар? Например, у сайта сложный дизайн, не хранить же каждый блок текста в отдельной таблице и не выводить его потом??
Аноним 08/02/17 Срд 21:23:14 #404 №929059 
>>929053
раздели дизайн на меньшие шаблоны, выводи их инклудами.
Аноним 08/02/17 Срд 21:25:48 #405 №929067 
>>929059
Но тогда получается, что одна страница будет лежать в нескольких колонках базы данных. А это множение колонок в таблице. ведь под каждый кусок шаблона должен выводиться определенный кусок из одной статьи.
Аноним 08/02/17 Срд 21:27:49 #406 №929070 
>>929067
Бля. Не храни щаблоны в базе данных.
Покрайней мере в MySQL.
Аноним 08/02/17 Срд 21:28:57 #407 №929072 
например я же не буду писать
<ul><?php
foreach($result as $item){
<li><?=$item?></li>
<?php } ?>
</ull>
<?php foreach($result2 as $text) {?>
<p class="hueta"><?=$text?></p>
<?php }?>
И подумайте сколько запросов к бд делать придется под такую жесть. И не рациональное использование таблиц получится (много таблиц с кусками одной страницы)
Аноним 08/02/17 Срд 21:30:06 #408 №929076 
>>929070
я тебе про сложную верстку поясняю маня.>>929072
А не одностраничники на яндекс.народе
Или мне весь текст прямо в шаблоне хранить ежели верстка сложная?
Аноним 08/02/17 Срд 21:30:38 #409 №929077 
>>928942

в оп посте нет ни одного гайда про веб-дев. Хохол-быдлокодер внятно объясняет азы, а в оп-посте просто блять задача в стиле "я научил тебя пользоваться палкой, иди строй ткацкий станок". Критикуешь этот курс - покажи хороший.
другой анон
Аноним 08/02/17 Срд 21:30:41 #410 №929078 
Анон, помоги, пожалуйста!
Прохожу ООП по учебнику из ОП поста. Вроде не дурак, все разминочные задания сделал без особых проблем, а вот с последним (которое про компанию ВЕКТОР) впал в ступор.
Расписал абстрактные классы компания, департамент и сотрудник. Че дальше то делать ?
Нужно создавать класс для каждой профессии, или сделать профессию свойством сотрудника ?
Почему потребление кофе - не является свойством сотрудника ? Является ли свойством количество производимых страниц ? Если нет - почему ?
Где должны создаваться и добавляться в департамент сотрудники ? Это нужно делать в отдельном классе или прямо в классе департамент ?

Вопросов гораздо больше, но даже сформулировать их пока очень трудно. Помогите, прошу.
Аноним 08/02/17 Срд 22:25:56 #411 №929102 
Screenshot11.png
Что это?

Объясните нубу последнею строку
Аноним 08/02/17 Срд 22:28:55 #412 №929104 
>>929102
Посмотри в треде выше, ОП где-то постыл ссылку на свой урок про кодировки.
Аноним 08/02/17 Срд 22:30:46 #413 №929105 
>>929078
>Почему потребление кофе - не является свойством сотрудника ?
Потому что я блять хуй знает. Я ебал этой задачи рот.
Вообще обосрался на этой задаче, хотя что-то до этого получалось.
Слава богу кто-то подсказал, что так заморачиваться не надо - это нигде на хуй не нужно будет.
Аноним 08/02/17 Срд 22:39:34 #414 №929113 
>>929102
Синие узоры же на белом фоне. Дизайн наверное такой.
Аноним 08/02/17 Срд 22:48:08 #415 №929117 
>>929078

Это все потому, что ОП - няшка.
Ты слишком буквально пытаешься следовать тексту, а текст, к сожалению (а может и нет?), далек от академичности и однозначной трактовки.

> Почему потребление кофе - не является свойством сотрудника ?
Потому что потребление кофе вычисляется методом на основании профессии и ранга. То же самое с зарплатой и листами.
Аноним 08/02/17 Срд 22:57:52 #416 №929122 
>>929076
Текст храни в базе, разметку страницы в шаблонах.
Научись правильно оформлять запросы к БД.
Сделал запрос данных из таблицы, перевел полученное в массив, вывел массив на странице.
Все.
Аноним 08/02/17 Срд 23:08:21 #417 №929132 
>>929078
Компания и департамент-то с чего абстрактные? Они обычные классы.

>Че дальше то делать ?
Компанию заполняешь департаментами, департаменты сотрудниками. Пишешь методы подсчета для компании - они опрашивают департаменты. Потом для департаментов - они опрашивают сотрудников.

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

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

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

>Где должны создаваться и добавляться в департамент сотрудники ?
В контроллере. Для департамента пишешь сеттер сотрудников, контроллер добавляет их туда через сеттер. Можно без сеттера сразу при создании департамента через Dependency Injection, тогда тебе придется сначала создать сотрудников.

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

Аноним 08/02/17 Срд 23:09:26 #418 №929134 
>>929078

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

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

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

Ты случайно не путаешь базовое потребление кофе, одинаковое для всей профессии, и итоговое потребление, которое зависит от разных факторов?

> Является ли свойством количество производимых страниц ? Если нет - почему ?
Как я понимаю, это производная величина, вычисляющаяся через другие.

> Где должны создаваться и добавляться в департамент сотрудники ? Это нужно делать в отдельном классе или прямо в классе департамент ?
Тут есть 2 подхода:

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

Что еще непонятно?

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

Если ты из тех, кто критикует ООП, считает что он переусложнен и не нужен, то можешь попробовать решить задачу без ООП для сравнения. И посмотреть, насколько более простым будет решение.
Аноним 08/02/17 Срд 23:19:21 #419 №929138 
Есть много объектов, заполненных данными. Можно как-то их на поля таблицы разметить, чтобы сохранялись туда автоматом? Поля не соответствуют полям таблицы, имена классов тоже. Доступа к классам нет, так что в самих классах ничего не напишешь. К классу, от которого они все унаследованы, доступ есть.
Аноним 08/02/17 Срд 23:23:11 #420 №929142 
>>929078

Если ты написал все классы, то дальше надо использовать их для решения задачи. А именно:

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

>>929132

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

>>929105

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

>>929102

Ты данные выводишь, указав браузеру неправильную кодировку.

>>929077

С гайдами, да, не очень, но у нас есть задача про студентов и в ней очень много комментариев. Со ссылками на статьи про паттерны работы с БД, внедрение зависимостей, MVC и прочие умные вещи.

Я мельком глянул проект на гитхабе - https://github.com/victor-zinchenko/shop.php-start.com , пару классов - там много неправильного, на мой взгляд.

Ну например там есть папка components, а что такое "компоненты", ты можешь сформулировать?

Или например есть класс Cart, который судя по названию, представляет одну корзину, но почему у него все методы статические? Как создать например 2 корзины? На самом деле у него неправильное навание и правильно его называть SessionCartManager или как-то так.

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

Или вот класс DB. Можно подумать, это класс для работы с БД, но у него почему-то всего один метод getConnection. Может правильнее его было назвать ConnectionFactory? и опять же, везде статические методы.

ООП значит "объектно-ориентированное программирование". Но объектов-то в коде нет. Классы используются только для группировки функций.

Класс Product опять же назван неправильно, его объект не представляет собой один товар.

И так далее.

У нас в задаче про студентов изучаются примерно те же вещи, построение приложения. Только без злоупотребления статическими методами.
Аноним 08/02/17 Срд 23:27:44 #421 №929148 
>>929134
>Потому, что это производная величина, которая зависит от: профессии, ранга, статуса босса. Хранить надо исходные данные, а производные величины просто вычислять из них (если это не требует больших затрат процессорного времени конечно). Иначе ты замучаешься их обновлять при изменении исходных данных (например, ранга).
>
>Ты случайно не путаешь базовое потребление кофе, одинаковое для всей профессии, и итоговое потребление, которое зависит от разных факторов?

Проиграл с задроченного ноулайфера, который не видит людей и строит абстрактные модели их предпочтений.
Аноним 08/02/17 Срд 23:32:09 #422 №929152 
>>929104

Статья на гитхабе про кодировки: https://github.com/codedokode/pasta/blob/master/cs/strings.md

>>929138

Можно сделать внешние классы-мапперы. Например, UserMapper умеет сохранять и загружать объекты User из таблицы users. В мапперах прописать название таблицы и соответствие между колонками таблицы и полями объектов, может даже правила преобразования (например поле DATETIME в PHP объект DateTime).

Паттерн так и называется Data Mapper, подробнее у Фаулера и у меня в уроке https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md

Также, вместо своего маппера можно взять библиотеку Doctrine. Она такое умеет.

>>929072

В динамических сайтах в БД хранятся исходные данные (в нормализованном виде), а шаблон страницы хранится в виде файла. Соответственно, при генерации страницы данные берутся из БД и подставляются в шаблон.

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

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

Но даже в случае кеширования, кеш хранится отдельно от исходных данных.
Аноним 08/02/17 Срд 23:33:10 #423 №929154 
Поясните, пожалуйста за сессии. Есть некий php-класс. В одном методе я открываю сессию с помощью session_start(), пишу в $_SESSION, потом пишу header("Location: ".$desiredLocationURL) и в следующей строке записываю exit

Как можно в другом методе класса, который вызывается позже, получать доступ к $_SESSION? Почему-то к нему нету доступа, пишет
>Undefined variable: _SESSION
Нужно писать session_start()?
Сессия будет работать, если открыть браузер в анонимном режиме?
Аноним 08/02/17 Срд 23:34:29 #424 №929156 
Будет ли работать сессия, если в браузере отключена поддержка cookies?
Сколько "держится" сессия?
Аноним 08/02/17 Срд 23:39:22 #425 №929159 
>>929053

О какой разметке речь? Если ты хочешь сохранить набранный в HTML редакторе код статьи с форматированием - пожалуйста, сохраняй. Если ты хочешь сохранить верстку/дизайн сайта в БД, то это плохая идея. Ну хотя бы потому, что верстальщику неудобно будет с ней работать. Ведь все редакторы кода работают с файлами на диске, а не с данными в базе.

Файлы легко поместить в систему контроля версий вроде git, а данные в базе - нет.

Бывают CMS, где верстка хранится в БД, но это очень неудобно.

Шаблоны дизайна все же должны лежать в виде файлов на диске.

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

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

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

Аноним 08/02/17 Срд 23:51:13 #426 №929167 
>>929070

Что не так с MySQL?

>>929038

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

>>928964

Изучить комментарии которые даны к этой задаче. Там даны примеры, также есть ссылка на статью про MVC.

>>928942

Я соглашусь с тем, что сначала надо изучать более базовые вещи (ООП, MVC, базы данных), а потом уже делать сложные приложения на них.

>>928922

У него наверно классов не много, не используются сторонние библиотеки и риска конфликтов нет.

>>928916

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

>>928914

Не понимаешь - значит, надо разобраться. Поставь echo/var_dump, смотри что хранится в переменных, сравни с тем, что в них должно быть.

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

>>928910

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

Готовых ответов не будет.

Не прописывай абсолютные пути в include, пиши относительно __DIR__ лучше.

>>928887

Значит не было операции INSERT в ходе которой сгенерировался новый id.

>>928746

1 класс = 1 файл. Почитай мой урок по PSR-4 https://github.com/codedokode/pasta/blob/master/php/autoload.md

Паттерны тебе рановато изучать, чтобы их изучать надо ковырять исходный код Симфони и Доктрины.

>>928702

- Изучи PSR-4 и автозагрузку (ссылка выше)
- Изучи MVC, ты вообще не понимаешь, что такое контроллер: https://github.com/codedokode/pasta/blob/master/arch/mvc.md

У меня нет времени все разбирать сейчас, могу посоветовать почитать комментарии к задаче про студентов, там все подробно расписано: https://github.com/codedokode/pasta/blob/master/student-list.md
Аноним 08/02/17 Срд 23:57:47 #427 №929171 
>>929152
>Паттерн так и называется Data Mapper, подробнее у Фаулера и у меня в уроке

О, как раз что искал. Буду писать мапперы. Про доктрину почитал, но все пишут тормознутая, а мне надо что-то побыстрее. К тому же там как я понял надо в самих классах комментарии писать, чтобы доктрина их понимала. Свой маппер не должен сильно затормозить, это же всего +1 класс к каждому объекту, либо можно вообще общий для всех написать.
Аноним 09/02/17 Чтв 00:02:23 #428 №929177 
Есть ли какие-то стандарты, правила для кода PHP(сколько пробелов и прочее)?
Аноним 09/02/17 Чтв 00:03:01 #429 №929178 
>>928630

Вообще, у тебя все смешано в кучу. Вот посмотри:

list_selector($table, $column, 'list_id', 'list_name');

У тебя тут заложены ограничения:

- данные могут браться только из 2 колонок таблицы
- нельзя отфильровать данные перед выводом в список
- нельзя преобразовать данные
- нельзя брать данные не из таблицы

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

По поводу аякса, тут есть варианты:

- можно возвращать в ответе новый список, и явакриптом перегенерировать список опций
- можно возвращать кусок HTML и заменять его
- можно просто добавлять/удалять одну опцию из списка (изучи DOM, такая возможность есть). Это наверно самый оптимальный вариант.

То есть тебе надо подучить DOM, и DOM-объекты соответствующие тегам SELECT и OPTION.

>>928615

- method_exists
- function_exists
- рефлекшен

>>928561

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

Могу посоветовать интересный блог с свежей и актуальной информацией про ботнеты и прочий скам: https://krebsonsecurity.com/ Правда он на английском, но без английского в сфере кибербезопасности делать нечего.

Антивирусы (ядро) обычно пишут на Си++ ради производительности, но чтобы их писать, нужны очень широкие знания - начиная с машинных кодов и работы процессора, продолжая WinAPI, заканчивая форматами файлов и виртуальными машинами. То есть надо очень много изучать разных вещей, и низкоуровневых, и высооуровыневых, и этому на сомнительных форумах вряд ли научат. Там тебя только научат как скачать готовую программу, взломать кривой непатченный годами магазин на PHP и попасть в отдел К.

Аноним 09/02/17 Чтв 00:09:54 #430 №929182 
>>929177
PSR же
их несколько штук, почитай.
http://www.php-fig.org/psr/
Аноним 09/02/17 Чтв 00:12:06 #431 №929183 
>>929078
http://ideone.com/4si0kM
Аноним 09/02/17 Чтв 00:14:25 #432 №929185 
>>929183
>>929078
я тут обосрался изза того что в глаза долблюсь, потом просто наговнокодил и не стал переделывать, чтобы хоть как то соответствовать требованиям задачи, можешь посмотреть может поможет
Аноним 09/02/17 Чтв 00:14:59 #433 №929186 
Как правильно прятать файл, который обрабатывает форму? Допустим мы используем аякс или просто js, что позволяет нам не писать допустим action="save.php", но на странице всёравно же будет виден код ajax или js, и по ним можно будет понять какой файл обрабатывает форму. Как правильно прятать?
Аноним 09/02/17 Чтв 00:21:37 #434 №929191 
>>928542

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

>>928541

Он принес нам интересную инсайдерскую информацию про курсы битрикса. Может кому пригодится.

>>928514

Давай рассуждать логически.

- как в сеттере могут оказаться неправильные данные?
- что мы хотим в этом случае делать?

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

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

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

>>928529

У него другая ситуация.

>>928531

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

>>928509

Я тут решил глянуть урок по ООП, и мне кажется, это не очень удачное начало: http://php720.com./lesson/50

Но это что касается ООП, другие темы я не смотрел там.

>>928496

Там написано в задании, надо чтобы условие не сработало и вывелся текст про false. Пункт 03 слева.

>>928462

Либо написать свой Data Mapper, либо прикрутить Доктрину. Урок про маппер: https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md

>>928375

Логично капчу выводить до попытки скачивания. Логика может быть такая:

На странице просмотра файла:

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

Обработчик формы с кодом капчи можно сделать обычный (POST-форма), можно аяксовый, на выбор. В случае обычной формы, можно после успшного решения капчи редиректить на скаичвание файла.

В обработчике скачивания файла:

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

Хранить информацию о решении капчи можно в куках или сессии.

То есть тебе бы стоило начать с понимания, как работает HTTP, что такое GET/POST запросы.

Аноним 09/02/17 Чтв 00:22:54 #435 №929192 
>>929186
Зачем прятать? Если save.php нормально написан, то ничего прятать не требуется, он любые параметры принимает, валидирует и выдает сообщения об ошибке в случае левых данных. Надо не прятать, а нормально инпуты проверять.
Аноним 09/02/17 Чтв 00:28:37 #436 №929197 
>>929186
В коде аякса секретный ключ + текущее время. В htaccess редирект например /save/ на save.php. Потом из аякса делаем запрос на /save?secretkey, где secretkey md5 от секретного ключа + текущее время. Сервак сравнивает и показывает 404 not found со всеми заголовками, если не совпало.
Аноним 09/02/17 Чтв 00:29:26 #437 №929199 
>>929186
НИКАК
С помощью WEB-консоли браузера ЭКСПЕРИМЕНТАТОР может отследить параметры запроса и по какому адресу отправлены данные, а потом на питончике набросать скрипт, который отправляет тот же запрос, представляется браузером и сохраняет печеньки.

Можно настроить роутинг с помощью Alto Router или mod_rewrite, и тогда прописывать не action="save.php", а action="/backend/"; некоторые фреймворки позволяют повесить обработчики серверных событий, типа onRequestURL, например Wordpress мне кажется. Это не остановит заинтересованных лиц от попыток обхода механизмов. Так что для особо критических мест решает все более детальная проверка данных.
Аноним 09/02/17 Чтв 00:32:51 #438 №929202 
>>929142

Ну, не буду спорить, конечно, но названия классов и переменных - это уже нутакое, не влияющее на функционал. А так да, у хохла много лишнего, типа папки КОНФИХ и компоненцс. С другой стороны, такой подход удобен, чтоб скинуть клиенту готовый архив с сайтом и послать нахуй, а он сам сможет разобраться уже в коде на базовом уровне.
Я вот сейчас тот же тутор хохла прохожу, но многое переделываю под себя и свою логику. убрал дб_конфих и внес в database.php, где к базе подключается и ведется всякое нехорошее

да, кстати, а зачем корзине быть нестатической? Ну, то есть, зачем создавать еще корзин богу корзин? Мне в любом шопе одной хватало, когда чот покупал, лол.
>>929077-кун

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

Аноним 09/02/17 Чтв 00:33:15 #439 №929203 
>>928320

Допустимо, но тут есть подвохи

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

Почитай комментарии к задаче про файлообменнник, там же это расписано вроде.

Защиту от роботов делать не требуется, но если очень хочется, то можешь добавить.

>>928166

Вообще, лучше просто сделать функцию, проверяющую авторизацию. Если она вернула false, редиректить на страницу логина и завершать скрипт.

>>928135

У меня работает: http://ideone.com/Ppm71Y

Может у тебя какой-нибудь адблок стоит? Или может это были баги на ideone? Или браузер устарел?

>>928125

Думаю, да. До того, как у тебя будет большая аудитория, пройдет немало времени.

Википедия на PHP, фейсбук и вконтакте наичнались на PHP. Badoo на PHP.

>>928097

Разбей задачу на более мелкие:

- проверить введенный логин и пароль
- залогинить пользователя с данным id

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

Чтобы понять, кто перед нами, мы должны выдать куку с каким-то идентификатором. Например, id пользователя, email, логин.

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

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

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

Я тебе советую вместо чтения статьи просто понять, как работает авторизация и написать функции залогинивания/разлогинивания/проверки самому.
Аноним 09/02/17 Чтв 00:43:37 #440 №929219 
>>928072

Это тестовое задание? Можно через циклы, можно через array-walk_recursive или рекурсивные итераторы по массиву.

>>928063

Потому что лишнее усложнение и ограничение (с синглтоном не может быть больше 1 соединения).

Можно просто написать:

$pdo = new PDO(...);

зачем к этому добавлять синглтон? Чтобы было?

А вообще, чем плох в некотоых случаях синглтон, можно попробовать понять из урока по DI https://github.com/codedokode/pasta/blob/master/arch/di.md

>>928006

Инъекции там нет, но стиль плохой. Есть же плейсхолдеры, используй их, а не склеивай запрос из кусков.

Вместо Db::connect лучше использовать DI: https://github.com/codedokode/pasta/blob/master/arch/di.md

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

> В идеале выделить работу с sql в прослойку - маппер, чтобы она не была в model. Но если нет, то где ей больше место - в model или controller?
Ты по моему не понимаешь, что такое модель и как работает MVC. У меня есть урок https://github.com/codedokode/pasta/blob/master/arch/mvc.md

>>927998

> SQL запросы прямо в контроллере, это не MVC:
Файл называется model/News, это разве контроллер?

По поводу синглтона - лучше дать ссылку на урок про DI. Это ведь к DI относится, как получить объект PDO.

>>927852

Это не книга, но в ОП посте есть учебник и в нем глава про ООП с парой задач. А так, не знаю.

Аноним 09/02/17 Чтв 00:47:36 #441 №929227 
>>927837

Попробуй погуглить, что значит ORM

ORM = Object to Relational (DB) Mapper

Маппер (сопоставитель) объектов с строками таблицы в БД.

Вот и ответ. ORM нужен, если ты хочешь загружать или сохранять данные из БД в виде объектов.

Урок https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md

> Но описывать более сложные SQL-запросы (с подзапросами, джойнами..) через квери-билдеры в ORM
Query Builder перпендикулярен ORM. Можно делать ORM без Query Bulder, можно использовать Query Builder без ORM. Как следует из названия, он предназначен для сборки запросов по частям, например, когда вид запроса зависит от каких-то условий. В моем уроке это упомянуто.

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

> Структура базы, связи между таблицами описывается внутри doc-комментов!
А как ты бы хотел их описывать? В доктрине есть другие варианты + можно написать свой парсер.

В общем читай мой урок.
Аноним 09/02/17 Чтв 00:49:46 #442 №929230 
Есть дата в формате 02/14/2017, как перевести её в количество секунд прошедших с 1970 года. Только без математических расчётов, есть функция которая преобразует дату в обычном формате в unix формат, я что-то не могу найти
Аноним 09/02/17 Чтв 00:51:48 #443 №929232 
>>929230
А, всё нашёл уже, извиняюсь
Аноним 09/02/17 Чтв 00:56:47 #444 №929236 
>>927790

Удобнее наверно сделать хороший редактор, где все вопросы на одной странице. Сам подумай, в тесте может быть 10-50 вопросов. И может потребоваться их переставлять как-то.

У меня там есть наброски интерфейса (на mockinbird), и там вроде показано, как это может выглядеть.

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

>>927549

Якорь не отправляется на сервер.

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

>>927449

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

>>927389

Нельзя использовать составные выражения при инициализации поля. Но их можно поставить в конструкторе.

>>927382

У тебя в объекте не заполнено поле answers. Потому там лежит по умолчанию null. И при попытке сделать по нему цикл foreach происходит ошибка.

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

Аноним 09/02/17 Чтв 01:13:19 #445 №929243 
>>927087

О, это уже второй кот с борд, про которого я знаю (первый - Джаз, который с блинами).

>>927086

Язык, DOM и тд. У нас в ОП посте есть задачки.

>>926913

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

Библиотек не знаю, но наверно можно нагуглить при желании.

>>926847

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

>>926829

Обновление страницы не меняет URL. надо делать редирект.

>>926760

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

>>926725

Недостаточно информации. Опиши, что ты делал, какую команду ввел, что вывелось, что ожидал, что получилось.

>>926675

Да, лучше отказаться.

>>926674

Это наследие прошлых версий. Делать так неправильно.

>>926669

Что значит "на чистом PHP"? Какие ограничения это добавляет? Я не могу понять, как отличить чистый PHP от нечистого.

>>926597

Сначала стоит освоить основы: ООП, MVC, формы, таблицы. У нас есть задача про студентов, помогающая это изучить.

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

В твоем коде есть проблема: ты обращаешься к элементу массива $_GET[amount'], но даже не проверил, есть ли такой элемент в нем вообще.

Число 5000 не надо копипастить, а надо вынести в переменную.

Аноним 09/02/17 Чтв 01:24:53 #446 №929253 
>>929154
>>929156

Ответь сначала на такие вопросы (если знаешь ответ, если нет, так и пиши):

- что такое сессия?
- где хранятся помещенные в нее данные?
- если сессий на сервере много, как понять, какая из них соответствует какому пользователю? Ну то есть пришел HTTP-запрос от браузера, как понять. какая сессия соответствует этому пользователю?
- что делает sesion_start()?
- кто и когда заполняет массив $_SESSION? Что происходит с ним после завершения скрипта?
- как удаляются данные сессий, если они долго не используются?

Можешь также погуглить перед тем, как писать, что не знаешь.

>>929171

Все пишут, а ты померяй. Ну и настрой правильно.

>>929177

Единых официальных нет, но есть рекомендации PSR-1 и PSR-2 которые поддерживают крупные фреймворки и многие проекты. Смотри второй пост треда.

>>929186

Никак.

>>929197

не проще этот ключ явно передавать как GET- или POST-параметр?

Время на клиенте и на сервере может не совпадать. У меня сегодня телефон почему-то на 2 часа отстал.

>>929199

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

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



Аноним 09/02/17 Чтв 01:32:55 #447 №929263 
>>929202

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

> да, кстати, а зачем корзине быть нестатической?
Ну например, надо зачем-нибудь сравнить корзины 2 пользователей. Или еще что-нибудь с ними сделать. Или в тесте мы создаем корзину, делаем что-нибудь с ней и выкидываем.

Ну или например мы хотим поработать с корзиной в CLI-скрипте. Этот класс ведь без сессии вообще работать не будет. Потому что это не корзина. А редактор данных в сессии, хранящих информацию о корзине.

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

По ноде я не могу сказать. Мне кажется, она нужна только в определенных нишах.

Если ты хочешь писать сложные JS приложения, тебе все равно надо понимать ООП. У нас кстати есть задачи по JS самого разного уровня в ОП посте. В том числе и на сложное приложение.

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

Аноним 09/02/17 Чтв 03:55:29 #448 №929312 
>>929219
>Это тестовое задание? Можно через циклы, можно через array-walk_recursive или рекурсивные итераторы по массиву.
Не тестовое, аутирую с вордпрессом. Мне требовалось убрать пробелы у значений перед отправкой в бд. Сделал через вложенный foreach, но думаю, что сделал какое-то говно и так никто не пишет.
Аноним 09/02/17 Чтв 09:15:47 #449 №929349 
Антоши, а можете накидать литературы по PHP вроде той, что сейчас висит в шапке, но актуальной для 2016-17 годов?
Аноним 09/02/17 Чтв 09:52:40 #450 №929360 
>>929178
>list_selector($table, $column, 'list_id', 'list_name');
Там как раз и есть две функции. Одна работает с таблицей, а list_selector только формирует список, используя столбец $column в таблице $table и формируя div с параметрами id и name, list_id и list_name, в который его и помещает.

DOM пока для меня сложновата, но я посмотрю.
Аноним 09/02/17 Чтв 10:56:16 #451 №929372 
>>929349
С тех пор ничего не изменилось же. Новые фичи в php7 и фреймворки появились, но основы от этого не меняются. Что в шапке, вполне актуально, а для новых фич качни любую книгу, где php7 разбирается.
Аноним 09/02/17 Чтв 14:44:25 #452 №929448 
У меня вопрос по MySQL

Необходимо создать таблицу из 2 столбцов
Жанр - Количество

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

Всего у меня 4 таблицы:
Книги:
id - название - имя автора

Авторы:
id - Имя - Фамилия

Жанры:
id - название

Связка жанров и книг:
idКниги - idЖанра

(тк одна книга может быть связана с несколькими жанрами).

Оформить запрос не получается. Прошу помощи.
http://pastebin.com/6C2W5zZ1 - структура бд





Аноним 09/02/17 Чтв 14:55:18 #453 №929453 
>>929448
Я бы очень рад тебе помочь, но я не понял самого вопроса, в чем у тебя проблема то? Это тестовая/учебная задача, или у тебя траблы с реальным проектом?

Тебе нужно селект написать? В котором будет посчитано сколько книг в каждом жанре?
Наверное как-то так
SELECT genres, COUNT(*) FROM books GROUP BY genres;
Yii2 Session Аноним 09/02/17 Чтв 15:03:18 #454 №929460 
Привет анончики. Хочу запилить мультиязычность наYii.
Пробема в том что не знаю как организовать проверку кук и запись в сессии на всех страницах.
Сперва нужно по дефолту (при заходе на любую страницу сайта) повесить куку с дефолтным языком и записать дефолтную сессию, а при выборе другого языка - поменять.
Очевидно, мне не хочется проверять существование кук и сессий в каждом экшене, как это сделать в одном месте?
Может есть варик через конфигурацию компонентов?
Аноним 09/02/17 Чтв 15:10:35 #455 №929470 
>>929460
>при заходе на любую страницу сайта
то есть при вызове любого контроллера?

Тогда в конструкторе родительского контроллера или что там у вас используется.
Аноним 09/02/17 Чтв 15:16:30 #456 №929474 
>>929470
по сути мультиязычность нужна только на стороне клиента. так что на основном контроллере в папку frontend. Там сейчас 10 страниц, очень не хочется вешать на каждую проверку
Отвечая конкретно на вопрос, при вызове контроллера SiteController (я и не парился его переназывать ) проводить проверку сессий и кук
Аноним 09/02/17 Чтв 15:31:00 #457 №929485 
>>929453
Для себя делаю, учусь.

да, нужен селект. Списки жанров и книг в разных таблицах.
Они связаны между собой проходной таблицей.
То есть вместо того, чтобы в одну ячейку писать id жанров, я сделал табличку.
Аноним 09/02/17 Чтв 15:32:48 #458 №929487 
>>929474
Прости бро, но я в глаза ниразу не видел yii, просто основываясь на опыте пытаюсь тебе дать совет.
> Там сейчас 10 страниц, очень не хочется вешать на каждую проверку
Что такое страницы? Страница собой представляет контроллер? Или ты методы одного контроллера имеешь ввиду?

Если у тебя все "страницы" в пределах одного контроллера, то напиши ему конструктор, в котором это будет проверяться.

http://ideone.com/fz6Jg3
Аноним 09/02/17 Чтв 15:36:42 #459 №929490 
>>929487
спасибо, я и не подумал
Аноним 09/02/17 Чтв 15:50:43 #460 №929503 
Ребята а правда что правильно читать не пэхэпэ и даже не пиашпи а фипи?
Аноним 09/02/17 Чтв 15:54:18 #461 №929506 
>>929503
пыха
Аноним 09/02/17 Чтв 16:17:29 #462 №929523 
>>929503
Правильно будет похапе
Аноним 09/02/17 Чтв 16:47:03 #463 №929550 
https://jsfiddle.net/b073aLb5/
Что не так?
Аноним 09/02/17 Чтв 16:48:58 #464 №929551 
>>929550
Простите, забыл наследование сделать https://jsfiddle.net/b073aLb5/1/
Аноним 09/02/17 Чтв 17:01:14 #465 №929560 
1.JPG
2.JPG
Помогите пожалуйста.
Аноним 09/02/17 Чтв 17:05:21 #466 №929562 
>>929560
>he buys new car

Не благодари
Аноним 09/02/17 Чтв 17:06:51 #467 №929564 
14810619343823.webm
>>929560
Из функций значения уже возвращать не нужно?
>>929562
кек
Аноним 09/02/17 Чтв 17:08:03 #468 №929566 
>>929564
>Из функций значения уже возвращать не нужно?

Как это? Т.е. выводить результат функций командой echo нельзя?
Аноним 09/02/17 Чтв 17:10:29 #469 №929568 
>>929562

a new car

Хотя я в артиклях довольно слаб, но предложения без артиклей сразу выдают иностранца.
Аноним 09/02/17 Чтв 17:11:05 #470 №929569 
>>929566
Можно, но ты ниже используешь эхо на переменной, которая не существует в этой зоне видимости. И вообще это пиздарики. Куча каких-то эхо, наркоманские названия переменных, $bd++ вместо $db++.
Аноним 09/02/17 Чтв 17:12:24 #471 №929570 
>>929560
это тяжелый случай, у тебя функция ничего не ретернит, нигде не вызывается и ты к внутренним переменным функции обращаешься в глобальном коде.

Попробуй понять вот этот пример:
http://ideone.com/VnlelH
Аноним 09/02/17 Чтв 17:14:51 #472 №929574 
>>929569
>>929570
Я вас понял, поскольку функция это отдельный мир кода, так сказать, измерение, и все переменные внутри функции внешний мир не видит, для него они не существуют.
Следовательно, что-бы вызвать результат функции, нужно echo название_функции написать?
Аноним 09/02/17 Чтв 17:17:04 #473 №929576 
>>929570
https://www.codewars.com/kata/5839edaa6754d6fec10000a2/train/php
На примере моей задачи. Вот, я её так решил, в общем.

Кроме того, что я неправильно вызвал функцию, я решил её правильно?
Аноним 09/02/17 Чтв 17:18:47 #474 №929577 
14811408828370.webm
>>929574
Почему ты так любишь лепить везде эхо? Сделай return в функции, потом вызови ее в переменную и когда все уже будет готова можешь принтить.
Аноним 09/02/17 Чтв 17:19:15 #475 №929579 
>>929574
Нет, ты можешь и внутри функции эхо написать, но ты ВЫЗОВИ СУКА ЕЁ ГДЕ-НИБУДЬ В КОДЕ
то что у тебя там написано
function hueta($huitka) {
....hueta code
}
- это только ОПИСАНИЕ ФУНКЦИИ, понимаешь? Ты тут лишь показываешь языку как она должна работать.

Потом ты в своём коде где тебе нужно пишешь
hueta($var);
и она выполняется



Блядь пиздец, пойду лучше в овервотч поиграю.
Аноним 09/02/17 Чтв 17:22:27 #476 №929583 
>>929579
>>929577
Короче пойду перечитывать инфу по функциям.
Спасибо.
Аноним 09/02/17 Чтв 17:27:53 #477 №929586 
Куда делся JS тред? Как найти?
Аноним 09/02/17 Чтв 17:35:05 #478 №929596 
>>929583
http://ideone.com/WijAs6
Аноним 09/02/17 Чтв 17:45:13 #479 №929607 
14861431356810.webm
>>929596
Ну и зачем ты все разжевал? А? А? А? А? А? А? А? А?
Давай удочку, а не рыбу, еба. Когда сам роешь инфу по проблеме, то в конце ты чувствуешь, что заебись ваще чотко все порешал. А если тебя тычут носом в решение, то это хуйня.
Аноним 09/02/17 Чтв 17:47:01 #480 №929608 
>>929607
Я и дал ему удочку, я же не за него его говнокод переписал. А так тоже самое блядь описал в 10 строках, что и в любом учебнике.
Аноним 09/02/17 Чтв 17:47:57 #481 №929609 
>>929460
Тебе нужны транслейты слов для Yii:t или переводы из базы?
Аноним 09/02/17 Чтв 17:53:08 #482 №929612 
>>929134
>>929132
Спасибо за ответы ! Началось хоть какое-то движение.
Сейчас имею вот такой недокод: http://ideone.com/fLnxX3

Я все равно не могу понять ситуацию с кофе и страницами.
В моем нынешнем решении я копирую несколько раз код функции getDrunkCofee, меняя только одно значение. Этого ведь можно избежать, сделав кофе и страницы свойствами сотрудника, разве не так ?
Может я не правильно понял условия, ведь потребление кофе и количество страниц зависит только от того, является ли сотрудник боссом ? Или при повышении ранка повышается потребление кофе и производство страниц ?
Аноним 09/02/17 Чтв 18:24:37 #483 №929622 
>>929612
>>>929134
>>>929132
И еще, кто-то может подсказать, в какую сторону читать: >>929612
В голове возникла мысль !
А может быть в общем классе "сотрудник" полностью описать функцию просчета, с использованием instanceOf, и выдавать результаты в зависимости от профессии(типа, класса) ?
Аноним 09/02/17 Чтв 18:52:51 #484 №929644 
>>929574

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

Конструкция такого вида

function somehing($x) {
.....
return $y;
}

создает новую функцию (но код в ней не выполняется, просто PHP теперь знает, что такая функция есть). В данном случае создается функция с названием something, которая принимает один аргумент, обозначенный переменной $x и возвращает что-то в конце своего выполнения с помощью return. return это специальная команда, которая выходит из функции, и возвращает указанное после нее значение.

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

something(10);

Вот эта строчка вызвает функцию и выолняет записанный в ней код. При этом в функции будет доступна переменная $x, равная 10. Если мы хотим сохранить результат, который вернет функция с помощью return, мы должны использовать переменную:

$result = something(10);

Вот конкретный пример. Напишем функцию, принимающую на вход 2 числа и возвращающую сумму их квадратов:

function getSquareSum($a, $b) {
return $a * $a + $b *$b;
}

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

Теперь посчитаем с ее помощью сумму квадратов чисел 3 и 4:

$sum = getSquareSum(3, 4);
echo $sum; // 25

Можно обойтись без промежуточной переменной:

echo getSquareSum(5, 6); // 61

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

И да, функция не видит внешние переменные. Все, что ей нужно, ты должен явно передать через аргументы. Это делает код более логичным, сразу по заголовку видно, что нужно передать функции для ее работы.
Аноним 09/02/17 Чтв 19:03:56 #485 №929653 
>>929612

Копировать код функции 4 раза - плохая идея. Это затрудняет изменение программы и говорит о неправильном подходе.

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

Давай подумаем: в 4 классах-профессиях логика расчета потребления кофе - разная или одинаковая? Она одинаковая, единственное различие - это один коэффициент.

Следовательно, нам нужно не 4, а одна функция. Мы объявляем ее в базовом классе, и она потому будет доступна во всех потомках.

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

protected function getBasicCoffeeConsumption()
{
return 10;
}

Но тут встает другая проблема:

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

Обе этих проблемы решают абстрактные методы. В базовом классе мы делаем абстрактный метод:

abstract protected function getBasicCoffeeConsumption();

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

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

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

Есть ли в моем подходе недостаток: да, есть. Он предполагает, что во всех профессиях будет использоваться один и тот же метод, формула расчета кофе. Если это не так, то этот мой подход будет плохо работать (попробуй подумать, почему).
Аноним 09/02/17 Чтв 19:10:14 #486 №929656 
>>929622

> А может быть в общем классе "сотрудник" полностью описать функцию просчета, с использованием instanceOf, и выдавать результаты в зависимости от профессии(типа, класса) ?
Это полная противоположность ООП-подходу. В ООП, если какая-то информация или логика относится только к одному классу, то она должна быть в нем.

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

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

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

То есть код вида:

если класс == Менеджер то...
если класс == Инженер то...

противоречит идеям ООП о разделении кода на классы. Ты выносишь код, относящийся к классу, из класса наружу.
Аноним 09/02/17 Чтв 19:17:19 #487 №929658 
>>929612

> public function getDrunkCofee()
> {
> return 'nothing'; //заглушка
Это неправильно. Таких "заглушек" быть не должно. Так как кто-то может вызвать функцию, и эти данные куда-то дальше пойдут. Тут надо использовать абстрактный метод без реализации.

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

> abstract class AbstractEmployee
> private $baseRate;
Перечитай в чем разница между protected и private.

> protected $baseRate = 500;
Нет гарантии, что все потомки укажут значения поля. Тут надо использовать абстрактный метод для получения этого числа.

Аноним 09/02/17 Чтв 20:49:51 #488 №929708 
14838889006340.jpg
Аноны, тупые вопросы за 300. У меня есть приложуха которая шлет гет запрос на получение списка, еще есть пост запрос на добавление данных и редактирование и есть еще удаление(как его слать кстати). Так вот на сервере эти запросы обрабатывает один файл, но разные функции? И получается для разных пост запросов надо разные пхп файлы?
Аноним 09/02/17 Чтв 20:53:58 #489 №929712 
14634117865110.jpg
Напомню Опу о себе.
>>924484
>>927560
Аноним 09/02/17 Чтв 21:40:13 #490 №929740 
Может кто-нибудь скинуть решение задачи на проверку телефона из шапки? Я ее ниасилил
Аноним 09/02/17 Чтв 21:40:15 #491 №929741 
Извиняюсь что немного не по теме.
- Есть один сайт на php, который возможно мне придется админить/переписывать и тд.
- в php ноль, но знаю питон, не слишком хорошо, но 99% проблем могу решить сам, не умоляя слезно на всех форумах сразу.
Вопрос в том как мне поступить, учить php и дербанить существующий сайт или писать на питоне с нуля? И сколько нужно просить за такую работу (сайт на питоне), учитывая что я живу мухсранске, нищеброд без гроша и фирма мелкая.
Извиняюсь за сумбурность
Аноним 09/02/17 Чтв 21:44:23 #492 №929745 
Спасибо ОПу за задачки и обучение программирование на пыхе, а также анонам из версткотредов. Я переехал в ДС и нашел работу. Как я вас могу отблагодарить? Могу подарить тортик :3
Аноним 09/02/17 Чтв 21:45:00 #493 №929747 
Кстати, почему аякс в хроме только методом ГЕТ передает запросы на сервер?
Аноним 09/02/17 Чтв 21:48:04 #494 №929753 
Прятать стили в тэге стайл прямо в середину хтмл страницы - ведь совсем зашквар? Не первый раз такое встречаю, прямо у меня на работе есть такой говнокодер.
Аноним 09/02/17 Чтв 21:57:53 #495 №929763 
>>929745
Ты няшный?
Аноним 09/02/17 Чтв 22:11:47 #496 №929769 
>>929503
пи-а-пи
Аноним 09/02/17 Чтв 22:14:57 #497 №929771 
>>929747
Так переключи на post.
Аноним 09/02/17 Чтв 22:18:42 #498 №929775 
>>929753
Можно просто в style у элементов же прописывать.
<div style="background-image: url(../images/vasya.gif);background-repeat:no-repeat; background-position:50% 50%;"> background-position:50% 50% </div>
Аноним 09/02/17 Чтв 22:23:56 #499 №929781 
>>929771
пост запросы не передаются аяксом на сервер в хроме, только геты. я и спрашиваю почему?
Аноним 09/02/17 Чтв 22:24:29 #500 №929782 
>>929763
очень я даже тяночка ))
Аноним 09/02/17 Чтв 22:25:42 #501 №929783 
>>929775
Я знаю, но они именно ебашут <style> в середине html и это меня ужас как бесит. Оправдывается разраб тем, что ну стили же легче будет найти потом)) т.е. ему легче искать стили к странице, в которой он их прям в середине заебашил. ппц
Аноним 09/02/17 Чтв 22:32:37 #502 №929789 
>>929782
Тогда не надо.
Аноним 09/02/17 Чтв 22:35:58 #503 №929793 
>>929448
Лучше тебе делать отдельно таблицу для книги и отдельную для жанра.
Аноним 09/02/17 Чтв 22:39:36 #504 №929802 
>>929775
Нахуй так сложно, вот так надо:
<body bgcolor="green" background="fon.bmp">
<center>
<u>
<font color="red">Надпись, охуеть</font>
</u>
</center>
</body>

И никакие cssы в середине страницы не нужны.
Аноним 09/02/17 Чтв 22:42:05 #505 №929806 
>>929793
Я так и сделал.
Даже пастбин с моей базой сделал.
Жанры и книги связаны между собой через промежуточную таблицу.
Нужно придумать, как оформить Селект, чтобы было
Жанр - количество книг в жанре.
Аноним 09/02/17 Чтв 22:42:51 #506 №929808 
>>929753
Дай пизды ему, епта
Аноним 10/02/17 Птн 02:47:01 #507 №929965 
Есть несколько кнопок radiobutton, как среагировать в jQuery на клик по любой из них. Класс и id не могу поставить каждой кнопке свой, так как они выводятся динамически.
Аноним 10/02/17 Птн 02:49:41 #508 №929966 
>>929806
А что там оформлять? Селект иннер жойн и поехал.
Аноним 10/02/17 Птн 07:20:44 #509 №929992 
>>929965
try this
$(кнопка).он("клик",функция() {
$(this) = self;
...
}
Аноним 10/02/17 Птн 07:23:44 #510 №929993 
>>929992
self/this местами поменять*
туплю утром.
Аноним 10/02/17 Птн 12:35:08 #511 №930105 
Возможно тупой вопрос, но всё же. Представим ситуацию: у меня есть сделанный мной сайт, который активно работает с моей же базой данных. Сайт лежит в папочке, к которой прописаны пути в настройках апача. Так же есть база данных и конкретно phpmyadmin для неё, который допустим висит на локалхосте. Теперь я хочу чтобы всё это моё дело вышло в свет. Беру хостинг, заливаю туда папочку своего сайта и... Что делать с базой? Где она должна быть? Она отдельно хостится? Я ни разу не выкидывал в продакшн проекты.
Аноним 10/02/17 Птн 14:04:53 #512 №930134 
PHPч, ПАМАГИ!
Помогите оценить время и стоимость следующей работы:
Нужен сайт - обменник криптовалюты
Предполагается:
1. Сверстать сайт под популярные браузеры из небольшого количества страниц без излишеств, никаких WebGL, Unity и прочих монстросити, но при этом не совсем голый html, допустим используется какой нибудь bootstrap
2. Настроить взаимодействие с некоторыми банками для транзакций (у некоторых, вполне возможно, есть API для php, у некоторых может и нет)
3. Настроить взаимодействие кошельков с криптовалютой для транзакций.
4. Настройка БД для логгирования различных действий (транзакции-шманзакции)
5. Смазать всё это дело защищенным соединением (HTTPS все дела)

При условии:
Разрабатывается в одно ебало, нет возможности работать в фул-тайм, где то половина-3/5 рабочего дня.

Хочу услышать большое количество времени, сколько при таких условиях ушло бы времени на разработку именно у ТЕБЯ и сколько бы денег в качестве оплаты запросил именно ТЫ.
Аноним 10/02/17 Птн 14:49:43 #513 №930157 
>>929966
Ну вот, у меня не получается это сделать.
Аноним 10/02/17 Птн 14:51:12 #514 №930158 
>>930105
Ну что у тебя за хостинг.
Например обычные веб-хостинги предоставляют панель управления. Такой же phpmyadmin.
Делаешь бекап своей базы, заливаешь его на хостинг.
Прописываешь пути подключения и все.
Аноним 10/02/17 Птн 15:00:42 #515 №930163 
>>930134
Смотря сколько секунд потратил на работу. Стандартный прайс для фрилансера 300к в секунду.
Аноним 10/02/17 Птн 15:02:56 #516 №930164 
>>930163
А-а-атличная шутеечка, братан.
Аноним 10/02/17 Птн 15:10:42 #517 №930166 
>>930164
А какого ты ответа ждешь? Чтобы я тебе сказал сколько ты должен брать за джобу? Ну пиздец, чо. Требуй с него 1 дошик, если долго будешь делать, а есть быстро, то два.
Аноним 10/02/17 Птн 15:13:24 #518 №930167 
>>930166
>Чтобы я тебе сказал сколько ты должен брать за джобу?
Я попросил просто примерную стоимость описанной работы. Я же не прошу тут бухгалтерские расчёты вести и проводить серьёзную аналитику. Просто примерная цена или диапазон ну без фантазий конечно, типа 300 мильёновтыщ в секунду/доширак и свистнуть в хуй исходя из вышеописанных условий.
Аноним 10/02/17 Птн 15:25:23 #519 №930172 
>>930167
Пиздос, ты знаешь всю ситуацию, представляешь себе заказчика и не выкладывая никакой инфы по своим скилам, платежеспособности заказчика и примерном времени выполнения тобой джобы, спрашиваешь у анона сколько тебе заломить с заказчика.
Если ты считаешь, что заказчик может соскочить, и он из страны, где о рублях не слыхали, то стартуй из расчета 15 баксов в час.
Но это совет в стиле: 'Секс переоценен, я на дваче читал'. Только ты владеешь инфой и ты можешь трезво оценить всю хуйню. Короче я заебался писать, проси у него 3 дошика.
Аноним 10/02/17 Птн 15:27:56 #520 №930176 
>>930172
Отлично, так и запишем. "Три дошика".
Аноним 10/02/17 Птн 16:31:03 #521 №930216 
>>926220
>>Doctrine
>Даже после прочтения сложных определений в гугле не до конца понимают что это такое. Оно заменяет Mysql или любую другу БД?
На этот вопрос отвечать не нужно - ознакомился чуть подробней.
Аноним 10/02/17 Птн 16:36:09 #522 №930220 
Товарисчи, до сих пор ебусь с задачкой про компанию Вектор.
Вроде бы основную логику сделал, сейчас с выводом информации на экран мучаюсь
http://ideone.com/3uQv9G - вот код
Вопросы:
1) Какого хера мне выдает ошибку "PHP Fatal error: Uncaught Error: Call to undefined function mb_strlen() in /home/z65BF4/prog.php:200" ??? Делал ведь предыдущую задачу про эту компанию, с этими же функциями и всё работало...

2) Как бы так красиво, в ООП стиле оформить вывод информации на экран и сам экшон (заполнение компании департаментами, тех сотрудниками и подсчет всего, что необходимо по условиям задачи) ?
Аноним 10/02/17 Птн 17:04:05 #523 №930234 
14866713155770.webm
>>930220
1) mb_internal_encoding('utf-8');
Но ideone выебывается и всеравно выдает какую-то хуйню. Проверил на сервере - все работает.

2)Попробуй выводить рамку из черточек и слешей. Реализация примерно такая:

function padRight($text, $col)
{
return $text.str_repeat(' ',$col-mb_strlen($text));
}
function padLeft($text, $col)
{
return str_repeat(' ',$col-mb_strlen($text)).$text;
}

function printData($company, $headline)
{
$col1 = 20;
$col2 = 8;
$col3 = 12;
$col4 = 12;
$col5 = 12;
$col6 = 12;
$col7 = 50;
if($headline == 0){
echo padRight("Департамент", $col1) .
padLeft("сотр.", $col2) .
padLeft("тугр.", $col3) .
padLeft("кофе", $col4) .
padLeft("стр.", $col5) .
padLeft("тугр./стр.", $col6) . "\n" .
str_repeat("==", 40) . "\n";
}
И далее через foreach
padRight(имя департамента, $col1)
padLeft(количество чего-то, $col2-7)
Аноним 10/02/17 Птн 17:24:02 #524 №930244 
14862766094950.webm
>>930220
>>930234
Сорян, не сразу понял второй вопрос.
Можно создать отдельный класс для заполнения сотрудниками. А выводить на экран лучше, создав функцию по типу той, что я описал выше.
Аноним 10/02/17 Птн 19:32:50 #525 №930322 
>>919065

https://jsfiddle.net/akua0tr6/

Переделал 4ую js задачу с селекторами, ушел дальше ковырять MVC сапера. Вот твой предыдущий ответ из прошлого треда, если последний утонет: http://pastebin.ru/a1sx1IT2 , предыдущее решение: https://jsfiddle.net/82228qnq/
Аноним 10/02/17 Птн 19:33:42 #526 №930323 
>>930322

Она по прежнему в легком варианте, если что.
Аноним 10/02/17 Птн 20:04:26 #527 №930337 
14859743774940.jpg
http://ideone.com/oZw7mB - Айфон в кредит.
Доброго времени суток, я тут ебусь с задачей про айфон в кредит и не могу понять какого хуя оно что-то плюсует к долгу, вместо того, чтобы отнимать от него месячную стоимость.
Это происходит с разными данными. Например, с оригинальными данными 40к кредит, 5% процент и 1к комиссия, 5к месячная плата считает как надо, пробовал числа по-меньше - считает то нормально, то опять плюсует неизвестные числа. Сейчас в ней поставлены другие значения, а не оригинальные, дабы было понятно что за хуйня.
Может кто знает в чём ошибка и где я обосрался, помогите.
Аноним 10/02/17 Птн 20:05:30 #528 №930340 
>>930337
Блять, там оригинальные данные.
Те что я тестирую, вот http://ideone.com/sgq4lu
Аноним 10/02/17 Птн 20:41:07 #529 №930360 
>>930340

for (months=0;credit>0;months++)
{
credit = credit*percent+service-payment;
if (credit<payment) {
spent += credit;
months++;
break
} else { spent+= payment}
так же проще. если я не проебался нигде, еду с универа только
Аноним 10/02/17 Птн 21:35:39 #530 №930386 
Снимок.JPG
>>929607
>>929596
Вот, спасибо, я понял.

Аноним 10/02/17 Птн 23:16:54 #531 №930486 
>>930134
Я б сделал примерно за 2-3 месяца, может меньше. Но я не начинающий. Если хуефрилансера с сайта нанять, то может и на год растянуться и забаговано все будет. Самая сложная часть криптовалюты и как с ними взаимодействовать, остальное достаточно просто и стандартно. Запросил бы 10к баксов.
Аноним 11/02/17 Суб 00:01:59 #532 №930538 
14865974346950.jpg
Помогите установить Git, мне на курсах скинули инструкцию по установки, но я ничего не понял.
Умоляю, помогите
Кто-то работал с ним?

Аноним 11/02/17 Суб 00:19:31 #533 №930547 
>>930538
sudo apt install git
Шелл для спермы можешь нагуглить, их много. Главное GUI не используй, хотя бы первое время. Учись работать с консолью.
Аноним 11/02/17 Суб 00:35:18 #534 №930554 
Правильно ли понимаю, что по принципу Лисков, если наследник переопределяет не абстрактный метод, то он обязан вызвать родительский? Понял принцип так: "Вместо родителя всегда можно подставить наследника и код должен работать как и прежде".
Заодно напомню о скидках: https://ideone.com/IscxDU
Аноним 11/02/17 Суб 01:05:23 #535 №930588 
14847367106430.jpg
>>930547
>Windows: C:\Users\{LoginName} - Открываем контектное меню и выбираем пункт Git Bash
Что за LoginName?можешь дать почту или линк вк?то я тупой
Аноним 11/02/17 Суб 01:08:01 #536 №930593 
>>930554
По принципу Лискова ты не можешь менять методы в классах-детях, которые были определены в родителе. Иначе ребенок уже не соответствует родителю, и ты не можешь заменить им родителя. Весь смысл наследования теряется. Конструктор к примеру если определен в родителе с параметрами, то он такой же и в детях, нельзя его переопределять под другие параметры.
Аноним 11/02/17 Суб 01:12:00 #537 №930595 
>>930593
К тому же это фукнциональности касается, да. Если к примеру был метод turnPage($number), который менял страницу, то если в ребенке у тебя turnPage не меняет страницу, а делает что-то другое, то это нарушение по Лискову.
Аноним 11/02/17 Суб 01:19:53 #538 №930609 
>>930593
> Иначе ребенок уже не соответствует родителю, и ты не можешь заменить им родителя. Весь смысл наследования теряется.
И правда.

> Конструктор к примеру если определен в родителе с параметрами, то он такой же и в детях, нельзя его переопределять под другие параметры.
Выходит, что parent::__construct() это плохо? Набросал простой пример, когда, вроде бы, принцип Лисков не нарушается, даже невзирая на то, что конструктор в наследнике переопределён: https://ideone.com/JBf2VC
Аноним 11/02/17 Суб 01:43:36 #539 №930625 
>>930609
Нет, почему? Если у тебя __construct в ребенке принимает все те же параметры, что и parent::construct, то можно расширять. Это соответствует open-closed principle - ты не меняешь parent, а расширяешь его функциональность в ребенке. При этом функциональность parent остается нетронутой, ведь его __construct работает так же как и прежде.
Аноним 11/02/17 Суб 01:44:51 #540 №930626 
>>930625
Сорь, непонятно написал - функциональность parent:__construct остается той же в ребенке, значит лисков и open-closed principle выполняются.
Аноним 11/02/17 Суб 01:46:28 #541 №930627 
>>930588

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

Если ты не используешь экран входа при загрузке, то скорее всего это что-то вроде c:\Users\Администратор

Если не знаешь точно, зайди в c:\Users и посмотри, что там есть.

>>930554

Не обязан. Разве что в конструкторе почти всегда приходится это делать (например, потому что он инициализирует private поля, которые по-другому не инициализировать).

>>930593

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

К конструктору это не относится, конструктор можно менять как угодно. На него правило Лисков не распространяется, так как оно относится к уже созданным объектам, а конструктор мы вызываем когда объект еще не создан.

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

- http://al-zatv.livejournal.com/52115.html
- http://sergeyteplyakov.blogspot.ru/2014/09/liskov-substitution-principle.html

>>930625

К конструктору требование совместимости не относится. Так как конструктор никто не вызывает на уже созданных объектах. Принцип Лисков говорит о совместимости созданных объектов, а не классов.
Аноним 11/02/17 Суб 01:48:31 #542 №930631 
>>930609
В твоем примере лисков как раз нарушен - ты в ребенке принимаешь другое число параметров чем в родителе. Теперь ситуация - ты где-то юзаешь ребенка, а понадобилось заменить родителем. Ты этого сделать больше не сможешь - вызовет ошибку из-за несоответствия количества параметров.
Аноним 11/02/17 Суб 01:51:58 #543 №930633 
Обратите внимание на формулировки например из статьи: http://sergeyteplyakov.blogspot.ru/2014/09/liskov-substitution-principle.html

> ..если для каждого объекта o1 типа S существует объект o2 типа T такой, что для всех программ P, определенных в терминах T, поведение P не изменяется при замене o2 на o1, то S является подтипом (subtype) для T.

> Говорят, что экземпляр наследника также ЯВЛЯЕТСЯ экземпляром базового класса, что выражается в возможности использования экземпляров наследника везде, где ожидается использование базового класса.

Видите, речь идет об объектах. Условно говоря, если у вас есть функция

function doSmth(A $a) { ... }

Что это значит? Значит, что эта функция должна обращаться только к полям и методам, которые есть в классе A.

Но вы в нее можете передать объект класса B, наследующегося от A, и все должно работать. То, что у него другой конструктор - это не проблема, так как вызываете вы его за пределами функции. Сама функция констурктор у $a не вызовет, так как это уже созданный объект.
Аноним 11/02/17 Суб 01:52:41 #544 №930634 
>>930627
>К конструктору требование совместимости не относится. Так как конструктор никто не вызывает на уже созданных объектах. Принцип Лисков говорит о совместимости созданных объектов, а не классов.

Если создаешь объекты в цикле, и попал родитель и ребенок - будет ошибка. Тебе в каждом цикле придется смотреть, чтобы не создавался объект с 3 параметрами, а это уже кривой код. Код должен быть защищен от ошибок на уровне интерфейса.
Аноним 11/02/17 Суб 01:52:50 #545 №930635 
>>930631

Принцип Лисков относится к уже созданным объектам, и не распространяется на конструктор.
Аноним 11/02/17 Суб 01:57:00 #546 №930638 
>>930634

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

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

- https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF_%D0%BF%D0%BE%D0%B4%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B8_%D0%91%D0%B0%D1%80%D0%B1%D0%B0%D1%80%D1%8B_%D0%9B%D0%B8%D1%81%D0%BA%D0%BE%D0%B2
- http://sergeyteplyakov.blogspot.ru/2014/09/liskov-substitution-principle.html

Аноним 11/02/17 Суб 01:59:06 #547 №930639 
>>930638
>Саттер и Александреску в своём руководстве по использованию C++ для выражения этого принципа также используют фразу «подкласс не должен требовать от вызывающего кода больше, чем базовый класс, и не должен предоставлять вызывающему коду меньше, чем базовый класс».

В случае конструктора с расширеными параметрами подкласс как раз требует больше, чем базовый класс. Прямое нарушение.
Аноним 11/02/17 Суб 02:07:29 #548 №930643 
>>930639

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

Если почитать исходное определение, то там речь идет о созданных объектах.

>>930634

Если ты имеешь в виду код вида $x = new $class, то это уже твоя проблема, что ты используешь такую конструкцию. Надо использовать if/else или switch ($class) ... и проблемы не будет. Или делать еще и конструкторы совместимыми.

>>930609

Принцип Лисков у тебя никак не нарушен. Объекты совместимы, а конструкторы не обязаны быть совместимыми.


Аноним 11/02/17 Суб 02:07:38 #549 №930644 
>>930547

в чем прикол консоли? Гуи = тот же функционал, но быстрее и нагляднее же.
Чсв повышать? Симулировать линукс?
Аноним 11/02/17 Суб 02:09:24 #550 №930645 
>>930643
>Принцип Лисков не распространяется на конструкторы.
В исходном определении речь идет о types и subtypes, которые по сути и есть классы и подклассы.
>We add to a type’s
specification a constraint clause that captures exactly those history properties
of a type that must be preserved by any of its subtypes, and we prove that each
of the type’s methods preserves the constraint.
Аноним 11/02/17 Суб 02:10:43 #551 №930646 
Screenshot14.png
14683463696720.png
>>930627
Cпасибо, что отвечаешь добрый анон), но тут ничего нет.
Может скинешь линк свой?
Аноним 11/02/17 Суб 02:14:22 #552 №930647 
Есть курс по ПХП, можно выбрать дистанционные обучение и или в офисе с группой, что лучше выбрать?
Плюс с группой только то что английский есть
Аноним 11/02/17 Суб 02:35:54 #553 №930658 
>>930638
>http://sergeyteplyakov.blogspot.ru/2014/09/liskov-substitution-principle.html
На этой странице тоже пишут:
>Если посмотреть на исходное описание принципа подстановки в трудах Барбары Лисков, то можно с удивлением обнаружить, что оно полностью основано таких понятиях, как предусловия, постусловия и инварианты. Другими словами, описание этого принципа полностью основано на принципах проектирования по контракту:

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

Изменения конструктора нарушает эти правила, в частности первое.
Аноним 11/02/17 Суб 02:59:59 #554 №930671 
>>930554

> $matchedProducts = $discountResult->getMatchedProducts();
> $matchedPrice = $matchedProducts->reduce($pricesSum, 0);
> $totalPrice += $matchedPrice - $matchedPrice $discountResult->getPercent();
Вот тут ты накладываешь много ограничений на расчет скидки, вместо того, чтобы отдать это объекту скидки. Ну например, ты требуешь, чтобы все скидки были в процентах, и не даешь возможности написать произвольный алгоритм расчета скидки. Мне кажется, если бы вместо этого мы могли передать набор товаров в скидку и получить абсолютную скидку либо итоговую сумму, было бы гибче.

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

Метод getDiscountResult я бы переименовал в calculateDiscount/applyDiscount, так точнее получается.

> class CombinationDiscount implements DiscountInterface
> public function getDiscountResult(ProductCollection $notUsedProducts) {
...
> $notUsedProducts->removeProduct($matchedProduct);
Вот это неожиданно. Я думал, что функция getDiscountResult не изменяет исходные данные, а она изменяет, причем это нигде никак не написано. Это может привести к ошибкам, например, если мы вызовем ее 2 раза с одними и теми же данными (например чтобы сделать вывод отладочной информации), то второй раз она вернет другие значения.

Тем более название начинается с get...

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

А, и еще. А что, если в цикле тут название первого товара есть в списке, а второго нет?

> foreach ($this->names as $name) {
...
> if ($matchedProduct) {
> $notUsedProducts->removeProduct($matchedProduct);

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

> return new DiscountResult(new ProductCollection(), $this->percent);

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

----

Я хочу еще немного отвлечься и рассказать про такую вещь, как exception safety, или "безопасность" исключений (корректность работы программы в случае выброса и перехвата исключения в любом месте кода). Эта тема важна только в программах, которые часто перехватывают и обрабатывают исключения (имеются в виду исключения, не говорящие об ошибке в коде, а например, об ошибке соединения с удаленным сервером), что редко встречается на практике, но тем не менее интересна.

Предположим, что у тебя строка $productsUsedInThisDiscount->addProduct($matchedProduct); может выбросить исключение и выполнение методы getDiscountResult прервется. При этом переданный список будет уже изменен, и удаленные продукты при повторном вызове метода не будут участвовать в расчете скидок. То есть безопасность программы при возникновении исключения нарушена.

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

В этой статье https://habrahabr.ru/post/126374/ упоминается "строгая гарантия". Если бы метод не менял исходные данные, он бы реализовал "строгую" гарантию безопасности исключений.

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

----

> return new DiscountResult(new ProductCollection(), 0);
Если это часто встречается, стоило добавить конструктор DiscountResult::makeEmpty();

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

> $answer = (200 - 200 0.1) + (200 - 200 0.05) + (200 - 200 0.05) + (400 - 400 * 0.01) + 100;
> assert($answer == $c->calculateTotalPrice($discountCollection, $productCollection));
Вот тут есть момент, на который стоит обратить внимание. Дело в том, что в PHP дробные числа (float) хранятся приближенно (да еще и в двоичном виде, что требует преобразований в/из десятичной системы счисления), и операции с ними неточные. Ну например:

> var_dump(0.1 + 0.2); var_dump(0.1 + 0.2 === 0.3);
> double(0.3)
> bool(false)

o_0 как так?

Дело в том, что в двоичной форме число 0.3 - это бесконечная дробь. Там на самом деле 0.1 + 0.2 дают что-то вроде 0.29999999, просто при выводе оно округляется до красивого числа. А вот при сравнении видимо где-то в последнем разряде получается разница.

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

- https://habrahabr.ru/post/112953/
- http://floating-point-gui.de/errors/comparison/ (англ)
- тут еще интересный случай https://habrahabr.ru/post/247015/ (в PHP такое может возникнуть при сортировке по произвольному условию)

В общем, задача у тебя решена неплохо (кроме проблемы с измненением исходных данных), надеюсь, ты стал чуть лучше разбираться в ООП.
Аноним 11/02/17 Суб 03:15:16 #555 №930679 
>>930644

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

Вот простая книжка по git: https://git-scm.com/book/ru/v1

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

>>930645

Можешь процитировать определение целиком? Я нахожу только такое:

https://en.wikipedia.org/wiki/Liskov_substitution_principle

> Subtype Requirement: Let \phi (x) be a property provable about objects x of type T. Then \phi (y) should be true for objects y of type S where S is a subtype of T.

Тут упомянуты объекты.

>>930646

Ну я вижу папку "Администратор". Думаю, надо зати в нее, щелкнуть правой кнопкой на пустом месте и выбрать "Git bash here " или как-то так.

Также git bash можно запустить через меню Пуск.

Если что, в ОП посте есть гайд по использованию консоли, советую изучить.

И в след. раз пиши больше подробностей:

- ссылку на гайд
- что ты сделал
- что не получилось

А то угадывать приходится.
Аноним 11/02/17 Суб 03:17:39 #556 №930680 
>>930645

И можно еще простой пример кода, где было бы видно нарушение принципа подстановки Лисков при различии в конструкторах?
Аноним 11/02/17 Суб 03:58:19 #557 №930686 
>>930386

$db = chr($db - 1);

Это смотрится очень странно. Почему ты в одной переменной хранишь то число, то символ?

И названия $db, $bd неудачные, легко перепутать. Сам же перепутаешь и будешь спрашивать, что не так.

$findMissingLetter -> $letters

>>930360

Так неправильно, ты в последний месяц выплатишь больше 5000 в сумме за раз.

>>930337

А где ошибка? У тебя по моему просто за месяц набегает больше процентов чем анон может выплатить. Потому он никогда этот кредит не вернет.

Алсо видел новость, что микрофинансовая организация сначала выдала кредит под 290% годовых, а потом, когда должник не смог выплатить, передоговорилась на 2300% годовых. https://rg.ru/2017/02/08/reg-pfo/mikrofinansovaia-organizaciia-potrebovala-2379-procentov-godovyh.html

2300 годовых - значит долг через год будет в 24 раза больше исходной суммы.

Так что в моей задаче все еще по-божески.

>>930322

> function collectionToArray(collection) {
> return Array.prototype.slice.call(collection);
Кстати, если хочется извернуться с функциональным программированием, то можно написать так:

var collectionToArray = Array.prototype.slice... (дальше подумай сам)

> function getElemByIdWithContext(selector, context) {
> return getElementsByProperty("id", selector, context);
Тут неточность, при поиске по id надо сравнивать строку целиком, а не искать в ней частичное совпадение. Решить проблему можно функциональным программированием (которое тебе уже возможно успело надоесть в первых задачах) и отделением функции обхода дерева от функции проверки элемента:

var id = 'lalala';
findElementsRecursively(context, function (el) {
return el.id == id;
});

Или

findElementsRecursively(context, 'id', id, function (prop, value) {
return prop === value;
});

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

var findById = partialAny(findElementsRecursively, undefined, 'id', undefined, function (prop, value) ...);

findById(context, id)

Так, в общем, задачу можно считать решенной.

Аноним 11/02/17 Суб 04:05:11 #558 №930687 
>>930680
http://ideone.com/U1QFQk
>Fatal error: Uncaught ArgumentCountError: Too few arguments to function ChildClass::__construct(), 0 passed in /home/lpoSIT/prog.php on line 28 and exactly 2 expected in /home/lpoSIT/prog.php:20
Аноним 11/02/17 Суб 04:10:35 #559 №930689 
>>930220

Суть задачи тут все же в определении классов, как ты сделаешь вывод - не так принципиально. Можно просто функцию сделать, класс, или так написать.

Если тебе хочется ООП подход, то обычно это делается через классы для построения отчетов. Я бы сделал класс например StatReporter такого вида:

$reporter = new StatReporter;
$reporter->printReport($company);

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

> PHP Fatal error: Uncaught Error: Call to undefined function mb_strlen()
На сайте не включено расширение mb_string. Видимо что-то сломали. Попробуй другой сайт.

Например http://sandbox.onlinephpfunctions.com/code/481086d900d41eac5344b4194eb32dcf63926e95

Я бы советовал вместо setDepartments сделать addDepartment, так удобнее будет.

> $production = $this->getBaseProduction();

> if($this->isBoss) {
> $production = 0;
> }
> return $production;

Можно чуть сократить (без фанатизма):

return $this->isBoss? 0 : $this->getBaseProduction();

Создавать сотрудников удобно, сделав массив вида

[['Engineer', 1, 3], ...]

или

['3en1', '2ma3', ...]

Аноним 11/02/17 Суб 07:05:11 #560 №930694 
Screenshot16.png
>>930679
Я вел в терминале (bash), ключ, но он что-то не открывается
Аноним 11/02/17 Суб 10:42:48 #561 №930724 
>>930686


> Так неправильно, ты в последний месяц выплатишь больше 5000 в сумме за раз.

чойта? Код прекращается до Завершения этого цикла.
Аноним 11/02/17 Суб 10:44:44 #562 №930725 
>>930679

ну, не знаю. Я пробовал и с консолью пол года, и на ГУИ. Гуи удобнее и нагляднее, а с консолью иногда казусы. Мне кажется, гуи дает полный необходимый для работы функционал, потому что большей частью фич гита никто не юзает, да и мало там прям таких извращенных штук.
Аноним 11/02/17 Суб 11:50:42 #563 №930749 
>>930686
Ага, я вчера тоже заметил такую хрень, когда просто менял саму сумму долга, а не долго+проценты и комиссия. Если меня только её - всё норм считает, так что можно считать что оно вроде бы правильно работает, хех. Но спасибо таки за ответ.
Аноним 11/02/17 Суб 13:52:12 #564 №930814 
>>925461
>>925484
>>925772

Напомню опу про серию вопросов по саперу.
Аноним 11/02/17 Суб 15:48:36 #565 №930920 
>>930216

Почитай еще мой урок https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md

>>930134

Не совсем то, но могу дать хорошую статью про ценообразование: http://russian.joelonsoftware.com/Articles/CamelsandRubberDuckies.html

А так, это определяется рынком. Заказчик хочет заплатить как можно меньше и точно не больше, чем он получит прибыли от проекта. Исполнитель хочет получить как можно больше (те самые 300 к в секунду), но чтобы выиграть, он должен попросить меньше других. Но при этом нет смысла брать меньше, чем можно получить за другую работу.

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

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

В общем, учись считать.

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

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

Аноним 11/02/17 Суб 15:54:34 #566 №930924 
>>930694

Поясни, куда ты его ввел?

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

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

Не очень понятно, что ты делал дальше и что не получилось.

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

Ну и конечно плохо, что ты сам не понимаешь, что делаешь.
Аноним 11/02/17 Суб 15:59:07 #567 №930927 
>>930687

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

Твой код должен быть переписан так:

if ($class == 'ParentClass') {
$obj = new ParentClass(...);
} elseif (...) {
...
}

Или так:

$createParent = function () { return new ParentClass(...); };
$createChild = function () { ... };

$constructors = [$createParent, $createChild, ...];

Принцип Лисков тут вообще не при чем. Ошибка именно в твоем коде, так как когда ты пишешь

$object = new $class();

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

Аноним 11/02/17 Суб 17:38:00 #568 №931015 
>>930927
http://ideone.com/hrLgHQ
Вот еще одно нарушение, уже без имени класса из переменной. Конструктор с другими параметрами ломает метод create() в классе-наследнике. Клиентский код ожидает, что метод будет работать, как и должен в родителе - по принципу Лискова. Но он не работает, тот же самый Fatal error.
Аноним 11/02/17 Суб 17:57:12 #569 №931035 
>>931015

Да, верно, получается что при использовании new static в предке наследники обязаны сохранять совместимость конструктора. То есть не всегда, а только в таких отдельных случаях.

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

Добавлю еще, что new static - это изобретение разработчиков PHP (которые по моим ощущениям ООП вообще плохо понимают), мне оно не нравится, в других языках вроде Java такого бардака нет.
Аноним 11/02/17 Суб 18:05:03 #570 №931044 
>>931015

Только вот пример коду у тебя опять неудачный. зачем ты там нагородил статических методов? LSP он про объекты, а не про вызовы статических методов. И он не гарантирует что статические методы потомка совместимы с предком.

Ты сам похоже пока плохо LSP понял.

Метод create должен быть не-статический. Должно быть так:

class Parent
{
public fnction __construct() {}
public function test()
{
return new static;
}
}

class Child extens Parent
{
public function __construct($a, $b, $c) {}
}

function doSomething(Parent $p)
{
$p->test();
}

$o = new Parent();
doSomething($o); // ок
$o = new Child(1, 2, 3);
doSomething($o); // ошибка

Вот этот код иллюстрирует вредность использования new static.

В общем, вся проблем в нестандартных особенностях PHP, помогающих стрелять себе в ногу.
Аноним 11/02/17 Суб 18:59:34 #571 №931080 
>>931044
Хм, да, должна быть функция, которая объект принимает, чтобы было где тип родителя указать. Тогда вот так:
http://ideone.com/zC5nTV
Статические методы в PHP к объекту тоже применяются, значит принимающая объект функция тут же ломается, Лисков нарушен.
Аноним 11/02/17 Суб 20:13:08 #572 №931178 
>>931080

Ты опять полагаешься на странности PHP. Вот в этом коде: $object::method()

Это уже не ООП, а какое-то издевательство над ним. Статические методы и поля относятся к классу, а не к объекту, и вызываются на нем.

Ты должен писать ParentClass::method() для вызова статического метода.

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

Про моему это просто код, написанный в плохом стиле.

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

Например, в Яве сделано по-другому. Там вызвается тот метод, который объявлен в тайп-хинте. То еть в функции:

public void doSomething(Parent p)
{
p.staticMethod();
}

Всегда будет вызван Parent::staticMethod() независимо от того, какой мы объект передадим. И правильно, нечего использовать статические методы не по назначению.
Аноним 12/02/17 Вск 00:43:48 #573 №931307 
Спалю вам парочку годных сайтов
http://www.codingcage.com

http://www.itechempires.com
Аноним 12/02/17 Вск 01:23:48 #574 №931322 
>>930814

Пополняю серию. Правильно ли я установил события? http://ideone.com/GY8kav Ориентировался на твои слова:

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

> Чтобы узнавать о кликах по полю, контроллеру надо как-то подписаться на события. Это достаточно сделать один раз, перед игрой. Он может ставить обработчики событий напрямую, но наверно лучше делать это через представление, чтобы за работу с DOM, поиск нужного элемента отвечало оно.
https://github.com/masssn/students.loc Аноним 12/02/17 Вск 01:41:59 #575 №931331 
>>903250
>>921309
>>904635

К сожалению, совсем забыл проверить этого анона, исправляюсь.

https://github.com/masssn/students.loc/blob/master/db%20config.ini
В конфиг имеет смысл помещать только то, что может менять пользователь. Опция driver тут явно лишняя, так как твой код скорее всего заточен под опредленную базу данных и с другой работать не будет, значит не надо давать ее выбирать.

https://github.com/masssn/students.loc/blob/master/students.sql#L31
Для имени TEXT - это слишком много. Также, на поля TEXT нельзя ставить индексы. Тут надо сделать VARCHAR и указать макс. длину.

> `gender` enum('Мужской','Женский')
Тут принято использовать латинские идентификаторы. Для них также стоит сделать константы в коде.

> `group_number` text NOT NULL,
Тут надо ограничить длину. Вообще, почитай про типы полей в MySQL.

> email` varchar(20)
20 символов это недостаточно для email

> `password` varchar(8) NOT NULL
8 символов для токена это маловато. Также, надо добавить с помощью слова COMMENT комментарий, что хранится в этом поле, чтобы другим людям было проще разобраться в твоей базе. Вот урок про комментарии: https://github.com/codedokode/pasta/blob/master/db/comments.md

Также, у тебя все файлы, включая конфиг БД, лежат в публичной папке. Если кто-то откроет URL http://example.com/db%20config.ini то он увидит пароли базы данных. Лучше сделать отдельную публичную папку, а все остальное разместить снаружи, почитай, это описано в комментариях к задаче.

https://github.com/masssn/students.loc/blob/master/app/autoload.php
Я не советую полагаться на getcwd(). Он же может быть разный. Лучше использовать константу __DIR__.

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

class_exists('Test');

У меня есть урок по автозагрузке: https://github.com/codedokode/pasta/blob/master/php/autoload.md

https://github.com/masssn/students.loc/blob/master/app/controllers/Controller.php#L29
тут не очень хорошо сделано. Если ты хочешь требовать регистрацию, то надо не выводить форму на любой странице, а делать редирект на страницу регистрации. Если ты хочешь потом вернуться назад, то надо еще передавать URL исходной страницы (а перед редиректом назад проверять, что он на твоем сайте, иначе это будет открытый редирект).

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

В методе action лучше было проверять весь URL, а не только первую часть. У тебя получается для одной страницы множество URL, что в общем-то плохо: /index/1, /index/2 и так далее. Лучше когда у страницы ровно один URL.

https://github.com/masssn/students.loc/blob/master/app/controllers/Controller.php#L152
Ошибка 404 сделана не совсем правильно. Ты должен отдавать HTTP код ответа 404, чтобы роботы и программы видели, что там ошибка.

- https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%BA%D0%BE%D0%B4%D0%BE%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F_HTTP

В PHP код ответа можно задать с помощью функции header().

Также, ты при выводе данных из $_SERVER не используешь htmlspecialchars. Из-за этого может быть XSS уязвимость.

В форме регистрации у тебя при ошибке не сохраняются введенные данные. В комментариях к задаче есть советы по работе с формами, и есть урок https://github.com/codedokode/pasta/blob/master/forms.md

Также, это вообще неправильно:

> $params = \app\DataHelper::makeSafeDatas($params);

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

Перечитай мои уроки по XSS и SQL и сделай правильную защиту:

- https://github.com/codedokode/pasta/blob/master/security/xss.md
- https://github.com/codedokode/pasta/blob/master/security/sql-injection.md

https://github.com/masssn/students.loc/blob/master/app/views/View.php
Тут не очень понятно, для чего предназначен массив $attributes. Ну например в контроллере ты часть данных передаешь через добавленные динамически свойства, а часть напрямую:

> $this->view->pages = $navDatas["pages"];
> $this->view->setAtributes($params);
Не очень понятно, почему так сделано.

Удобнее наверно просто передавать значения для подстановки в шаблон в виде массива в метод display(), а там извлекать их с помощью extract().

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

https://github.com/masssn/students.loc/blob/master/app/DataHelper.php#L11
В методе validate ты не проверяешь, что в массиве есть такие поля. Может быть ошибка если часть полей не будет передана в POST.

> if (!filter_var($datas['birth_year'], FILTER_VALIDATE_INT) && mb_strlen($datas['birth_year']) > 5 || mb_strlen($datas['birth_year']) < 4 || preg_match("^[A-z]^", $datas['birth_year'])) {
Слишком много условий. Проще либо написать одно рег. выражение либо проверить что число в диапазоне между X и Y.

Аналогично с суммой баллов, лучше проверить что это число и что оно в определенном диапазоне.

Не очень понятно, почему у тебя везде передаются массивы. Не лучше ли сделать объект-модель студента и везде передавать его? В функцию валидации, в форму, в функцию сохранения в БД. Массив плох тем, что непонятно, какие в нем есть поля, а каких нет.

Класс DataHelper надо переименовать, например в StudentValidator.

Имена неймспейсов принято писать с большой буквы. app можно было и не писать вообще.

https://github.com/masssn/students.loc/blob/master/app/Pager.php
Плохо что этот класс лезет в GET. Ты жестко его привязал к внешним данным, и не позволяешь просто передать номер страницы как переменную.

Неправильно писать datas, так как data это уже множественное число. Вообще, у тебя неудачно выбрано название функции: getNavDatas. Слово data не дает никакой полезной информации, так как любая функция работает с данными. Надо лучше выбирать названия для функций, чтобы они соответствовали предназначению функции.

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

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

Контроллер поиска и вывода списка студентов можно объединить в один. Аналогично можно объединить регистрацию и редактирование.

https://github.com/masssn/students.loc/blob/master/app/Singleton.php
Зачем это? Не надо использовать паттерны там, где это не нужно. Есди ты хочешь изучить паттерны, изучи код библиотек вроде Symfony Forms или Doctrine, почитай книгу Фаулера (шаблоны разработки корпоративных приложений) и посмотри как их надо использовать на реальных примерах, а не читай статьи от тех, кто дальше синглтона ничего не понял.
https://github.com/masssn/students.loc Аноним 12/02/17 Вск 01:43:05 #576 №931333 
>>903250
>>921309
>>904635


https://github.com/masssn/students.loc/blob/master/app/DB.php
Зачем нужен этот класс? Почитай про DI: https://github.com/codedokode/pasta/blob/master/arch/di.md

Также почитай про использование исключений, ты бездумно скопировал try/catch из какой-то статьи, не понимая, как он работает: https://github.com/codedokode/pasta/blob/master/php/exceptions.md

https://github.com/masssn/students.loc/blob/master/app/models/StudentsGateaway.php#L40
public function addStudent($params)
Эта функция написана неправильно. Она подразумевает, что ей будет передан массив содержащий строго определенные поля в определенном порядке. Причем этот порядок нигде не документирован. Стоит в форме переставить 2 поля местами, как все сломается.

Я советую передавать не массив, а объект студента с строго опредленным набором полей.

> setcookie('user_pass', $params["password"], time() + 3600000);
Есть принцип единой ответственности, каждый класс или функция должна выполнять свою задачу. Как установка куки связана с вставкой студента в БД? Никак, ее тут быть не должно вообще.

> public function getLastId()
Этот метод плох тем, что его можно вызывать только в опредленный момент, и это нигде не описано. Его тут быть не должно, если надо, то пусть функция вставки студента сохраняет куда-нибудь его id.

https://github.com/masssn/students.loc/blob/master/app/models/StudentsGateaway.php#L78
> public function getAll($sort, $start, $limit)
тут нет проверки, что в параметре sort разрешенные значения, а не какой-то вредоносный код. Перечитай урок про SQL инъекции.

> " LIMIT " . $start . "," . $limit;
Это надо было делать через плейсхолдеры.

> public function search($search, $sort, $start, $limit)
> :x IN(name, second_name, group_number, summary)
Для поиска надо использовать LIKE или что-то такое, так как твой вариант не позволяет искать по части фамилии.

> public function getCountBySearch($search)
> WHERE
> " . $search . "
Надо использовать плейсхолдеры.

https://github.com/masssn/students.loc/tree/master/app/views
Для шаблонов и классов надо сделать разные папки.

https://github.com/masssn/students.loc/blob/master/app/views/students_list_template.php#L10
> <td> <a href="/index/?sort=name&page=<?php echo $this->link; ?>">Имя</a></td>
Знак & нельзя просто так писать в HTML коде, это спецсимвол. Почитай про мнемоники (entities) в HTML.

> <a href="/index/?sort=<?php echo $this->sort; ?>&page=<?php echo $i;?>">[<?php echo $i?>]</a>
Не надо собирать ссылку по кускам. Лучше сделать функцию, которая ее генерирует.

Сапер Аноним 12/02/17 Вск 02:03:22 #577 №931338 
>>925461

По поводу сапера и словарей:

> MinesweeperGame.prototype._addCellToDict = function(x, y, dict) {
> MinesweeperGame.prototype._isCellInDict = function(x, y, dict) {

Тебе не кажется, что тут есть смысл сделать отдельный объект "двухмерный словарь" и писать dict.addCell(x, y) или dict.hasCell(x, y)?

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

>>925484

> И еще, стоит ли писать вот такую обертку вокруг метода реализации чтобы не кидать каждый раз свойства объекта ему в аргументы
Если сделать отдельный объект, будет красивее и исчезнет обертка:

MinesweeperGame.prototype.countFlags = function() {
return this._flags.count();
};

>>925772

> ...ты имел ввиду действительно двумерный массив ([ [true, false], [false, false], [false, true], [true, false]) или словарь ( {1: {1: true, 2:false}, 2: {1: false, 2: false}, 3: {1:false, 2: true})?
Если там могут отсутствовать клеточки, то словарь логичнее так как массив подразумевает что в нем все индексы есть, пропусков нет.

> Мне кажется, ты имел ввиду первое, а я делаю через второе и в некоторых местах трудности (например мучаюсь как создать мины при такой структуре чтобы не было вечного рандома. Когда у меня был массив объектов Cell я просто делал на него shuffle и превращал в мины n-ое количество равное числу мин).
Можно ограничить число попыток, либо можно сделать отдельный массив координат, перемешать его и выставить мины в словаре.

>>931322

> Правильно ли я установил события?
У меня была идея убрать всю работу с DOM во вью, чтобы контроллер про него ничего не знал. И работал не с натиными событиями браузера, а с искуственными событиями, сгенерированными вью. Это например дает такое преимущество, что изменения в верстке затрагивают только вью, а не контроллер.

> this._domView.setLeftMouseDownEventToCell(function(event) {
В общем да, нормально, только может функцию стоит как-то еще переименовать. Вроде addCellLeftClickListener, как-нибудь так.

> that._domView.setFaceType("danger-face");
Вот мне кажется, это должно называться по другому. Что обозначает значок? Что идет обработка события? Тогда логично назвать функцию как setIsBusy(true) или как-то так. И может быть, даже стоит сделать смену значка внутри view.

То есть мне кажется, лучше бы если вью просто выдавал событие клика по клеточке, а не отдельно mousedown/up. И чтобы контроллер не проверял e.which. И чтобы вью передавал в контроллер не event.target (который относится к DOM), а координаты. То есть я предлагаю всю работу с DOM и нативными событиями засунуть в вью, а из контроллера убрать. Разделить зоны ответственности.

Аноним 12/02/17 Вск 02:46:59 #578 №931351 
>>927560

> Все еще не ясно, что ты имеешь ввиду под использованием сервисов. В 83 треде ты писал, что:
>> $app['validator'] = function() use($app){return new App\Helper\Validator($app);};
>>Это по моему нарушение принципа DI, получается не DI, а Service Locator
> Нужно регистрировать сервис провайдеры или что?

Там проблема в том, что ты в сервис Validator передаешь весь $app целиком вместо указания конкретных зависимостей. Это паттерн ServiceLocator, и это описано в моем уроке по DI. В данном случае это плохо, никакого смысла так делать нет.

Надо так: new Validator($app->something, $app->em, $app->helper)

> 1 - я не храню пароль в базе, а в форме он должен быть
В Симфони сделано так: там можно добавлять в форму элементы, которые не соответствуют полям в entity, и потом их значения можно брать из этих элементов, по моему так:

$form = ...
$form->submit();
$password = $form->password->getValue();
$auth->setUserPassword($user, $password);
...

То есть часть полей идут напрямую в entity, часть остаются в форме.

> 2 - для проверки полей на UniqueValue() нужно установить doctrine bridge и doctrine bundle
Doctrine Bundle в силекс, я думаю, не поставить, так как это кусок фреймворка Симфони.

>>924780

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

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

> Если мы используем модель пользователя для регистрации, то зачем создавать отдельную модель для логина
Ну логин все же немного другое, на мой взгляд. Форма логина - это не заполнение информации о пользователе. Это что-то вроде формы поиска.

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

> Этот класс создан специально для того, чтобы проверить есть ли такая связка логин+пароль в базе, и если этот класс не может этого сделать, то зачем он тогда нужен?
Он нужен, но должен вызываться в другом месте. Не ставиться как валидатор для формы.

> Что значит использовать сервисы? У тебя есть уроки использования или примеры таких сервисов?
Сервис - это класс, который не представляет какую-то сущность, но содержит методы. Это довольно широкое определение получается, вот тут есть еще что-то по теме, но не очень понятно: http://design-pattern.ru/patterns/service-layer.html

Ну например мы можем сделать сервис для работы с БД:

class UserGateway {
public function insertUser(User $user);
...
}

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

Давай посмотрим сюда: https://github.com/anotherCodeMunkey/fileshare/blob/master/App/Controller/CommentController.php и параллельно вспомним чем должен заниматься контроллер в MVC.

У тебя он занимается:

- выводом данных (printComments, очень странная функция) - а должен заниматься view
- сборкой дерева комментариев (makeCommentTree) - а должна model (кстати используется неэффективный алгоритм, почитай потом урок https://github.com/codedokode/pasta/blob/master/db/trees.md )
- определением id текущего пользователя ($hash = $_COOKIE['fileshare'];) - а лучше сделать отдельную функцию для этого в отдельном сервисе авторизации
- генерацией ссылок (return $app->redirect("/download/$fileId");) - а лучше сделать для этого функцию

Или посмотрим на https://github.com/anotherCodeMunkey/fileshare/blob/master/App/Controller/RegisterController.php . Он занимается:

- генерацией паролей и хешей, что относится к модели ( $user->setSalt(uniqid());, $user->setHash(md5($user->getEmail().$user->getSalt().$data->password));). Очевидно, в модели должна быть функция вроде setUserPassword, ты вместо этого просто пишешь код стеной
- установкой авторизационных кук вместо сервиса авторизации

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

Это и называется толстый контроллер (fat ugly controller).

Это затрудняет понимание и правку кода, мешает повторному использованию. ну например, нам нужно в другом месте получить дерево комментариев. Как это сделать, если код для этого жестко вклеен в контроллер и его нельзя вызвать из другого места? То же касается операций смены пароля, авторизации, генерации ссылок.
Аноним 12/02/17 Вск 02:48:18 #579 №931352 
>>924780

И еще. Если ты встроил проверку логина/пароля в форму, то как их проверить без формы? Тот же вопрос по поводу валидации комментариев, пользователей. Можем ли мы достать комментарий из формы или еще откуда-нибудь и проверить на правильность?

Аноним 12/02/17 Вск 02:51:44 #580 №931355 
>>924780

То есть, у нас должны быть какие-то классы (сервисы), часть модели, которые содержат операции вроде "сменить пароль", "залогиниться под пользователем X", "проверить правильнсоть комментария", "добавить комментарий" и тд.
Аноним 12/02/17 Вск 02:55:59 #581 №931357 
>>927223

Тебе надо изучить теорию про классы и объекты, ну например в учебнике из ОП поста или еще откуда-то. Ты явно какую-то тему проскочил и не понимаешь что такое объект, что такое поле.

$this->first_name это поле объекта
$first_name это переменная, аргумент конструктора

>>927224

> Почему нельзя написать вместо $this->first_name просто $first_name?
Потому что в методе say_name нет такой переменной, и если ты не пропустил изучение функций, то должен знать что внутри функции видны только созданные в ней или переданные ей перменные, и $first_name там нет.


Аноним 12/02/17 Вск 02:59:48 #582 №931359 
>>927240

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

Ну ты говоришь объекты, это сложно. А реши задачу про Вектор или кошки-мышки из моего учебника без объектов. Будет еще сложнее. ООП как раз придумано чтобы позволить в больших программах разбивать код на отдельные изолированные классы чтобы с ним было проще работать.

Ну и если не использовать объекты, как в программе хранить информацию о каких-то сущностях? Вот у тебя есть гостиница, в ней номера, у каждого номера есть свойства вроде этажа, стоимости и тд. Как ты это будешь хранить и обрабатывать без обектов?
Аноним 12/02/17 Вск 03:16:00 #583 №931364 
>>926346

> http://ideone.com/WeGENR - Вопросы с абстрактными классами.
В функции checkAnswer лучше было сделать только проверку, без вывода на экран. То есть пусть функция просто проверяет ответ, возврашает 0 или 1 (ну или true/false), или число баллов, а код, который ее вызвал, уже решает, что с этим делать.

Из-за этого у тебя еще и копипаста получилась.

Поле $tip логичнее было поместить в AbstractQustion так как подсказка может быть у вопроса любого типа.

В остальном верно.

> http://ideone.com/qRGcXB - Компания Вектор.
Тут все верно.
Аноним 12/02/17 Вск 03:53:07 #584 №931369 
Есть где-нибудь пример полного процесса создания сайта, от вёрстки макета и до натягивания его на КМС?
Аноним 12/02/17 Вск 08:09:37 #585 №931388 
14615968980400.png
>>931369
>Есть где-нибудь пример полного процесса создания сайта, от вёрстки макета и до натягивания его на КМС?
>КМС
Аноним 12/02/17 Вск 19:39:51 #586 №931777 
Есть вот такая строка:
$user->password = password_hash($data['password'], PASSWORD_DEFAULT);
Пароль должен хешироваться в базе, но ниху не получается. Прописывается в таблице обычными символами, т.е. то что ввел юзер при регистрации.
Чому так? Где я мог обосраться?

ОпенСервер, PHP 5.5, Апач 2.4, MySQL 5.6, регистрацию через подключенную RedBean
Аноним 12/02/17 Вск 19:52:28 #587 №931794 
>>931777
Что значит не хешируется?
Ты пароль шифруешь? С помощью чего?
Аноним 12/02/17 Вск 20:08:55 #588 №931811 
>>931794
>Ты пароль шифруешь?
Да, шифрую пароль, введенный юзером при регистрации на сайте.

>С помощью чего?
С помощью функции password_hash(). Алгоритм хеширования BCrypt.
Аноним 12/02/17 Вск 20:34:59 #589 №931843 
Можете сказать CSS который был в 2012 году, сильно отличается от того который сейчас?
Аноним 12/02/17 Вск 21:07:14 #590 №931872 
>>931811
с помощью var_dump посмотри значение поля
$user->password
Либо передай в другую форму и посмотри значения
Аноним 12/02/17 Вск 21:08:39 #591 №931875 
>>931843
Да. Появилось множество методологий.
Пре-процессоры. Если тебя технологии интересуют.
В разве что появилось множество интереснейших вещей.
Аноним 12/02/17 Вск 21:09:43 #592 №931876 
Есть кто может помочь дубу?
Аноним 12/02/17 Вск 22:01:11 #593 №931910 
>>921312
>>>Задача 2: сделать функцию addProperty(object, name, initialValue) для создания приватных свойств с геттерами и сеттерами на объекте или прототипе объекта.
>> https://jsfiddle.net/sh21j4p1/
>Тут опечатка в коде...
Исправил, теперь всё работает: https://jsfiddle.net/sh21j4p1/1/

Я пытался задать метод через прототип и обратиться к нему в "конструкторе" функции, но мне выдалась ошибка о том что этот метод не является функцией: https://jsfiddle.net/3sjvm5gp/
Почему так получилось? Ведь если функция не находиться в объекте она ищется по цепочке в его прототипе.

>>908071
>Задача 3: сделать функцию для добавления в объект или прототип нового метода addMethod(object, name, fn).
Что-то у меня не получилось понять подвоха этой задачи: https://jsfiddle.net/zmLjh7ur/
Более того, я не смог понять как работает функция super(): https://jsfiddle.net/b073aLb5/1/
В чем моя ошибка? Здесь же должна быть такая же ситуация, super должен искать метод в прототипе.


>>921312
>Задача про фастфуд
>> Почему-то не получается https://jsfiddle.net/y28h2o2b/3/
>this.menu не определено
Определил https://jsfiddle.net/y28h2o2b/3/
Привычка что переменные сами определяются в php


>Электросеть

https://jsfiddle.net/6591a2sL/5/

>>>Для ЛЭП проще всего указать нули и учитывать их вклад отдельно (сделать у них методы для получения информации, сколько мощности доступно и по какой цене).
>> Лучше исключить её из перебора потому, что ЛЭП тоже может вернуть какое-то количество мощности.
>Мне кажется, надежнее прописать там ноль, так как мы не знаем, какая у нее мощность. Ну или вообще не делать в ней метода getPower(), чтобы его не пытались даже вызывать.
Но мы можем и даже должны иметь возможность узнать её мощность.


>>>> ElectricalNetwork.prototype.countPrice = function() {
>>>> price += this.elements.countPrice(balance);
>>>> balance = this.elements.countPower(balance);
>>>Вот здесь нехорошо, что код расчета закупок/продаж размазан по 2 классам - ElectricalNetwork и PowerLine. Логичнее его оставить только в ElectricalNetwork. Ну подумай сам: кто принимает решение о закупке: электросеть или начальник на конкретной ЛЭП (или руководство удаленной сети, к которой подключена ЛЭП)? Логично, что решение принимают в центре, а на ЛЭП только сообщают, сколько нужно принять или передать, запрашивают цены и тд. Так как сама ЛЭП не знает про баланс энергии в сети.
>>С другой стороны электросеть не знает о ценах и о внутреннем устройстве ЛЭП. Моя идея в том, баланс можно просто передать в условный счетчик. Ведь это для ЛЭП свойственно иметь и считать цену.
>Электросеть не знает цены и пропускной способности, но она всегда может ее у ЛЭП спросить. ЛЭП сама не может ничего посчитать, так как не знает баланс энергии во всей сети, и не может решить, сколько надо закупать. Потому расчет, сколько энергии купить, должен быть в электросети.
А почему ЛЭП не может спросить сколько энергии нужно?
Тут дело даже не в этом, ЛЭП сама по себе ничего не спрашивает - мы просто передаем энергию и пользуемся её функцией счетчиком, который работает с её же свойством цена.

>> function PowerLine(power, price) {
>> this.power = power;
>> this.price = price;
>> }
>Мне кажется, тут неправильно используется свойство power, так как у ЛЭП это не фактически переданная мощность, а пропускная способность (сколько максимум можно купить/продать), и логично для нее использовать другое название, чтобы не было путаницы.
В реальной жизни тоже некоторые свойства могут называться одинакового, не смотря на то что выполняют разные функции.


>> PowerLine.prototype.countPower = function(power) {
>> var thispower = this.power;

>> for (var i = 0; i < thispower; thispower--) {
>> if (power == 0) {
>> break;
>> }

>> power += power / -Math.abs(power);
>что-то я не могу толком понять, что тут происходит. Зачем мы power делим саму на себя? Получится ведь либо 1, либо -1. Тут явно ошибка.
Наверно я сбил столку неправильно назвав функцию - эта функция считает сколько энергии останется после передачи\получения её через конкретную ЛЭП.

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

>> if (this.elements instanceof PowerLine) {
>> price += this.elements.countPrice(balance);
>> balance = this.elements.countPower(balance);
>Тут нет расчета, сколько именно нужно купить. Нужно покупать не всю доступную энергию, а только ту, что не удалось произвести.
Так баланс это и есть вся энергия которую не удалось произвести \ удалось чрезмерно произвести.
Счетчики работают до тех пор пока он не станет нулевым или у ЛЭП не хватит больше мощности.

>Определение типа переменной
>>>Недостаточно, надо бы проверить что там есть свойства от 0 до length - 1.
>>>от 0 до length - 1
>> А как это выразить в условии
>Написать цикл, проверяющий наличие свойств с помощью оператора in.
А что с этим циклом делать? Нельзя же вернуть значение только по окончанию цикла, если in всегда были истины.


>15. Напиши функцию неглубокого копирования объектов и массивов
https://jsfiddle.net/uyey3at1/3/

>>>> for (property in object) {
>>>тут есть подвох, for in перебирает не только свойства объекта, но и его прототипов. Если кто-то расширит стандартный Object.prototype, это свойство или метод попадет в цикл.
>> Опять же, не могу понять что с этим не так: Если это клон объекта, то этот клон должен иметь тот же прототип что и "донор"(?).
>Не, до такой степени скопировать объект мы вряд ли сможем. Достаточно копировать только свойства самого объекта, копировать прототип не требуется.
А понял. Подвох в том что копируется не сам прототип а только его свойства, верно же?

>Тут в коде, я вижу, есть поддержка копирования объектов Date и обычных объектов, а что с массивами? Для них ведь надо изначально создавать пустой массив и копировать элементы.
А других встроенных объектов это замечание касается?


>Глубокое копирование
>> https://jsfiddle.net/j8pydqsg/2/
>> var clone = new object.constructor;
>Неприавльно вызывать конструктор. Мы ведь не знаем, какие аргументы у него есть и что в них надо передать. Надо делать так:
>
>- если источник - это Date, то создать новый Date, можно сразу передать правильное значение даты
>- если источник - массив, создать новый массив и скопировать элементы
>- если источник - другой объект создать пустой объект и скопировать все его свойства, не относящиеся к прототипам
>- иначе, если источник - не объект (а число, строка, null и тд), можно просто вернуть его
Переписал всё: https://jsfiddle.net/b0a7tk75/
Аноним 12/02/17 Вск 22:06:12 #594 №931914 
>>921312
>Тут из-за кучи цитат становится уже трудно понимать некоторые ответы, если что-то непонятно, можно просто задать вопрос отдельно.
Простите, я просто обычно делаю всё разом.
Аноним 12/02/17 Вск 22:20:55 #595 №931925 
Как установить пхп-сервер у себя на компе и писать в нём код?
Аноним 12/02/17 Вск 22:23:40 #596 №931926 
>>931925
А ОП-пост прочитать слабо?

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

https://github.com/codedokode/pasta/blob/master/soft/php-install.md
https://github.com/codedokode/pasta/blob/master/soft/apache-install.md
Аноним 12/02/17 Вск 22:27:12 #597 №931927 
images.jpe
>>931925
Аноним 12/02/17 Вск 22:28:39 #598 №931930 
>>931926
Ты ОП? Подскажи пожалуйста, я вообще хотел язык программирования - кое-какие операции на компе сделать самым простым способом. Я года 3 назад в этом треде прошёл курс молодого бойца, так что помню что в ПХП есть всякие операции с папками и язык лёгкий.
Или есть что получше?
Аноним 12/02/17 Вск 23:50:01 #599 №931986 
Поясните насчет даты. Её лучше образовывать в бд или php скриптом? В БД с помощью типа DATE можно вывести дату запроса, есть ли смысл писать метку на php?
Аноним 13/02/17 Пнд 00:28:45 #600 №932009 
>>931986
http://getjump.me/ru-php-the-right-way/#Дата_и_Время
Аноним 13/02/17 Пнд 02:09:51 #601 №932057 
>>931930
Powershell для Windows.
Bash для *nix.
Аноним 13/02/17 Пнд 05:04:36 #602 №932086 
Подскажите пожалуйста зачем нужны анонимне функции? Уже с год пишу код и знаю о них, но на практике я так и не понял куда их впихивают, почему на собеседованиях про них спрашивают, и вообще почему в своё время столько шуму было про их введение. ведь на практике они как-бы и профитов не дают. Или я неправ?
Аноним 13/02/17 Пнд 11:27:40 #603 №932219 
>>932086

(я уже раньше писал, просто скопирую сюда)

Давай я тебе дам задачу. Есть какая-то сущность и коллекция этих сущностей (Работник и список работников, Ученик и классный журнал, Товар и Корзина, Товар и Склад). Можешь представить их как объекты или массивы, если не знаешь ООП.

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

Напиши функцию, отбирающую массив сущностей, соответствующих определенному критерию.

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

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

Как ты представишь в своем коде "критерий" или "формула"? Как передать в функцию этот критерий?
Аноним 13/02/17 Пнд 13:20:27 #604 №932252 
изображение.png
Решил поковыряться в массиве в боевом коде напрямую как в объекте через ссылку. Хуй знает как так получилось, но словил какой-то баг или особенность языка которую я не знал, что тупил целый час в итоге выискивал в чем там дело. Попытался этот "баг" сейчас на ideone воспроизвести что бы вам показать и в итоге нихуя.

Суть примерно в том, что в результирующем массиве должен был затираться элемент "6ab" и вместо него повторяться "5ab" еще раз.

Мб версия пыхи старая, мб еще что - не знаю, в общем кто поможет мб понять в чем обсер?
http://ideone.com/LMl108
Аноним 13/02/17 Пнд 13:32:02 #605 №932259 
>>932252

Для начала изучи внимательно предупреждение про ссылки и foreach тут http://php.net/manual/ru/control-structures.foreach.php

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

Аноним 13/02/17 Пнд 14:42:56 #606 №932297 
задача про студентов выглядит примерно как гайд "как нарисовать сову", подскажите как мне за нее взяться или что почитать если только прошел предыдущие уроки ОПа
Аноним 13/02/17 Пнд 16:03:04 #607 №932334 
14862756914890.webm
>>932297
для начала установи апач\нгинкс, пхп и базу данных. Настрой все это, чтобы работало. Потом можешь начать с создания страницы с прикрученным к ней бутстрапом. Дальше расширяй и наполняй контентом. Аноны кидают тут свои гитхабы, можешь посмотреть как они делают.
Аноним 13/02/17 Пнд 16:35:52 #608 №932343 
Не нашёл JS тред, куда-то он уплыл с концами.
У меня какая-то попобава. Если вставляю в html скрипт, например
<input type="text" id="input">
<script>
input.onblur = function() {
console.log("ок");
};
</script>

то он работает. А если вынести его в отдельный файл, подключив его в шапке
<script type="text/javascript" src="core.js"></script>
то не работает. В консоль браузера сразу при загрузки страницы падает
ReferenceError: input is not defined

В другом месте вот такая функция не работает с той же ошибкой:
$(function(){
$('td, .table-cell').click(function(e){//ловим элемент, по которому кликнули
//....
});
});
Перечитал, как нужно js-скрипты в отдельный файл выносить - никаких особых камней там нет. Подключай сверху, да выноси на здоровье. Не понимаю.
Аноним 13/02/17 Пнд 16:38:12 #609 №932344 
>>932343
Да, добавлю, что на соседнем сайте точно такие же скрипты работают нормально.
Аноним 13/02/17 Пнд 18:12:06 #610 №932401 
>>932344
Там есть таки подводный камень, в общем у тебя js подключен в шапке, то там должны быть проверки на то что js ждет построения DOM дерева, иначе он будет пытаться выполниться до того как у тебя собственно html отрисовался и ссылаться на несуществующие id или class'ы на html странице.

А вообще ты возможно с путями проебался, попробуй в корень сайта кинуть а не в ту же папку в которой html лежит, ладно я хуевый советчик, простите :(
Аноним 13/02/17 Пнд 18:16:53 #611 №932408 
>>932344
скрипты в самом низу подключай
Аноним 13/02/17 Пнд 19:00:14 #612 №932458 
>>931331
>>931333
Спасибо, на днях попробую переделать.
Аноним 13/02/17 Пнд 19:05:27 #613 №932461 
>>932343
Каково оно учить JavaScript в 2016?

https://habrahabr.ru/post/312022/
Аноним 13/02/17 Пнд 19:19:16 #614 №932473 
[Sephirotic]Evangelion+-+13+[1080p+8bit+AAC]+[ENG.png
Прошу глянуть код гостевоху и надавать мне каких-нибудь советов, чтобы избежать ошибок, да хоть по оформлению кода, пока не стал пилить дальше
https://github.com/grigoryMovchan/zuihitsu
Аноним 13/02/17 Пнд 21:24:21 #615 №932556 
Чому тред такой мертвый? Еле доскроллил до него. Подскажите гайдов по парсингу html-страниц. Хочу сделать страницу с ценами конкурентов.
Аноним 13/02/17 Пнд 21:26:49 #616 №932561 
>>932556
> Подскажите гайдов по парсингу html-страниц. >Хочу сделать страницу с ценами конкурентов.
А смысл? Все будет ломаться при малейших изменениях в верстке.
Аноним 13/02/17 Пнд 21:30:13 #617 №932566 
>>932561
Ну так починить не долго, тем более там сайты работают годами на одних и тех же cms и с одной и той же версткой. Просто реально заебывает руками перебирать всех и смотреть кто начал демпинговать.
Аноним 13/02/17 Пнд 23:50:32 #618 №932676 
>>932556
Если знаком с DOM и CSS-селекторами, то просто ставишь Goutte: https://github.com/FriendsOfPHP/Goutte или аналог, и парсишь без задней мысли что нужно.
Аноним 14/02/17 Втр 00:26:20 #619 №932704 
Здравствуйте, не нашел тред по JS, установил Subline, поставил туда Package Control, установил Emmet, но чет когда нажимаю восклицательный знак и таб - никуя не происходит. Что делать?
Аноним 14/02/17 Втр 00:47:39 #620 №932728 
>>932704
Разобрался, какой плагин поставить на саблайн, чтоб пхп юзать.
Аноним 14/02/17 Втр 01:35:27 #621 №932749 
>>932343

Файлы (HTML, JS) не могут загрузиться мгновенно. Они загружаются с какой-то скоростью.

Браузер парсит (разбирает) HTML и картинки поточно, по мере поступления (а вот JS и CSS файлы он сначала загружает целиком, а только потом применяет их).

Соответственно, когда у тебя скрипт в шапке получается такая ситуация:

- браузер запрашивает с сервера HTML страницу
- браузер разбирает приходящий с сервера HTML файл по мере поступления
- приходит шапка (head), браузер ее разбирает и создает соответствующие DOM элементы
- затем браузер видит в HTML коде тег script. Он ставит разбор HTML на паузу и начинает загружать скрипт
- когда скрипт загружен целиком, браузер выполняет записанный в нем код. В этот момент созданы DOM элементы только для шапки страницы, которые идут до скрипта и твой инпут видимо еще не создан
- после выполнения JS кода браузер продолжает разбирать HTML файл дальше

Почитай статьи про то как работает браузер, например эти

- https://learn.javascript.ru/onload-ondomcontentloaded
- http://javascript.ru/tutorial/events/timing#zagruzka-stranicy
- https://learn.javascript.ru/external-script
- http://webknowledge.ru/kak-rabotaet-brauzer-chto-proishodit-za-kulisami-sovremennyh-brauzerov/

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

- обработчик ставится на инпут не сразу, а только когда загрузится весь HTML файл. Какое-то время страница не будет реагировать на клики, и тд (я очень часто такое вижу). Еще хуже, кстати, когда JS скрипт при инициализации изменяет верстку и она прыгает в момент его срабатывания. Это указывает на уровень профессионализма фронтенд-специалиста.
- если в коде ты ссылаешься на функции из файла, ну например <button onclick="something()"> то до загрузки скрипта клик по кнопке будет вызывать ошибку

Некоторые подключают скрипт в начале, но делают инициализацию по событию document.ready (оно срабатывает когда браузер разобрал HTML файл до конца и создал все дерево ДОМ). Этот подход имеет такой же недостаток.

Мне в голову пришел такой способ:

- сделать JS файл, содержащий только функции, но не ставящий никаких обработчиков никуда
- подключить его в шапке
- сразу после инпута поставить вызов функции инициализации внутри тега script

Также, можно использовать классические обработчики в HTML атрибутах: <button onclick="doSomething()">. Этот метод не всегда подходит (плохо стыкуется с ООП кодом).

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

И что интересно, мало где описывается то, что я написал. Такая вот индустрия, такие вот люди в ней работают. Прыгающая верстка и не сразу работающие кнопки это норма для них. Вот киви кошелек например, на нем кнопки начинают работать только после загрузки страницы целиком. Зато у них используется ангулар и все на аяксе. А твиттер это вообще один большой сборник антипаттернов по построению интерфейсов. Кнопка "назад" в нем работает как генератор случайных чисел и никогда не знаешь, куда она тебя приведет. Алсо, меня периодически перебрасывает на мобильную версию по непонятной причине.
Аноним 14/02/17 Втр 01:52:56 #622 №932754 
Screenshot from 2016-11-24 20-02-55.png
аноны, плиз, помогите

имею кусок кода:

$text = preg_replace_callback('/(?<=^|>)[^><]+?(?=<|$)/', [????], $text);

function replace($text, $pattern, $tag) {
return preg_replace('/'. $pattern .'/', $tag, $text);
}

как мне написать параметр [????], чтобы передать в callback функцию необходимые параметры?
Аноним 14/02/17 Втр 01:59:31 #623 №932755 
cool-face.gif
danger-face.gif
>>931338

http://ideone.com/oDVbum можно ли делать вот такой return false как у меня в 14 и 16 строке? Не выбрасывать же исключение, если пользователь мисскликнул флагом по открытой клетке. На счет значка не совсем тебя понял что с ним делать. Это пикрелейтед 2 когда идет mousedown, и пик1 когда mouseup.

http://ideone.com/B91hZ0 перенес dom-заботы во View. Это нормально, что я всегда кидаю координаты из event.dataset к вызову любой функции func? Не знаю еще каким образом их можно передать из контроллера в представление.
Аноним 14/02/17 Втр 02:01:30 #624 №932756 
>>932755

14 и 26 строке
Аноним 14/02/17 Втр 02:22:47 #625 №932761 
Изучаю адаптивную вёрстку и заметил, что не получается уменьшить окно браузера меньше чем дом 480 пикселей примерно. Почему так? На видео вижу как люди уменьшают его до практически до 1 пикселя. Пробовал на всех браузерах.
Аноним 14/02/17 Втр 02:39:48 #626 №932765 
>>932755

> можно ли делать вот такой return false

Смутно догадываюсь что такая проверка и дальнейшее ничего-не-делание должна быть в контроллере..
Аноним 14/02/17 Втр 02:42:21 #627 №932766 
>>932755

Про значок вопрос относится ко второй ссылке на ideone. Извиняюсь за флуд, вначале пишу в тред, потом думаю.
Аноним 14/02/17 Втр 04:00:22 #628 №932777 
>>932755

> можно ли делать вот такой return false как у меня в 14 и 16 строке?
Можно. Выбрасывать исключение или нет определяется требованиями к функции, как ты ее спроектировал. Но желательно в комментарии к функции писать об этом. В твоем случае этот return false ни на что не влияет, но в других случаях, если не проверить результат функции, может появиться какая-то ошибка.

> this._flags.addCell(x, y);
> this._flagsCounter--;
А мы не можем вычислять число оставшихся флагов через разницу между числом мин и числом в this._flags? Можно было бы избавиться от лишнего поля и и риска его рассинхронизации с другими полями.

> На счет значка не совсем тебя понял что с ним делать. Это пикрелейтед 2 когда идет mousedown, и пик1 когда mouseup.
Я предлагал рассмотреть вариант, когда переключение значка делается во View, и контроллер о нем даже не знает. Если он переключается только при клике и никак не связан с игровой логикой.

> this._domView.preventContextMenuOnField();
Вот это явно ведь должно быть во view. Ведь это особенность браузера, что правый клик открывает меню, и пусть вью борется с этим явлением сам.

Я рассуждал так: можно сделать всю работу с DOM во вью, чтобы он наружу выставлял только методы и события, которые никак с DOM не связаны (в общем, инкапсулировать работу с DOM внутри вью). Этакое абстрактное игровое поле, и внешний код не знает ничего о том, как оно там внутри реализовано, и вообще используется ли там DOM.

Вот, если что, про инкапсуляцию статья: http://learn.javascript.ru/internal-external-interface (я не призываю копировать стиль кода и скрытие переменных в замыкании, а просто почитать про суть инкапсуляции)

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

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

> Это нормально, что я всегда кидаю координаты из event.dataset к вызову любой функции func?
> каким образом их можно передать из контроллера в представление.
Из представления в котроллер, ты имел в виду? Да, можно через аргументы, можно сделать объект события, если хочется усложнить.
Аноним 14/02/17 Втр 04:02:22 #629 №932778 
>>932755

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

Тестировать естественно в первую очередь модель, это и проще, и полезнее.
Аноним 14/02/17 Втр 04:18:34 #630 №932781 
>>932761

Я проверил на Хромиуме, по ширине пустое окно ограничено 337 пикс, по высоте можно хоть 0 пикселей сделать. Фаерфокс - то же самое.

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

Ты можешь 1) увеличить масштаю, что уменьшит ширину 2) использовать режим тестирования адаптивной верстки, в Хроме это Ctrl + SHift + I -> иконка смартфона, в Фаерфоксе то ли пункт в меню, то ли кнопка в отладчике.

Еще ты можешь сделать iframe любого размера и в нем открыть свою страницу.

Под 1 пиксель проверять верстку не требуется. Проверяй на реалистичных разрешениях, http://mydevice.io/devices/

>>932704

Возможно тип файла не тот. Попробуй на html-файле. Или что-то в настройках не включено.

>>932566

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

А яндекс-маркет не годится для этого? Я всегда там цены сравниваю.

И я помню, был какой-то сервис который давал API для извлечения цен.

>>932556

Изучи DOM, может быть Xpath, и возьми какую-нибудь библиотеку вроде phpQuery или как нижу упомянули, Goutte.

>>932297

Это прошел? https://github.com/codedokode/pasta/blob/master/soft/web-server.md

Комментарии и пояснения к студентам все прочел?

Туториал из php мануала прошел? http://php.net/manual/ru/tutorial.php

>>931986

В БД надо хранить как DATE, DATETIME, TIMESTAMP.

>>931930

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

А так, да, bat/bash/powershell/python - что-то из этого.

>>931876

не зная в чем проблема - вряд ли.

>>931843

CSS3 это дополнения к CSS2.1. То есть тени или скругления это новое, а расчет ширины/высоты элемента идет по тем же принципам.

>>931777

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

Если ты думаешь, что проблема в password_hash то просто протестируй ее, дай ей что-нибудь и проверь что будет на выходе.

>>931369

Есть, я видел такие курсы, в том числе бесплатные. Ссылок не помню, погугли.

Аноним 14/02/17 Втр 09:08:04 #631 №932828 
PHPч, существуют ли какие нибудь API в открытом доступе для совершения переводов средств между клиентами банковских систем типа сбербанк, альфа-банк, запсибкомбанк? А то пока что я увидел только то, что банки просто так не выдают API. С кем то (сбербанк) нужно связываться и говорить, зачем нужен API, у альфа-банка вроде чуть попроще, но всё равно нужно получать токен приложения и всё такое.
Аноним 14/02/17 Втр 09:20:16 #632 №932831 
Как в JavaScript принято писать моки для объектов определённого класса? В Sinon.js своё особое видение моков: https://stackoverflow.com/questions/26037940/mocking-class-in-sinon-js-and-instanceof

Как я понял, у них мок это объект, ожидающий, что на другом объекте (который передался в конструктор мока при создании) будут вызваны определённые методы:
var dep = {foo: function() {}};
var depMock = sinon.mock(dep);
dpeMock.expects("foo").once();

// передаём объект dep как зависимость тестируемого класса
...

// убеждаемся в том, что на объекте dep был вызван метод foo один раз:
depMock.verify()

А что делать если тестируемый объект проверяет переданные аргументы через instanceof? По ссылке на stackoverflow предлагают вместо этого преверять наличие только нужных методов, но это же неудобно, что если их много?
Делаю сейчас так:
var dep = {foo: function () {}, __proto__: FooClass.prototype}
// дальше то же, что и вверху

Аноним 14/02/17 Втр 14:04:11 #633 №933012 
>>932831

Нужна другая (нормальная) библиотека для моков, которая бы производила объекты с правильным прототипом (я могу путать, но по моему instanceof просто проверяет наличие прототипа конструктора в цепочке прототипов объекта).

Стандарт, который довольно трудно понять, говорит примерно то же:

https://www.ecma-international.org/ecma-262/5.1/#sec-11.8.6
https://www.ecma-international.org/ecma-262/5.1/#sec-15.3.5.3

> var dep = {foo: function () {}, __proto__: FooClass.prototype}
Это неправильно. __ proto __ не определена стандартами и не обязана работать везде и всегда.
Аноним 14/02/17 Втр 14:18:28 #634 №933021 
>>932401
>иначе он будет пытаться выполниться до того как у тебя собственно html отрисовался и ссылаться на несуществующие id или class'ы на html странице
Билять. Вот оно что.
А пути правильные, проверял уже (они и так в корне).
>>932408
Попробую.
>>932461
Хех, читал эту статью. Всё это хрень. Может на собеседованиях и спрашивают, а реально нет смысла гнаться за трендом. Делай так, как работает, и хрен с ним. Заказчику глубоко наплевать. Да и как по мне, самый простой код - самый лучший. Если можно обойтись без усложнения, то лучше это сделать.
>>932749
>- сделать JS файл, содержащий только функции, но не ставящий никаких обработчиков никуда
>- подключить его в шапке
>- сразу после инпута поставить вызов функции инициализации внутри тега script
Пожалуй, этот способ самый оптимальный, так и сделаю.


И ведь читал про выполнение кода со страницы, а про вызовы с конкретными id не дошло. Решил, что раз функция срабатывает после некоего события, то до события этот кусок кода просто не используется. А когда используется, все id уже поименованы. Окей, мне стало понятнее.
Аноним 14/02/17 Втр 14:23:39 #635 №933026 
Сап, пхпач, помогай. Не знаю как реализовать класс с текучим интерфейсом (fluent interface). да, это моё тестовое задание. остальные сделал, а это в душе не ебу как.
>Создайте класс, принимающий в конструкторе JSON-строку и позволяющий получить элемент через текучий интерфейс.
Конструктор, понятное дело, запилил, это херня. А вот как быть с методом get -- не представляю. Аноны, подскажите как реализовать подозреваю, что тут что-то связано с замыканиями.

$o = new JsonFluent('{"first":"apple","second":"banana","third":{"sub1":1,"sub2":2,"sub3":3}}');
$o->get('first'); // Вернёт 'apple'
$o->get('third')->get('sub2'); // Вернёт 2
Аноним 14/02/17 Втр 15:20:04 #636 №933058 
Вопрос к ОПу. Вот он пишет, что тех кто говорит про то что одинарные кавчки быстрее двойных, надо пинком скидывать с крыш многоэтажки. Но ведь они и правда быстрее: в двойных кавычках пхп проверяет наличие переменных, а в одинарных не ожидает их встретить. В чем я не прав?
Аноним 14/02/17 Втр 16:56:40 #637 №933161 
>>933021

Не, JS это не декларативный язык вроде CSS и конструкция

$('#abc').click(...);

это именно команда: найти все элементы с id = abc, которые есть в данный момент, и повесить на них обработчик. Она не повесит обработчики на добавленные в DOM позже элементы.

>>933026

Текучий интерфейс это когда все методы возвращают this. Мне это не нравится, бессмысленное увеличение кода.

>>933058

А ты попробуй сделать тест, например создать 10000 строк в одинарных кавычках и 10000 в двойных и сравнить разницу по времени при создании одной строки.

Код с одинарными кавычками требует больше времени на написание и хуже читается:

echo 'a=' . $a . ', b = $b'. ...

И это ухудшение не стоит нескольких нано- или микросекунд.

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

> в двойных кавычках пхп проверяет наличие переменных, а в одинарных не ожидает их встретить
А это важно только на этапе компиляции. При использовании кеширования опкодов (opcache) компиляция длеается только один раз, а дальше скомпилированный скрипт берется из кеша и разницы не будет (как мне кажется).

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

> php -dvld.active=1 -r 'echo "Hello world";'
line # E I O op fetch ext return operands
-------------------------------------------------------------------------------------
1 0 E > ECHO 'Hello+world'
1 > RETURN null

Как видим, наш код скомпилировался в 2 инструкции, echo и return.

Теперь поменяем вид кавычек:

line #
E I O op fetch ext return operands
-------------------------------------------------------------------------------------
1 0 E > ECHO 'Hello+world'
1 > RETURN null

Как видим, коды после компиляции получились точно такие же.

А вот как выглядит результат компиляции программы с переменной внутри двойных кавычек:

> php -dvld.active=1 -r 'echo "Hello $x world";'

line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
1 0 E > ADD_STRING ~0 'Hello+'
1 ADD_VAR ~0 ~0, !0
2 ADD_STRING ~0 ~0, '+world'
3 ECHO ~0
4 > RETURN null

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

Поскольку форматирование могла сбиться, скопирую пост на pastebin: http://pastebin.ru/NhNjneDP
Аноним 14/02/17 Втр 16:59:24 #638 №933165 
>>933026

А, хотя в твоем случае надо писать не return $this. Подумай сам, что надо возвращать. Или поищи готовые аналогичные библиоетки, например, phpQuery какой-нибудь.
Аноним 14/02/17 Втр 17:14:13 #639 №933178 
Я не >>933058, но сделал маленький тест.
Сгенерил миллион строк в php 7.1:
3 подстановки vs 6 конкатенаций (оно вообще употребляется во множественном числе?).
Подстановки отрабатывают на 15-20% быстрее.
Аноним 14/02/17 Втр 17:16:33 #640 №933179 
>>933165
Да, мне уже подсказали. Возвращать нужно new JsonFluent($data).
Аноним 14/02/17 Втр 17:41:15 #641 №933198 
Пытаюсь разобраться с шифрованием. Не могу понять на чём путаюсь.

Допустим я хочу написать сервис по обмену сообщениями, и при этом хочу чтобы эти сообщения ни кто не мог прочитать кроме собеседников. Никогда! Вообще!

Я ознакомился что для шифрование применяется при помощи ключа. Но где хранить этот ключ? Если сохранить его в БД, то доступ будет не только у собеседников, но и у тех у кого есть доступ к БД.
Нужно сделать так чтобы ключ оставался только у собеседников. Может для этого выступить сам пароль от сервиса? Сомневаюсь что это будет надежно, потому что пользователи вряд ли будут делать пароли длиннее, к примеру, 12 символов.
Аноним 14/02/17 Втр 17:52:28 #642 №933203 
>>933198

Попробуй почитать для начала про такие вещи:

- симметричное и асимметричное шифрование
- открытый и закрытый ключ
- протокол Диффи-Хеллмана

Почитай про то, как устроен протокол SSL.
Аноним 14/02/17 Втр 18:28:16 #643 №933249 
Можно ли PHP скрипт превратить в исполняемый файл (.exe)?
Аноним 14/02/17 Втр 19:35:48 #644 №933308 
>>933249
Боюсь себе даже представить зачем такое кому-то может понадобится.
Аноним 14/02/17 Втр 19:55:50 #645 №933317 
>>933203
>- протокол Диффи-Хеллмана
https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB_%D0%94%D0%B8%D1%84%D1%84%D0%B8_%E2%80%94_%D0%A5%D0%B5%D0%BB%D0%BB%D0%BC%D0%B0%D0%BD%D0%B0#.D0.9E.D0.BF.D0.B8.D1.81.D0.B0.D0.BD.D0.B8.D0.B5_.D0.B0.D0.BB.D0.B3.D0.BE.D1.80.D0.B8.D1.82.D0.BC.D0.B0.5B2.5D

Что-то у меня не получилось получить одно и тоже число https://ideone.com/I0LCYo
Аноним 15/02/17 Срд 00:57:52 #646 №933493 
>>933317

1) ^ это операция XOR, а не возведение в степень. Не перепутал?
2) при возведении в степени вроде 10 000 получаются гигантские числа. PHP такие числа хранит в float формате, который сохраняет 8-16 знаков из числа, а нужно точное представление. Потому надо брать расширения для работы с большими целыми числами:

http://php.net/manual/ru/book.gmp.php
http://php.net/manual/ru/book.bc.php

Также, ты используешь для генерации случайных чисел rand(). Она использует линейный генератор ( https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%BD%D0%B3%D1%80%D1%83%D1%8D%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4 ) который довольно предсказуем. Нам нужно что-нибудь получше, а именно:

http://php.net/manual/ru/function.openssl-random-pseudo-bytes.php
http://php.net/manual/ru/function.random-bytes.php

Также, потом советую глянуть расширение openssl, содержащее готовые функции шифрования (но сначала попробуй написать свою): http://php.net/manual/ru/book.openssl.php

Насчет кода - должны получиться именно одинаковые числа. Потому что (x ^ y) ^ z = (x ^ z) ^ y. Остаток от деления нужен для того, чтобы неприятель не мог догадаться, какие были исходные числа, проведя обратную операцию.

Аноним 15/02/17 Срд 01:05:40 #647 №933496 
Анончик, если я отправляю ajax-запрос к php-файлу, в котором есть редирект header('Location'), то редирект произойдёт?
Аноним 15/02/17 Срд 06:26:53 #648 №933564 
Нужда заставит, ещё и не такое говно придётся выучить.
sageАноним 15/02/17 Срд 10:15:08 #649 №933610 
>>933564
Просто ради просвещения: что, по Вашему мнению, можно хотя бы с натяжкой отделить от говна в таком случае?
Аноним 15/02/17 Срд 11:28:30 #650 №933639 
Кто что думает по поводу отмирания MVC во фронтенде?

https://habrahabr.ru/company/tuturu/blog/321820/
Аноним 15/02/17 Срд 11:35:56 #651 №933643 
Нет, всё равно попобава. С JS-функциями.
В index.php стоят две одинаковые кнопки:
<div><a href="javascript:void(0)" onclick="show_flights_table()" id="a_save_object" class="a_demo_three b_green" title="Показать таблицу">Показать таблицу</a></div>
и
<div><a href="javascript:void(0)" onclick="add_line_in_flights_table()" id="a_save_object" class="a_demo_three b_green" title="Добавить строку">Добавить строку</a></div>
Там же в хидере подключён скрипт
<script type="text/javascript" src="core.js">
В core.js стоят функции
function show_flights_table()
{
...
}

и такая же
function add_line_in_flights_table()
{
...
}

Нажимаем первую кнопку - всё ок, никаких варнингов, браузер показывает таблицу. Нажимаем вторую - хром ничего не делает, выдаёт
Uncaught ReferenceError: add_line_in_flights_table is not defined at HTMLAnchorElement.onclick (index.php:54)
А если запустить через файерфокс, то вторая кнопка срабатывает. Правда, там дальше начинает ругаться на $(div).html(data); (ReferenceError: $ is not defined[Подробнее] core.js:262:5), но это уже другой вопрос.
Я даже пробовал стирать из второй функции вообще всё между { }. Всё равно not defined. Да как так-то?

Аноним 15/02/17 Срд 11:55:25 #652 №933654 
>>933643
Я думаю, из-за 2 одинаковых id подряд.
> onclick="show_flights_table()" id="a_save_object"
>onclick="add_line_in_flights_table()" id="a_save_object"

Скорее всего ты намешал там где то джиквери.
когда ты вызываешь "onclick='function()'", она должна быть в глобальной области видимости (принадлежать объекту window), возможно твои функции обернуты во что то, хз, покажи код хоть.

Ну и еще:
>a href="javascript:void(0)"
Если нет ссылки, почему бы просто не опустить параметр href?
Аноним 15/02/17 Срд 12:20:18 #653 №933673 
Ребят, подскажите, пожалуйста, как установить на локальный сервер Mail_Mime?
Аноним 15/02/17 Срд 12:32:10 #654 №933684 
>>933654
>Если нет ссылки, почему бы просто не опустить параметр href?
А так можно? Мне казалось, что это что-то вроде стандартной заглушки для большего фен-шуя.
>Я думаю, из-за 2 одинаковых id подряд.
Да, есть такое. Исправил. Но ошибка та же.
>Скорее всего ты намешал там где то джиквери.
Чего нет, того нет. По нажатии на кнопку запускается js-скрипт, оттуда аяксом запускается php-скртипт и выполняет что-то там с базой. Раньше так делал, всё работало нормально.

Код примерно такой (я убрал лишние блоки и функции для удобочитаемости): https://jsfiddle.net/jou5Ljyj/
Аноним 15/02/17 Срд 12:56:59 #655 №933707 
Сап аноны, нужна помощь. написал сайт на yii2. для мультиязычности юзаю куки и сессии ,но какого-то черта yii перезаписывает мою куку для языков чем-то вроде этого
ef2e3b878bea166e1a349599475821d6b94b13cb609c8db980144ff065535613a:2:{i:0;s:5:"_csrf";i:1;s:32:"Q7hju019PJ61cOMbR1Y4Bm9V4stpWCpU";}
я не ебу что это такое ( ну только догадываюсь)
что-то связанное с безопасностью.
кто знает как с этим бороться, что делать?
Аноним 15/02/17 Срд 13:35:13 #656 №933735 
>>933684
Вообще, я тоже для всяких интерактивных элементов использую тег "<a>" без href (НО ТАК НЕ НАДО ДЕЛАТЬ, лол). Например для кнопок есть "<button>" и т.п.

У тебя там жесть какая то в примере. Вот сравни я упростил: https://jsfiddle.net/Lwv50ps3/ - так работает. Вопрос, почему у тебя функции не попадают в глобальную видимость. Если ты там прямо из проекта скопипастил кусок кода, то у меня для тебя плохие новости: ты ничего не понимаешь в хтмл, no offence
Аноним 15/02/17 Срд 14:38:04 #657 №933777 
>>933735
Это пока не проект, а просто разрозненные куски кода.

Не понял, зачем после функций вставлять такие строки?
window.add_line = add_line;

>Вопрос, почему у тебя функции не попадают в глобальную видимость.
Скорее, почему одна попадает, а вторая (точно такая же) нет.
Аноним 15/02/17 Срд 14:52:58 #658 №933780 
>>933777
Ну как бы я эту функцию прикрепил к глобальной видимости (window). А иначе она бы не запустилась на jsfiddle, с той же ошибкой что у тебя.

>Скорее, почему одна попадает, а вторая (точно такая же) нет.
Да, вот это. Может кто поумнее объяснит нам позже.
Аноним 15/02/17 Срд 14:58:34 #659 №933782 
>>933780
Ящитаю, это какой-то глюх Хрома. Может быть даже конкретно моего. ФФ даже не морщится.
>прикрепил к глобальной видимости (window)
И ничего страшного, что прикрепление происходит после самой функции? При чтении, браузер читает сначала всё, что вне функций, а только потом их, так вроде?
Аноним 15/02/17 Срд 15:43:18 #660 №933802 
Анон, помоги, пжлст.
Почему программа некорректно считает среднее значение тугриков/страниц ? 296 строка

http://sandbox.onlinephpfunctions.com/code/e7ac3081e037c3c3e6b0064d3feb1589d3da0721
Аноним 15/02/17 Срд 16:35:09 #661 №933826 
>>933782
>И ничего страшного, что прикрепление происходит после самой функции? При чтении, браузер читает сначала всё, что вне функций, а только потом их, так вроде?
Первый раз слышу, если честно. Никогда никаких проблем не было с таким подходом.
Аноним 15/02/17 Срд 19:20:19 #662 №933931 
Есть ли еще мануалы по битриксу кроме официальной документации? Как-то тяжеловато читается. Можно и в видео-формате.
Аноним 15/02/17 Срд 21:29:59 #663 №933994 
Обработка GET и POST запросов должна происходить в разных методах с точки зрения MVC? Допустим есть страница с формой. Если приходят по гет, то просто рисуем вид, а если пост, то нужно обработать. Посылать ли в этом случае с формы на другой action чтобы обрабатывать его другим методом? По идее так и надо делать, т.к. метод должен выполнять одну ф-цию
Аноним 15/02/17 Срд 21:55:55 #664 №934007 
>>933994
> в разных методах с точки зрения MVC?
В разных методах класса-обработчика.

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

Аноним 15/02/17 Срд 22:39:20 #665 №934039 
>>933493
>gmp_powm
Эта функция была специально придумана для этого алгоритма?

Теперь всё получилось: https://ideone.com/I0LCYo
Завтра постараюсь задать вопросы, после того как осознаю алгоритм.

Спасибо!!!
Аноним 15/02/17 Срд 23:45:27 #666 №934081 
>>934007
>класса-обработчика.
Что под этим подразумевается? Обычно роутинг настроен так, что запрос от пользователя попадает в метод контроллера (экшн). Меня интересует в разных ли экшенах обрабатывать гет и пост запрос для одной страницы, учитывая, то если запрос гет, то там нужно только вид отрендерить.
Аноним 15/02/17 Срд 23:57:55 #667 №934091 
>>934081

В форме удобнее обрабатывать и ГЕТ и ПОСТ одной функцией. Почитай например https://github.com/codedokode/pasta/blob/master/forms.md
Аноним 16/02/17 Чтв 00:10:35 #668 №934104 
>>934081
Нет принципиальной разницы: можно в одном экшне, можно в разных. Если у тебя там мало кода, то, как по мне, проще читать один экшн, да и разделение на 2 экшна вынудит копипастить код.
Аноним 16/02/17 Чтв 00:54:10 #669 №934122 
Анон, помоги решить проблему. Есть ajax-запрос, который отправляет данные к php-файлу. В этом php-файле идёт валидация данных, после чего эти данные записываются в переменную $_SESSION в виде json-массива. Как только это происходит, в теле функции .done() в ajax-запросе происходит переход на поддомен, на котором пыха знать не знает о сессии. То есть, сессия просто NULL. В чём могут быть подводные камни кросдоменных сессий? И какого хуя моя сессия не передаётся на поддомен?
Аноним 16/02/17 Чтв 01:43:59 #670 №934134 
mistake.png
В чем ошибка?
Аноним 16/02/17 Чтв 01:48:13 #671 №934137 
>>934134
После case должна быть не точка с запятой, а двоеточие. И нахуя ты используешь альтернативный синтаксис, если у тебя сплошной код без разрывов?
Аноним 16/02/17 Чтв 01:50:47 #672 №934139 
>>934122

Как по-твоему работают сессии? Откуда берутся и куда сохраняются данные из массива $_SESSION в начале и после завершения скрипта?
Аноним 16/02/17 Чтв 01:57:11 #673 №934143 
>>934139
Это суперглобальная переменная, которая хранится вне зависимости от домена. Главное, чтобы на одном сервере. Кстати, проблему решил буквально только что одной строчкой кода:

$some_name = session_name("some_name");

Сука, 5 часов проводил раскопки на StackOverflow
Аноним 16/02/17 Чтв 02:00:35 #674 №934146 
>>934143

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

Аноним 16/02/17 Чтв 03:36:12 #675 №934181 
photo (1).jpg
Хочу прокачать свой английский в техническому плане, кто как осваивал его?
На каком уровне нужно знать пхп, чтоб устроиться на стажировку?что обычно спрашивают на собеседовании, что нужно делать стажировке.
Аноним 16/02/17 Чтв 12:49:28 #676 №934376 
>>932828
Я слышал только про Робокассу, не знаю, есть ли там нужный тебе функционал.

Аноним 16/02/17 Чтв 13:35:28 #677 №934429 
ОП, проясни пожалуйста механизм работы реалтайм-индексов в sphinx. Как я понял, эти индексы непосредственно к таблице никакого отношения не имеют и создаются только внутри сфинкса, так? То есть, применительно к задаче на файлообменник, для того чтобы эти индексы заполнялись при добавлении файла, дополнительно к запросу на заполнение полей таблицы нужен еще и запрос для заполнения реалтайм-индекса? Далее, при использовании реалтайм-индекса невозможно сразу получить все поля строки, т.е. если у нас проиндексировано только имя файла, то сфинкс отдаст в виде результата поиска только айдишник(и), по которым придется еще раз делать запрос, но уже непосредственно в БД, для извлечения строк с найденными сфинксом айди? Или нужно все поля в индекс загонять?
Аноним 16/02/17 Чтв 15:45:12 #678 №934504 
>>934181
читать со словарем, плюс смотреть ютуб и т.д. практика короч. если есть желание фундаментально прокачаться, еще нужно добавить какой-нить видеокурс по произношеию типа american english и учебник по грамматике, допустим English Grammar by Raymond Murphy. я английский знаю норм (не считая литературного), но моей главной проблемой является лень читать на английском, если есть страница на русском, потому что для обработки английского текста требуется больше усилий, даже если все слова известны. но перебарываю себя, надеюсь, однажды эта разница сгладится и мне будет похуй, на каком языке читать.

по поводу собеседований, я был пока на одном, в моем случае были тесты на php (с вопросами на уверенность знания мануала, типа как отработает данная функция с переменной которая внутри указана как global, что вернет функция со ссылками, как отсортировать с изменением индекса в обратном порядке и тд) и в данных тестах было также много вопросов по sql и js, что подпортило мои результаты. в интервью классических вопросов, которые я ожидал (что такое синглтон, чем абстрактный класс отличается от интерфейса и т.д.) не было, зато были вопросы чем апач отличается от нджинкса, что происходит между отправкой запроса и выводом результата. такие вопросы на общую грамотность. возможно это была больше работа из серии "веб-мастер", поэтому там все было с перекосом в эту сторону.

>> На каком уровне нужно знать пхп, чтоб устроиться на стажировку?
я для себя понял так, что все, что написано в мануале, нужно знать уверенно, а не на уровне "ээ, я помню где про это написано, нужно залезть освежить".

плюс учебные проекты, которые у тебя есть, нужно максимально причесать, чтобы не говорить "вот тут такой-то функционал не работает, потому что это учебный проект"
Аноним 16/02/17 Чтв 19:20:19 #679 №934653 
dWbAt61.jpg
>>934504
Если просят, чтоб был опыт в коммерческой деятельности, можно ли обойти это на собеседовании ?
С каким редактором лучше работать?(пхпшторм не вариант)


Аноним 16/02/17 Чтв 19:24:21 #680 №934654 
>>934653
Почему пхпшторм не вариант? Единственная нормальная IDE. У меня как-то коллега в саблайме писал, так я подходил к нему и просто охуевал с того, как он каждый класс в глобальном поиске ищет.
Аноним 16/02/17 Чтв 19:34:23 #681 №934659 
>>934654
Сабжей для покупки нет, ибо школьник.
Аноним 16/02/17 Чтв 19:41:07 #682 №934662 
>>934654

Sublime 3 умеет переходить к классу и функции по имени. А к файлам по имени умеет переходить Sublime 2. Не понимаю, зачем там поиск. Наверно чтобы найти все случаи использования класса.
Аноним 16/02/17 Чтв 20:47:28 #683 №934697 
Поясните за Битрикс, насколько он норм/(не норм), за какое время примерно можно выучить?
Аноним 16/02/17 Чтв 20:53:05 #684 №934701 
>>934653
если просят чтоб был опыт, то нужно либо соврать, что он был (что вполне реально, допустим найти левый сайт вебстудии и сказать, что клепал там визитки и интернет магазины), но могут заебать вопросами и спалить, либо сказать, что опыта нет, но я вот умею то и это, вот мои готовые проекты. я бы выбрал второй вариант.

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

кстати на собеседовании также могут спросить, каким ide пользуешься, явно ожидая, что ты скажешь "штормом". у меня так и было.
Аноним 16/02/17 Чтв 20:55:19 #685 №934703 
>>934697
https://habrahabr.ru/post/282333/
Аноним 16/02/17 Чтв 21:45:38 #686 №934750 
Чому при записи кириллических символов в сессию они потом отображаются в виде Юникода? Например, вот это \u041c\u043e\u0441\u043a\u0432\u0430 = Москва.
Аноним 16/02/17 Чтв 23:32:56 #687 №934824 
>>934039
Я только что понял что значит этот алгоритм. Я думал что среди аргументов есть само сообщение которое нужно зашифровать, и алгоритм конкретно предназначен именно для этого, но оказалось что он только генерирует ключ по которому сообщение будет шифроваться.

Хорошо, на вопрос как одним из способов шифруются сообщения мы ответили, но что если помимо обмена сообщений, я хочу, чтобы сообщения навсегда сохранялись в БД. Если сессия(?) прекратит свое существование, то все параметры который нужны для алгоритма будут утрачены.
Я вижу только один вариант с хранением этих параметров или самого ключа в БД. Но я, опять же, тут наступаю на свой хвост: Если ключ храниться в БД, то возможность расшифровать сообщения есть не только у собеседников, но и у тех у кого есть доступ к этой самой БД.
Есть ли какие-нибудь решения этой проблемы или я хочу невозможного?
Аноним 17/02/17 Птн 01:04:09 #688 №934864 
>>934824

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

- хранить закрытый ключ в браузере (например в localstorage), если пользователь очистит данные в браузере, то ключ надо создавать новый, старые сообщения не расшифровать
- тут есть риск, что злоумышленник, захвативший компьютер пользователя, может извлечь его закрытый ключ. Для борьбы с этим можно зашифровать закрытый ключ паролем
- также, остается риск, что злоумышленник захватит сервер и запустит в браузере пользователя свой код, например, извлекающий закрытый ключ и отправляющий его злоумышленнику. Для борьбы с этим надо вместо сайта использовать отдельный клиент, например, расширение к браузеру или вообще отдельное приложение (Electron позволяет создавать приложения на HTML)
- можно вообще не хранить историю ни на сервере, ни в браузере

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

Аноним 17/02/17 Птн 01:20:28 #689 №934871 
>>934824

Также ты можешь почитать про то как реализуют шифрование другие мессенджеры:

- telegram (англ) https://core.telegram.org/api/end-to-end
- https://core.telegram.org/mtproto
- протокол приложения signal (англ) https://en.wikipedia.org/wiki/Signal_Protocol

Также, прочитай про SSL (это слой шифрования, который например используется в HTTPS).
Аноним 17/02/17 Птн 01:23:21 #690 №934872 
>>934824

Если ты хочешь хранить сообщения на сервере (для истории и синхронизации), то надо хранить их зашифрованными. А ключ хранить где-то в другом месте. Но может быть лучше вооще их не хранить? Или хотя бы спрашивать пользователя, хочет ли он вести запись истории или нет. Программа, которая уважает приватность пользователя, не должна ничего записывать без его согласия.
Аноним 17/02/17 Птн 04:16:21 #691 №934915 
код.png
код1.png
Посоны, решаю задачу из самоучителя, ответ ровно 61270 должен выйти, или нет?
Аноним 17/02/17 Птн 04:17:27 #692 №934917 
>>934915
Алсоу, задача про школьный кредит на айфон.
Аноним 17/02/17 Птн 04:26:19 #693 №934921 
>>934917
61270 с копейками
Аноним 17/02/17 Птн 04:27:16 #694 №934922 
>>934921
ебанный в рот...
Аноним 17/02/17 Птн 04:29:04 #695 №934924 
>>934922
думаешь проценты не надо считать раз последний месяц?
Аноним 17/02/17 Птн 04:30:56 #696 №934925 
14870952211401.jpg
>>934924
Хм, сейчас чекну.
Аноним 17/02/17 Птн 04:35:10 #697 №934927 
14840215880640.png
>>934924
О!! Бля, как я заебался. С десяти вечера сижу. Добра, анон.
Аноним 17/02/17 Птн 15:40:20 #698 №935100 
php.jpg
>>919074 (OP)
Реквестирую гуру книжного php. обмазался за много лет пиком, но так и не начинал читать. сейчас думаю с чего начать, может быть анон мне в этом поможет? хотел бы услышал порядок прочтения этих многобукав
Аноним 17/02/17 Птн 15:50:02 #699 №935104 
>>935100
Из всего этого списка говном не отдает только орейли
Аноним 17/02/17 Птн 20:11:30 #700 №935254 
14870256671590.webm
>>935100
>> PHP5 TOP SECRET
ШОК! АЛЛА ПУГАЧЕВА ВЫУЧИЛА ПХП ВО СНЕ БЛАГОДАРЯ.....
Аноним 17/02/17 Птн 23:04:48 #701 №935357 
>>935100
я когда спрашивал про книги у своего препода по этому делу (его квалификация у меня сомнений не вызывает, работает тимлидом), он говорит все переведенные книги по php - неактуальное говно, которым надо топить печь. думаю он имел в виду примерно такую литературу, как на картинке.

а рекомендовал он например такие книги:
роберт мартин "чистый код"
роберт мартин "идеальный программист"
чет фаулер "программист-фанатик"
Аноним 17/02/17 Птн 23:17:12 #702 №935364 
>>935357
Смысла начинать с этих книг нет.
Аноним 18/02/17 Суб 11:33:21 #703 №935512 
>>935364
а с каких есть?
Аноним 18/02/17 Суб 11:44:56 #704 №935518 
>>935512
Орайли с фотки выше, да и в шапке инфы полно. Начать учить язык очень легко, хоть на codecademy курсы проходи, тяжело будет дальше.
Аноним 18/02/17 Суб 12:06:54 #705 №935535 
Аноны, установил apache2, php, mysql-server, mysql-client, phpmyadmin на убунту 16.04. При переходе на localhost/phpmyadmin/ отображается php файл как есть, т. е. не интерперетируется. Что я сделал не так?
Аноним 18/02/17 Суб 13:27:15 #706 №935559 
>>935535
Какай то гайд использовал? ПХП до апача ставил? Зачем тебе pma?
Аноним 18/02/17 Суб 22:01:25 #707 №935916 
как можно работая в шторме настроить браузер (или сам шторм), чтобы при изменении php кода в файле браузер рефрешился? live edit, насколько я понял, работает только при редактировании html, css и js.

подскажите кто знает, а то уже заебался. не верю, что тут нет этого, в netbeans же был netbeans connector, который именно эту полезную функцию выполнял.
Аноним 18/02/17 Суб 22:08:58 #708 №935919 
>>935916

Я не знаю, есть ли такая функция, но советую отвыкать от такого режима. Лучше сесть, все сделать, и потом проверять, чем обновлять страницу каждые 10 секунд. Если тебе надо отследить, как происходит выполнение кода по шагам, попробуй использовать отладчик.
Аноним 18/02/17 Суб 23:08:51 #709 №935943 
Что скажете насчет БЭМ?
Аноним 18/02/17 Суб 23:30:38 #710 №935957 
>>935943
В пхп треде?
Аноним 18/02/17 Суб 23:48:52 #711 №935964 
>>935943

Система именования классов мне там нравится. Компоненты БЭМ у меня использовать повода и необходимости не было.
Скидки Аноним 19/02/17 Вск 00:56:52 #712 №936005 
2017-02-18-233531472x56scrot.png
>>930671
> Ну например, ты требуешь, чтобы все скидки были в процентах, и не даешь возможности написать произвольный алгоритм расчета скидки.

Тогда предлагаю ввести дополнительную абстракцию. Например, нужно добавить такую скидку: если среди товаров есть A и B, то снизить их суммарную стоимость на 20 единиц (не процентов). То есть раньше у нас было "снижение стоимости" основанное на процентах, теперь добавляется "снижение стоимости" в виде фиксированного значения. Код в классе Calculator поменялся с

$totalPrice += $matchedPrice - $matchedPrice ✱ $discountResult->getPercent();

на

$totalPrice += $matchedPrice - $discountResult->getDepreciation();

Не мог подобрать нормального названия для "снижения стоимомсти". Ну и подход с новой абстракцией получился многословным.
https://bitbucket.org/learning_acc/discounts/src

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

https://2ch.hk/pr/res/898502.html#919067
> Что касается комбинирования скидок - вот я не уверен, что тут его стоило делать. Я такие штуки видел во фреймворках, кажется,что они позволяют строить произвольные комбинации объектов, но на практике это не особо нужно и проще в коде прописать нужное условие.

Так по условию требуется их комбинировать, там ещё написано "Скидки применяются последовательно в порядке описанном выше."