«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Клуб любителей изучать PHP #87 Аноним 2017/03/22 01:57:52  №958715 1
image.jpeg (102, 500x500)
500x500
Добро пожаловать в наш уютный тред. Тут мы изучаем язык PHP (а также JS/CSS/HTML/SQL), решаем задачки и даже делаем простые сайты! Зачем? Кто-то хочет научиться программировать, кто-то - делать сайты, кто-то - просто размять мозги и заняться чем-то полезным.

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

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

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



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

Правила: ведем себя воспитанно, помогаем новичкам, постим ссылки на решения задачек, ОП их проверяет и дает советы и замечания. ОП заходит редко, где-то раз в 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) когда тебе не надо тратить время на поиск заказов и переговоры с неадекватными заказчиками.


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

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

Если тебе лень выравнивать код руками, закачай его на 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
Аноним 2017/03/22 02:03:51  №958721 2
Кто-нибудь изучал PHP по курсам Специалиста (4 уровня)? Я сейчас изучаю. Как думаете, этих знаний хватит, чтоб устроиться в какую-нибудь конторку? Все остальное, что нужно, я изучу на деле. Верстать умею. Когда-то я работал в одной веб-студии (давно), но там PHP никто с меня не спрашивал (только минимум). Делал верстку, потом ставил какую-нибудь Джумлу, натягивал на нее верстку и сижу, настраиваю Виртуэмарт. А сейчас смотрю вакансии - везде знания PHP нужны.
Ответы: >>958856 >>958860
Аноним 2017/03/22 02:39:58  №958737 3
>>958715 (OP)
Блядь, что за криворукий рукожоп создал тред? Где ссылка на прошлый? Где 4 пикчи? Где второй и третий посты. Мод, удаляй это, Настоящий оп пересоздаст.
Ответы: >>958742
Аноним 2017/03/22 02:48:25  №958742 4
>>958737
В прошлом треде больше тысячи сообщений, твой оп-слоупок раньше пересоздать не мог?
Ответы: >>958797
Аноним 2017/03/22 03:29:43  №958750 5
Помогите разобраться с БД.
в Lampp создал новый проект (laravel new test).
При php artisan migrate получаю

[Illuminate\Database\QueryException]
could not find driver (SQL: select * from information_schema.tables where table_schema = testdb and table_name = migrations)

[PDOException]
could not find driver

В laracasts он подымает mariadb сервер, но хотелось бы использовать Ксамповский.
Ответы: >>958809 >>962214
Аноним 2017/03/22 07:40:27  №958791 6
Господа, установил на дебиан php, и теперь в фоновых процессах крутится php fpm.
Это норма вообще, зачем оно если я не запускал сервер?
Ответы: >>958904 >>962214
Аноним 2017/03/22 08:31:34  №958797 7
>>958742
Это не оправдывает то, что ты сраный криворук, который не может в элементарный копипаст.
Ответы: >>958805
Аноним 2017/03/22 08:52:36  №958805 8
>>958797
Я удалил непонятный блок с хуй пойми какими ссылками и не добавил ссылку на предыдущий тред. Остальное оставил как есть. Ну и картинку только одну добавил (они все равно говно), а тот тред ушел на такое днище, что я поначалу подумал, что тут вообще треда про пхп нет (и охуел). Пусть твой "настоящий оп" в следующий раз ушами не хлопает, а следит за своим тредом. Алсо, ты можешь нормальную по твоему мнению шапку или нужную ее часть закинуть сообщением, все равно их пока еще мало. че как маленький?
Ответы: >>958820
Аноним 2017/03/22 09:17:48  №958809 9
>>958750
Оно же тебе пишет, что не может найти драйвер. Еще один вкатывальщик, который не знает английский?
Ответы: >>958951
Аноним 2017/03/22 09:40:39  №958820 10
>>958805
Второй пост с стандартами кодирования ты проебал. И кидай ссылку на перекаты в прошлый тред, там все еще люди сидят.
Ответы: >>958830 >>959033
Аноним 2017/03/22 09:53:54  №958830 11
>>958820
Они разве не видят что там овер 1000 сообщений?
Ответы: >>958851
Аноним 2017/03/22 10:12:04  №958845 12
1.PNG (6, 497x245)
245x497
2.PNG (19, 758x527)
527x758
3.PNG (258, 1365x621)
621x1365
Продублирую псто


PHPч, что делать в такой ситуации:
Получаю json пакет с массивами массивов (пикрелейтед 1 и 2).
декодирую его через
json_decode($data, true)
и получаю пикрелейтед 3
казалось бы, всё чики пики, но при попытке обращения к массиву [users]
выходит уведомление о несуществующем индексе users
Notice: Undefined index: users in ...
и
var_dump(jsonDecoded["users"])
выводит NULL. Хотя, казалось бы, данные вот они есть. Щто делать?
Ответы: >>958853 >>958885
Аноним 2017/03/22 10:17:24  №958849 13
Посоветуйте годных саблайм-пакетов для пхп и прочих хтмлов.
Ответы: >>962214
Аноним 2017/03/22 10:21:11  №958851 14
>>958830
Видят, но я например знаю, что если делают перекат, то в старый тред кидают ссылку. Если ссылки нет, значит продолжаем текущий тред. Каталог или нулевую я практически никогда не просматриваю.
Аноним 2017/03/22 10:21:44  №958853 15
>>958845
>Щто делать
Это похапэ, в нём важно не что делать, а как это делать.
САМОСТОЯТЕЛЬНО ВСЁ ДЕЛАТЬ, вот как.
Аноним 2017/03/22 10:23:43  №958856 16
Аноним 2017/03/22 10:29:00  №958860 17
>>958721
>Специалиста (4 уровня)
Кинь ссылку по-братски.
Ответы: >>958861
Аноним 2017/03/22 10:32:00  №958861 18
>>958860
Я давно скачивал (в прошлом году), качал с nnm-club. Ищи там, если осталось
Аноним 2017/03/22 11:31:12  №958885 19
>>958845
Всё, отбой. Разобрался.
Аноним 2017/03/22 12:19:12  №958904 20
Ответы: >>962214
Аноним 2017/03/22 14:08:00  №958951 21
>>958809
>не знает английский
Даже в гугл переводчик не может.
Аноним 2017/03/22 15:16:07  №958999 22
Что сделать, чтобы Unicode символы отображались (всякие крестики-нолики отсюда https://unicode-table.com, например)? Некоторые отображаются, а другие нет. Оп говорил, что это из-за отсутствия шрифтов в системе. У меня шиндоус7.
Ответы: >>960436 >>962214
Аноним 2017/03/22 16:08:48  №959021 23
Сап, посоны. В общем нужно сделать на сайте прием платежей и выплаты пользователям. Интересует вопрос относительно выплат. Допустим пользователь делает запрос на вывод какой-то суммы, и деньги переводятся на его счет. Все это автоматически, без моего участия. С помощью чего такое можно сделать? Яндекс Касса? Робокасса?
Аноним 2017/03/22 16:21:58  №959033 24
>>958820

Они не могут там сидеть, он удалён уже.
Аноним 2017/03/22 16:22:16  №959035 25
И даже в архиве нет.
Ответы: >>960142
Аноним 2017/03/22 17:10:07  №959052 26
Аноны, каков шанс стать php макакой и устроиться на работу без вышки?
Если будет неплохой скилл, то могут закрыть глаза на отсутствие образования?
Ответы: >>959055 >>959193
Аноним 2017/03/22 17:12:25  №959055 27
>>959052
Похуй на вышку, покажи им свои проекты на гитхабе.
Ответы: >>959545
Аноним 2017/03/22 20:04:55  №959187 28
Теперь напишем Контроллер, который будет выводить список объявлений. Он будет запрашивать этот список у Модели и вызывать Вид, чтобы отобразить его в виде HTML страницы. Не будем использовать здесь функций или классов, а напишем его в виде простого скрипта public/list.php. Мы кладем его в публичную папку, так как именно его мы будем вызывать для просмотра списка:

<?php

// Инициализируем наше приложение
require __DIR__ . '/../bootstrap.php';

// Получаем список объявлений
$posts = $postService->getAllPosts();

// Вызываем вид, чтобы отобразить их
require __DIR__ . '/../view/post-list.phtml';

Почему у нас контроллер "не видит" модель? Нам достаточно того, что уже затребован bootstrap.php, который как раз "видит" модель? Это обязательное требование - не указывать модель в контроллере, а делать вот так опосредованно?
Ответы: >>959194 >>962215
Аноним 2017/03/22 20:06:51  №959193 29
>>959052
Всем насрать на образование, даже не спросят. Главно чтоб кодить умел
Ответы: >>959545
Аноним 2017/03/22 20:07:48  №959194 30
>>959187
Что значит "не видит", то что нет require?
Ответы: >>959200
Аноним 2017/03/22 20:14:27  №959200 31
>>959194
Ну вот мы же вызываем в браузере контроллер по http://localhost:8001/list.php?
А в контроллере у нас инициализируется $posts = $postService->getAllPosts(); - а это у нас из модели.
Получается, контроллер "видит" $postService->getAllPosts() благодаря тому, что bootstrap.php их затребовал?
>Что значит "не видит", то что нет require?
Ну да, почему именно так, почему нет require __DIR__ . '/../PostService.php'; и require __DIR__ . '/../Post.php'; в самом контроллере? Для чего такой вот буфер, обязательно ли это вообще?
Ответы: >>959262
Аноним 2017/03/22 21:31:24  №959262 32
>>959200
Традиционно в bootstrap отправляют всю инициализацию приложения. Т.е. все что придется делать в начале каждого контроллера. В этом случае я полагаю: подключение к базе данных и создание экземпляра PostService. Нужно избегать повторений кода. Если что то нужно писать больше одного раза, то пора думать как это вынести в функцию, класс или вот такой bootstrap.
Плюс есть еще автозагрузка классов. Это когда есть функция которая занимается подгрузкой нужных файлов при обращении к классам. Подробнее про автозагрузку: https://github.com/codedokode/pasta/blob/master/php/autoload.md
Про базовую структуру есть немного в задаче про список абитуриентов из ОП-поста.
Ответы: >>959353
Аноним 2017/03/22 22:28:06  №959289 33
https://ekaterinburg.hh.ru/vacancy/19691392

Зовут вот сюда. Что значит базовые знания? Может есть что почитать по пыхопе применительно к практической его части(сайты, например)
Или просто процесс разработки проекта с какими-то примерами кода. Реально такие в интернетах найти?
Ответы: >>962215
Аноним 2017/03/22 23:54:29  №959353 34
>>959262
>Традиционно в bootstrap отправляют всю инициализацию приложения. Т.е. все что придется делать в начале каждого контроллера. В этом случае я полагаю: подключение к базе данных и создание экземпляра PostService. Нужно избегать повторений кода. Если что то нужно писать больше одного раза, то пора думать как это вынести в функцию, класс или вот такой bootstrap.
Спасибо, теперь понятно.
>Плюс есть еще автозагрузка классов. Это когда есть функция которая занимается подгрузкой нужных файлов при обращении к классам. Подробнее про автозагрузку: https://github.com/codedokode/pasta/blob/master/php/autoload.md
Не вполне понятно, где прописывать функцию автозагрузки и обязательная ли она? Если у меня в проекте, допустим, всё так или иначе явно инициализируется?
До задачи про список студентов мне ещё далеко, я туда даже пока и не смотрю
Ответы: >>959381 >>962215
Аноним 2017/03/23 00:16:06  №959357 35
Анончики, воюю с задачей "граммар-наци" из регулярок и дошел до пункта исправления ошибок, и чот не понимаю, как грамотно заделать скобки, или на каждый случай исправления надо свою регулярку писать?
В конкретно замкнулся на автоисправлении "чю/щю"
https://3v4l.org/67RW6
Ответы: >>959364 >>962216
Аноним 2017/03/23 00:34:25  №959364 36
>>959357
попробуй либо fbox.php
Аноним 2017/03/23 01:24:12  №959381 37
>>959353
Для задачи про студентов я писал в том же bootstrap.php. Тут тебе решать, если приложение маленькое, то можно и без нее наверно, когда классов становится больше до автозаргузка функций сильно упрощает жизнь. Вообще ее можно написать в учебных целях один раз, т.к. composer (менеджер пакетов для php) предлагает свою функцию. Нужно только разобраться с psr-4 и пространством имен в php. Учись в своем темпе не перегружайся пока.
Аноним 2017/03/23 08:55:26  №959440 38
Делаю задание по регуляркам. Про проверку на номер телефона. В подсказке там написано:

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

я понимаю что сначала идет так:

/^(\s|[+])*?

а потом что? Как сделать так чтобы он искал что между цифрами могут быть пробелы скобки и тире?
Ответы: >>959663
Аноним 2017/03/23 10:45:06  №959464 39
Сегодня проснулся с очень странным желанием чему-нибудь научится. Подумал что можно попробовать и пограмирование, увидев мой случай в шапке (имел тройку по математике) перешел по ссылке с обучением, но осознав цифры уже во втором задании желание пропало и я решил напиться.
Ответы: >>962216
Аноним 2017/03/23 14:18:56  №959545 40
>>959055
>>959193
Спасибо, обнадежили. Просто мне знакомые с вышками говорили, что без них вообще сейчас никуда.
Ответы: >>962216
Аноним 2017/03/23 18:11:43  №959663 41
>>959440
Привет! Я сейчас тоже делаю этот урок, но на другой задаче. Может, эту задачу я выполнил неправильно, но по предоставленным ОПом номерам она работает.
>Как сделать так чтобы он искал что между цифрами могут быть пробелы скобки и тире?
Тут как в математике, тебе надо вынести за скобки ((любое количество скобок-тире-пробелов)(любая цифра)(любое количество скобок-тире-пробелов)) * 10 раз.
Ответы: >>959685 >>962216
Аноним 2017/03/23 18:48:16  №959685 42
>>959663
Спасибо бро! Я не думал что так просто.
Ответы: >>959701
Аноним 2017/03/23 18:54:29  №959687 43
Аноны, как с помощью регулярных выражений выделить слово целиком по определенному слогу? Пример: выделить все слово "закрыть" по "зак".
Ответы: >>959700 >>959701 >>962217
Аноним 2017/03/23 19:21:28  №959700 44
Аноним 2017/03/23 19:23:31  №959701 45
>>959685
не за что, сам сражаюсь с регулярками.
>>959687
тебе нужен два флага, означающие границу слова - \b. То есть должно быть - граница слова, твоё условие, любое количество любых букв, граница слова.
Аноним 2017/03/23 21:07:16  №959723 46
Если я полностью усвою http://archive-ipq-co.narod.ru смогу ли я делать простенькие задания за отзыв/100-200-300р на фрилансе? Просто поглядел там задания-вроде такое, нужно только функции знать , но это гуглится вроде
Ответы: >>959734 >>962217
Аноним 2017/03/23 21:11:10  №959725 47
Сделал задачу граммар-наци с исправлением ошибок, проверьте пожалуйста http://ideone.com/ssr1bV.
И заодно подскажите, как надо настроить регулярку? А то она у меня в предложении:
"после таких знаков:восклицательного!И даже"
отсутствие пробела в "знаков:восклицательного" вылавливает, а уже в "восклицательного!И" не вылавливает.
Ответы: >>959728 >>959742 >>962217
Аноним 2017/03/23 21:12:27  №959728 48
Ответы: >>959742
Аноним 2017/03/23 21:20:57  №959734 49
>>959723
Покажи задания. Интересно посмотреть.
По той ссылке лишь основы программирования (на пхп), это даже не минимум.
Ответы: >>959736
Аноним 2017/03/23 21:24:03  №959736 50
>>959734
Могу устно написать пример. Написать скрипт, что бы в будние дни писался один текст, а в выходные-другой( как я понимаю используется функция date() ) . За это дают 500р. Но заказ уже ушел куда то
Аноним 2017/03/23 21:37:16  №959742 51
ОПушка, помоги разобраться с https://en.wikipedia.org/wiki/Secure_Remote_Password_protocol
http://srp.stanford.edu/design.html

Хочу понять принцип, но везде объясняют туговато для меня (алгебра и матан на нуле). Можно разобрать на примере например https://github.com/RuslanZavacky/srp-6a-demo/tree/master/public или под твоим руководством написать своё.

>>959728
>>959725
А потому что у тебя идет вхождение "знаков:восклицательного", и для следующего вхождения с восклицательным знаком нет начальных буков в регэкспе. Сравни: https://regex101.com/r/XdmE2c/1
Но! Даже здесь не войдет вот такая строка "Что?О!Боги!", так что подумай ещё над условием.
Аноним 2017/03/23 22:08:38  №959760 52
Студентодел репортин. Значит решил я сделать хитрый роутинг, суть такова - объект-роутер не только у меня разбирает урл, но еще и возвращает объект нужного контроллера. Может идея и не оче, но я хочу довести ее до конца. Вот сам метод:
public function getController()
{
if (class_exists($this->controller))return new $this->controller;
}
Ну вы понел. Проблема в том, что не работает с пространствами имен. Т.е. если сделать класс с нужными названием прямо в файле где сделан объект-роутер, то будет работать. А вот прописать такую хуитку return new Controllers\$this->controller уже нельзя. Как можно решить мою траблу? Или я все таки вообще не туда свернул? Аволоад работет нормально, проверял.
Аноним 2017/03/23 23:00:10  №959794 53
>>959760
>объект-роутер не только у меня разбирает урл, но еще и возвращает объект нужного контроллера
Так это же и есть все цели роутера? Или я что-то не так понял?
Ответы: >>959827
Аноним 2017/03/23 23:33:05  №959827 54
>>959794
Я в йии такой принцип увидел, показалось очень разумным вот и пытаюсь реализовать своими силами.
Аноним 2017/03/23 23:34:15  №959829 55
>>959742
>А потому что у тебя идет вхождение "знаков:восклицательного", и для следующего вхождения с восклицательным знаком нет начальных буков в регэкспе.
Если я сделаю регулярку типа /(!|;|\.|,|\?)[^ ]/, тогда я не смогу выполнить первое условие задачи, что мол надо возвращать ошибку с куском текста, поэтому я и хотел брать слова целиком. Какой можно еще вариант придумать, чтобы и ошибку поймать, и кусочек текста вывести с ошибкой?
Ответы: >>959869
Аноним 2017/03/24 00:18:01  №959839 56
Я не оп, просто хочу напомнить нулевое, первое, второе и третье правило правило написания своих крипто библиотек - никогда не пиши их, возьми готовую (не для учебных целей, очевидно).
Если тебе нужен именно принцип, а не детали (в которых, как известно, дьявол), то тут всё в принципе просто.
Мы можем передавать пароль плейнтекстом, сервер сравнит его с хранящимся у себя на сервере плейнтекст паролем.
Мы можем передавать пароль плейнтекстом, сервер сделает с ним математическую магию и сравнит с хранящейся у себя математической магией, профит в том, что сервер не знает твой пароль, и не может его слить, минусы в том, что мониторящий трафик злой человек знает твой пароль.
Мы можем делать математическую магию на клиенте и отправлять её по сети, проблема в том, что это эквивалент пароля, мониторящий трафик человек знает хеш, он не знает плейнекстом твой пароль, но он может залогиниться в этот сервис, используя этот хеш в любом случае.
И вот тут начинаются изъебы, как аутентифицировать себя так, чтоб не передавать пароль или эквивалент пароля.
Например, клиент отправляет серверу рандомное число, получает в ответ рандомное число, делает с ними двумя и своим паролем математическую магию, сервер делает с своей копией этих чисел и паролем то же самое, если они совпадают, то ты аутентификацию прошёл. Профит в том, что теперь эти данные одноразовые, так что мониторящий трафик человек не сможет потом залогиниться в сервис, используя то, что он услышал. Новая проблема в том, что зная эти два числа и результат, злой человек сможет попытаться угадать пароль, подставляя свои значения пароля и сравнивая их с результатом.
Один из способов побороть эту проблему, это вот твой срп.
Как можно проще - есть алгоритм Диффи-Хеллмана, согласно ему, клиент придумывает рандомное число a, сервер придумывает рандомное число b, после вычислений, за которыми на википедию, клиент получает A, сервер получает B, после чего они ими обмениваются и клиент получает ключ из серверного B, используя свой a, сервер получает ключ из клиентского A, используя свой b, в итоге у них получается одно и то же число. Идея состоит в том, что подслушивающий знает A и B, но из них математически невозможно получить a и b, которые необходимы для попыток угадывания, и которые не передаются по сети, как в предыдущем способе. СРП пароль в эту адскую смесь, из-за чего это может считаться механизмом аутентификации.
А теперь, почему это всё равно не нужно.
Во-первых, все эти механизмы исходят из того, что сервер уже знает что-то, с чем можно сравнить твой пароль. Так что при изначальной регистрации тебе что-то нужно будет туда передать в любом случае, так что если злой мониторящий человек перехватит момент регистрации, у него всё равно будет твой пароль или его эквивалент. Что ты можешь с этим сделать? Надеяться на https.
СРП вычисления будут исполняться в твоем браузере яваскриптом. Откуда ты получаешь скрипты? От сервера. Как ты можешь доверять этому скрипту и знать что злой человек по пути не подсунул туда что-то другое? Надеяться на https. Так что если ты хочешь чтоб регистрация на твоем сайте была уровня "ввел логин, ввел пароль, нажал войти", можно сразу надеяться на https и делать как обычно.
>>959760
>new Controllers\$this->controller
$newClass = '\Controllers\' . $this->controller;
return new $newClass;
?
Ответы: >>960021 >>962227 >>962227
Аноним 2017/03/24 00:34:50  №959843 57
download.jpeg (67, 600x388)
388x600
Аноны, как вам идея еженедльно устраивать некие хакатоны на дваче. Составляем список проектов которые нужно реализовать(не совсем простые, а вроде файлообменника что предложен в шапке). Далее голосованием выбираем какой проект нужно реализовать, а аноны все это пилят и выкладывают на гитхаб с определенным тэгом. Так новичик смогут учиться у более опытных товарищей.
Алсо, чтобы опытным товарщам не было скучно, то для них можно будет добавить "задачи со звездочкой", в котором нужно будет реазиловать какие-то более сложные функции.

А я потом буду отдавать проекты заказчикам и получать бабло
Ответы: >>959848
Аноним 2017/03/24 00:40:42  №959845 58
>>959760
Наркомания какая-то, такого ты хочешь штоле.
https://3v4l.org/a86Md
Мне не кажется это разумным, роутер должен работать с роутами. Определить какой контроллер отвечает - несомненно, самому его создавать - нахуй надо, просто передать информацию дальше, иначе это лишает тебя возможности, например, ввести систему ивентов в свой фреймворк, где операции "контроллер для роутера определен" и "контроллер создан, метод контроллера вызван" идут отдельно друг от друга и юзер может между ними вставить какую-то свою логику.
Ответы: >>960021
Аноним 2017/03/24 00:42:34  №959846 59
Закончил с регулярками, упражнение на поиск и замену латинских букв, похожих на русские.

http://ideone.com/l2XaUx
Ответы: >>962227
Аноним 2017/03/24 00:48:15  №959848 60
>>959843
Я бы даже рад поучаствовать, да со всеми этими заказами, своими проектами и работой я не могу ухватиться за соломинку того времени, когда можно просто пострадать херней.
Аноним 2017/03/24 01:52:24  №959869 61
Катал простыню, но потом испортилось настроение, так что скажу просто: спасибо за подробный ответ, самое главное теперь понял принцип.

>>959829
Хех, а вот это
>В тексте найдена ошибка: " а
чем отличается от
>В тексте найдена ошибка: !И
м? Всё у тебя хорошо там, ну можешь отделить показ ошибок в отдельную функцию и там то уж форматировать вывод как хочешь, с пояснениями и скриншотами.
Аноним 2017/03/24 12:33:54  №960021 62
>>959839
>$newClass = '\Controllers\' . $this->controller;
Ох блять, спасибо. Интересно, откуда такая логика, что можно сделать $a = new $b, но тоже самое нельзя сделать с неймспейсом?
>>959845
Типа того. Може и ты прав, но я уже доведу дело до конца.
Ответы: >>960107 >>960142
Аноним 2017/03/24 13:41:39  №960061 63
>>960060
Пиздоноблядь порвалась?
someApprentice 2017/03/24 13:46:49  №960062 64
http://phpclub.rf.gd/pr/res/945059.html#955671
>Молодец, отличная штука. Ты её сам делаешь, или пулл реквесты принимаешь? У меня есть несколько предложений по улучшению структуры проекта, архитектуры и других вещей. Я могу их подробно описать, потом мы это обсудим в треде или на гитхабе. Как тебе идея? Будет интересный опыт создания чего-то общего нашим уютным тредом.
Любая помощь будет полезна. Мне на самом деле пригодился бы кто-нибудь кто мог поддерживать проект пока меня нет.
Ответы: >>960065
Аноним 2017/03/24 14:04:57  №960065 65
>>960062
Насчет поддерживать проект не знаю, но возможно смогу предоставить тебе бесплатный хостинг для него (включая хранилище под картинки). Только не сейчас, а в конце апреля - начале мая. По коду я могу отписать проблемы какие заметил, насчет фиксить и дополнять я на самом деле не знаю, работа занимает большинство моего времени, но возможно в следующем месяце у меня будет его побольше. Оставь свою почту, куда тебе можно отписать и обсудить эти вопросы. Структуру проекта я думаю лучше обсуждать на гитхабе или где-нибудь в другом месте, чтобы не засорять тред.
Ответы: >>960068
someApprentice 2017/03/24 14:10:01  №960068 66
Аноним 2017/03/24 14:14:59  №960069 67
top hat monocle.jpg (30, 736x571)
571x736
>>960063
>дат фил когда видишь неофита, который не знает что IDE почти всегда ставят вместо таба 4 пробела и что это общепринятый знак хорошего тона
Ответы: >>960142
Аноним 2017/03/24 14:26:58  №960075 68
>>960072
Дай мне роту пробелов и я разобью армию табов.
Аноним 2017/03/24 14:30:03  №960077 69
>>960072
Ты либо наглухо отбитый, либо тралишь. За таб вместо 4х пробелов в приличной компании уволить могу за нехуй, это нарушение уровня забивания болта на стандарты.
Ответы: >>960079 >>960084
Аноним 2017/03/24 14:32:34  №960079 70
>>960077
>4 раза жать пробел вместо 1 таба
ну если ты не ценишь свое время, то это причина тебя уволить безусловно.
Ответы: >>960080 >>960081
Аноним 2017/03/24 14:33:13  №960080 71
>>960079
Просто ты макака которая среду разработки настроить не может.
Аноним 2017/03/24 14:34:09  №960081 72
>>960079
Ты реально тупой)
Нажимаешь Tab и у тебя ставится 4 пробела, проблемы?
Ответы: >>960085 >>960142
Аноним 2017/03/24 14:37:21  №960084 73
>>960077
такие петушинные стандарты могут быть только в петушиных конторах, куда нормальный человек устраиваться не будет
что примечательно, даже на хабрапомойке, несмотря на лютое засилие быдлокодерских пидерах пробелобляди всегда всасывают во всех холиварах
хотя, пробелодебилу нет смысла что-то доказывать, если человек настолько туп что не способен сам особзнать убогость пробелодрисни, с ним не нужно спорить, ему нужно молча ссать в рот
Ответы: >>960099
Аноним 2017/03/24 14:39:22  №960085 74
>>960081
А потом какое-то хуйло поудалет по одному пробелу и кое-где будет не 4 пробела а 3, а другое хуйло превращает таб не в 4 пробела а в 2 и энджой ё пробелопомойка.
Ответы: >>960099 >>960103
Аноним 2017/03/24 15:08:04  №960099 75
>>960085
>>960084
Боюсь даже подумать где вы могли работать.
Аноним 2017/03/24 15:15:18  №960103 76
>>960085
>какое-то хуйло
Ты что-ли?
Ответы: >>960142
Аноним 2017/03/24 15:21:33  №960107 77
>>960021
Логика очень проста, ты вызываешь new <стринг>, соответственно неймспейс тоже должен быть частью этого стринга, пхп мозгов не хватает литерал неймспейса с стрингом правильно соединить, ай гесс.
Аноним 2017/03/24 15:43:14  №960112 78
Я не пойму проблему с Табуляцией и Пробелами.
Во всех нормальных редакторах, давно табуляция автоматически = 4 пробела.
А дальше каждый дрочит как хочет. Какого хуя вы бугуртите-то тут?
Ответы: >>960142
Аноним 2017/03/24 16:52:05  №960142 79
>>960021
> Интересно, откуда такая логика, что можно сделать $a = new $b, но тоже самое нельзя сделать с неймспейсом?
Можно и с неймспейсами, дело тут не в них, а в приоритетах между операторами new и . (конкатенация): https://secure.php.net/manual/en/language.operators.precedence.php
У new самый высокий приоритет. Такой код будет работать:

$className = 'std' . 'Class';
new $className;

А такой нет:

new 'std' . 'Class';

PHP пытается сначала выполнить new 'std', класса 'std' не находит и падает с ошибкой.

>>960112
>>960103
>>960081
>>960069
Зачем вы на толстоту ведётесь, тот неадекват пришёл сюда не за конструктивным диалогом, вы вступили в грязь, а теперь размазываете её по треду.

>>959035
Есть на архиваче: https://arhivach.org/thread/245785/
Аноним 2017/03/24 16:53:16  №960144 80
Извиняюсь за хабрапарашу.
https://habrahabr.ru/post/120615/

В статье генерация капчи и хранение md5 от результата в куках.
Почему достаточно будет один раз разгадать капчу и использовать это же значение чтобы потом пробиться?
Никак не могу понять. В скрипте же постоянно всё заново перегенерируется.
Ответы: >>960160
Аноним 2017/03/24 17:24:14  №960160 81
>>960144
Лол, зная лично автора статьи могу сказать, что в 2011 её писал ебаный школьник, так что поискал бы ты что-то получше.
А насчет почему - потому что хранится в куках, блеать.
Сервер отдает тебе куки с хешем капчи, потом от тебя же этот куки забирает и сравнивает его с кодом, который тоже приходит от тебя. Таким образом у тебя после одного удачного угадывания есть пара из кода и куки с хешем, которые проходят проверку, ты можешь теперь игнорировать новые куки и сабмитить всё ту же пару.
Аноним 2017/03/24 17:24:59  №960162 82
ОП, ты не напутал там, случайно?
Как может получиться 25 человек в департаменте закупок, если
>Департамент закупок: 9×ме1, 3×ме2, 2×ме3, 2×ма1 + руководитель департамента ме2
>9+3+2+2+1=17
?
Вот так решил просто то, что требовалось: https://3v4l.org/ce8iF
Сначала думал сразу сделать так, чтобы антикризисные меры можно было применить (был класс Компания, который создавал департаменты, департаменты создавали работников - в прошлом треде ещё вы подсказывали, за что спасибо), но нет, это для меня пока сложно.
Ответы: >>961000 >>962228
Аноним 2017/03/24 18:58:05  №960224 83
анон, помоги нубу, пожалуйста. Читаю гайды по циклам, и не могу понять в чем ошибка и что я сделал не так. >Всего будет выплачено около 61270 р. за 13 мес.
А у меня до этого места просто не доходит. Я не понял изначально где была ошибка, подумал что ошибка в расположении IF. Вот изначальный код с ошибками http://codepad.org/nm9jPcpd
Ответы: >>960234 >>960235 >>960237
Аноним 2017/03/24 19:08:21  №960231 84
Аноны, а можно сначала изучить какой-нибудь простенький фреймворк и написать на нем что-нибудь, а потом сделать задачу со списком студентов? Или так вся польза от обучения пропадает?
Аноним 2017/03/24 19:11:26  №960233 85
>>960231
Slim framework твой выбор.
Ответы: >>960256
Аноним 2017/03/24 19:14:20  №960234 86
>>960224
>pasted on Sep 14:
Што?
Ну а так ты прав: ошибка в
if ($creditBalance < 0)
Там, во-первых, $creditBalance никогда не должен быть меньше нуля, он может быть только равен нулю, сам подумай.
А во-вторых, условие там должны быть такое: если $creditBalance с прибавленными 3-мя процентами и тысячей рублей равен нулю. То есть сначала у нас крутится цикл с прибавлением тысячи и трёх процентов, а затем в самом последнем круге выплата с прибавленными процентами и тысячей за обслуживание становится меньше пяти тысяч - анон её выплачивает, после чего цикл останавливается.
>$month <= 20
Неверное условие, слишком не по-программистски это! ОП почему-то не исправил до сих пор. Но он хитёр, это может быть такой задумкой, да.
Там лучше указать такое условие: пока $creditBalance не выплачен (то есть не равен нулю) - это самое естественное условие.

>>960231
Палю годноту: https://www.youtube.com/watch?v=jmIn0dQJF28&index=1&list=PLa9lO_Eq-vZWucOH1auan_m-POa3n7fV6
Вполне можно, сам так хочу сделать, азаза
Конечно, надо где-то увидеть, как это всё функционирует. Программистам в вузиках же показывают всё наглядно, а кто тебе покажет наглядно?
И фреймворк посмотришь, и прочее.
У ОПа так-то про MVC почитай, про БД, это всё тоже поможет.
Я пьян.
Ответы: >>960237 >>960256 >>960261
Аноним 2017/03/24 19:14:37  №960235 87
>>960224
Если в цикле, то это должно выглядеть как-то так:
for ($i = 0; $i < 12; $i++). У тебя. До 12 цикл не доходит.

for ($i = 0; $i <= 12; $i++) - дойдет
Ответы: >>960237 >>960238
Аноним 2017/03/24 19:16:09  №960237 88
>>960224
>>960235
Пардон, проебался в глаза и не увидел ссылки на код. Этот анон все правильно сказал - >>960234
Аноним 2017/03/24 19:19:33  №960238 89
>>960235
На самом деле есть простое правило, если начинаешь с 0, то всегда используй < N, если с 1, то <= N, чтоб количество итераций было равно N и ты не путался.
Аноним 2017/03/24 19:34:51  №960245 90
>>960231
Платиновый вопрос. Нет, так делать не стоит. Будешь ходить по кругу без понимания технологий на которых фреймворк работает, максимум научишься повторять как все делается в видосиках. А вот сделаешь студентов, поймешь что такое MVC, разберешься в ООП и прочем - тогда и фреймворки хорошо зайдут.
Ответы: >>960246 >>960247 >>960256
Аноним 2017/03/24 19:36:43  №960246 91
>>960245
Говорит программист, которому всё это показывали в вузиках?
Ответы: >>960248
Аноним 2017/03/24 19:39:45  №960247 92
>>960245
>когда нассали в глаза и не можешь посмотреть шаблонный код в исходниках другой программы
Аноним 2017/03/24 19:41:51  №960248 93
>>960246
А что там показывать то? Я просто не понимаю зачем поперед батьки в пекло лезть. Для тех же студентов надо считай только MVC знать, все остальное гуглится, можно тут спрашивать. Я пока их делал считай свой мини-фреймворк написал, с роутингом, и контроллерами.
Ответы: >>960251
Аноним 2017/03/24 19:45:19  №960251 94
>>960248
Ну вот ты видел, как играют в футбол, даже сам играл, наверное?
А представь, как объяснить человеку, который не видел ни мяча, ни бегать не умеет, как играть в футбол.
Иногда надо просто увидеть, почувствовать, тогда сам начинаешь ощущать себя увереннее и свободнее.
Если он задался целью, то потом всё равно сделает всё как нужно.
Ответы: >>960257 >>962228
Аноним 2017/03/24 19:47:14  №960256 95
>>960233
Да, с него и собирался начать.
>>960234
Спасибо за видео, надо посмотреть.
>>960245
>Будешь ходить по кругу без понимания технологий на которых фреймворк работает
Даже если прочитать и понять исходники фреймворка?
Аноним 2017/03/24 19:47:49  №960257 96
>>960251
>как объяснить человеку, который не видел ни мяча, ни бегать не умеет, как играть в футбол.
Надо показать ему мяч и объяснить правила игры в футбол, не? Ну серьезно же. Пускай язык учит, а потом уже экосистему языка.
Ответы: >>960266
Аноним 2017/03/24 19:50:23  №960259 97
>>960256
>Даже если прочитать и понять исходники фреймворка?
Ебанешься, серьезно. Ну слим еще ладно, может осилишь исходники, но все равно буде куча вопросов "а почему так а не так". Фреймворк так это же готовая архитектура, вот ее и надо понимать.
Ответы: >>960263
Аноним 2017/03/24 19:52:57  №960261 98
Аноним 2017/03/24 19:53:04  №960262 99
>>960256
>Да, с него и собирался начать.
Вот и правильно, там очень понятная и маленькая документация.

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

Ответы: >>962228
Аноним 2017/03/24 19:55:35  №960263 100
>>960259
>а почему так а не так
Это уже вопрос другой плоскости. Есть разные реализации одного интерфейса.


Аноним 2017/03/24 19:55:40  №960265 101
>>960256
Если ты такой нуб, как говоришь, то лучше написать свой велосипед и не париться. Код фреймворка читать дело очень полезное, но не на этом этапе. Сейчас у тебя просто каша в голвое окажется, какие-то мелочи, выдранные из контекста.
Аноним 2017/03/24 19:57:39  №960266 102
>>960257
Так он бегать не умеет! Никогда мяч не видел! Не понимает, где свои ворота, а где чужие!
(Я же фигурально.)
Аноним 2017/03/24 19:58:55  №960267 103
>>960256
Во-первых, если ты реально способен вот просто сесть почитать исходники и разобраться, то ты и студентов написать способен. Во-вторых, когда человеку показывают, как делать, без понимания того, зачем делать - это хуево, это очень хуево. Может если какая-то серия видосиков, где кто-то будет этот фреймворк разбирать по строчке, и то ньюфаг же тупо не сможет отличить, учат ли его нормальным практикам, или какой-то индусской хуйне.
Профит написания своих велосипедов именно в том, чтоб самому прочувствовать, зачем эти компоненты нужны. Типично человек смотрит на незнакомую систему из дохуя компонентов, мозг ему говорит СЛОЖНАБЛЯДЬ, и у него начинаются вопросы "а зачем то, а зачем это, зачем напридумывали тут хуйни, а почему в один файл не засунуть, етц", а вот если он с обратной стороны начнет, засунет всё в один файл и охуеет потом от того, как ему надо будет копипастить код в 15 местах для минимальных изменений, вот этот момент прозрения ничего не заменит.
Ответы: >>960270
Аноним 2017/03/24 19:59:32  №960268 104
Ну это же мелочи, которые можно обьяснить на пальцах. а вот как пинать мяч, вести его давать пас, можно только на практике.
Аноним 2017/03/24 20:03:54  №960270 105
>>960267
Ни кто же не говорит брать мастхев типо симфони, юи, лару.
Микро фреймворки - это элементарщина, все что там есть - роутинг, контроллеры, обработчики http запросов и внедрение зависимостей.
Ответы: >>960275 >>960276 >>962228
Аноним 2017/03/24 20:09:56  №960275 106
>>960270
>все что там есть - роутинг, контроллеры, обработчики http запросов и внедрение зависимостей.
Гораздо лучше уж самому все это написать.
Аноним 2017/03/24 20:10:45  №960276 107
>>960270
Я про микрофреймворки и говорю, послать кого угодно читать исходники симфони это, конечно, экспириенс.
Вот эту элементарщину и надо самому писать, роутинг, контроллеры и обработчики, криво, хуево, с хуевым распределением обязанностей, с смешиванием роутера и контроллера в единый организм говно, но своё. Это совершенно не заберет много времени, но предоставит возможность набить все необходимые шишки.
Ответы: >>960279
Аноним 2017/03/24 20:19:01  №960279 108
>>960276
А вот мне например кажется, что косяков будет так много, что человек просто будет топтаться на месте большую часть времени. Вед веб разработка просто нереально быстро развивается даже в области бек-энда.

Есть всё разница между - выучить шаблоны "банды четырех" и зубрить шаблоны в книге Мэтта Занстры.
Есть некоторые фундаментальные вещи, которые нужно знвть, а есть вещи для, которых есть справочник в который можно всегда подсмотреть. Если не отсеивать лишнюю информацию, можно голову забить до уровня шизы, а толку от этого будет мало, ведь время идет технологии меняются.
Ответы: >>960285 >>962228
Аноним 2017/03/24 20:30:29  №960285 109
>>960279
Если человек будет топтаться на месте при написании примитивнейшнего фронт контроллера, то я боюсь представить, сколько косяков у этого человека будет при использовании более адвансед технологий, может стоит задуматься о другой профессии?
>просто нереально быстро развивается
Угу, все эти блидинг эдж концепты как хттп запрос и ответ, сессии, мвц, ооп и вытекающие. Просто вчера придумали, к завтрашнему дню устареют.
Ответы: >>960292 >>962228
Аноним 2017/03/24 20:41:39  №960292 110
>>960285
> хттп запрос и ответ, сессии, мвц, ооп
Это все просто абстракции, и да, их реализации меняются.
Ответы: >>960300
Аноним 2017/03/24 20:42:54  №960294 111
Ответы: >>960296 >>960299
Аноним 2017/03/24 20:44:14  №960296 112
>>960294
Ах, да. Это охуительная задачка из учебника про школьника и айфон в кредит. Заранее спасибо.
Аноним 2017/03/24 20:46:45  №960299 113
>>960294
а в чем проблема именно заключается то?
Ответы: >>960304
Аноним 2017/03/24 20:47:08  №960300 114
>>960292
Охуеть абстракции. Начали говорить про методику обучения, внезапно человека понесло в какую-то метафизику. Всё абстракции над машинным кодом, ёпта. Хттп запросы у него уже абстракции, ну приехали теперь. Нахуя их учить, ведь завтра просто возьмет и поменяется. URI больше не будем парсить, хедеры не будем отправлять, POST GET и прочие отменят. Хуякции, блядь.
Ответы: >>960307
Аноним 2017/03/24 20:51:56  №960304 115
1234.png (162, 1920x1028)
1028x1920
>>960299
Прости, я подумал что вопрос платиновый и не стал вдаваться в подробности.
На пике задача. И мой результат не сходится с тем, что в учебнике.
Ответы: >>960305
Аноним 2017/03/24 20:55:20  №960305 116
>>960304
Я, кстати, тоже на этом же моменте. И у меня тоже почему то выходит не правильно. Идет только до 12 месяца . Хм.
Ответы: >>960312 >>960320
Аноним 2017/03/24 20:56:56  №960306 117
>>960231
Можно. Мне вот писание своего велосипедного МВЦ ничего ровным счетом не дало. Сейчас даже не вспомню, как его делал, и повторю только с гуглом. А в фреймворках все простенько: в контроллерах роуты, в моделях - работа с бд, во вью хтмл код. хуяк хуяк и готово, в уи даже регистрация и логин сразу из коробки сделаны.
Ответы: >>960333
Аноним 2017/03/24 20:57:01  №960307 118
>>960300
Блять, мудак ну сиди и учи машинные коды, мы тебе перезвоним.
Аноним 2017/03/24 21:00:59  №960312 119
>>960305
Ну давай вместе думать. Я пока вручную всё посчитаю.
Аноним 2017/03/24 21:14:58  №960320 120
>>960305
Я разобрался. Ответ под спойлером. В условии надо ставить не 5к, а 4. Вот код если что: http://ideone.com/ZXJxEN
Аноним 2017/03/24 21:26:04  №960330 121
Test
Аноним 2017/03/24 21:28:38  №960331 122
>>960320
Спасибо, анон. А я все сидел тупил
Аноним 2017/03/24 21:28:59  №960332 123
Макаба, пусти ОПа!

ОП, у меня тоже была проблема с тем, что по ошибке выдали бан и стёрли все посты. Я отписал в /d, с указанием номера бана (обязательно) и причины, и меня разбанили. Попроси ещё, чтобы посты восстановили.
Ответы: >>960334
Аноним 2017/03/24 21:29:34  №960333 124
>>960306
>не вспомню, как его делал, и повторю только с гуглом
Я не понимаю, как можно было настолько хуево разобраться в такой довольно простой вещи, чтобы быть не в состоянии в любой момент из головы воспроизвести сносное мвс. Если ты не в состоянии, то может ты так ничего и не понял? Нагородил издали похожей хуйни, не вникая, лишь бы работало, и решил что квест комплит?
Ответы: >>960380
Аноним 2017/03/24 21:31:47  №960334 125
>>960332
Посты стерли во второй раз. Я вот сейчас сижу думаю, не пора ли просто перейти на доброчан.

У меня времени нет по 3 раза каждый ответ постить. И на спам и вайп, который мне тут приписывают, у меня тоже времени нет.
Ответы: >>960336 >>960343
Аноним 2017/03/24 21:34:47  №960335 126
Алсо оба раза это произошло между попытками запостить комментарии по kubk/students и greenTea242/MinesweeperMVC так что подозреваю, это просто какой-то бан по ключевым словам.
Ответы: >>960370 >>961194
Аноним 2017/03/24 21:34:51  №960336 127
>>960334
Может запилим общими усилиями свой уютный?
Я готов.
Ответы: >>960340 >>960370
Аноним 2017/03/24 21:40:15  №960340 128
>>960336
Два чаю. Увидел что ОП отвечает в тред, пока мылся всё стерли. При перекате набегают трали, или вообще рандом перекатывает, "Я удалил непонятный блок с хуй пойми какими ссылками". На доброчане хотя бы премодерация есть и треды бесконечные.
Ответы: >>960370
Аноним 2017/03/24 21:42:51  №960343 129
>>960334
Проблема в том, что даже если и разбанят, то слова из спам-листа никто не выбросит, то есть можно опять в бан попасть по непонятной причине. Мне в /d так никто и не объяснил, из-за каких именно слов меня забанили. Захожу на сосач только ради PHP-треда, так что я за Доброчан.
Ответы: >>960370
Аноним 2017/03/24 21:48:02  №960345 130
Сегодня эти убогие побанили двух сторожил в НОФАП треде. Мудака, который льет туда порно, при этом не тронули.
+1 за доброчан.
Ответы: >>960370
Аноним 2017/03/24 21:52:11  №960346 131
Сейчас мне в любом случае надо уйти, вечером приду и подумаю еще, что делать. Наверно запощу старые ответы на доброчан.
Ответы: >>960370
Аноним 2017/03/24 22:28:52  №960370 132
Ответы: >>960383
Аноним 2017/03/24 23:06:58  №960380 133
>>960333
Но зачем мне эти велосипеды, если я могу взять фреймворк и не париться?
Аноним 2017/03/24 23:11:25  №960383 134
>>960370
>Вы не нужны.
А ты нужен?
Аноним 2017/03/25 00:39:48  №960423 135
>>960320
а может, разумнее сначала проводить все операции с суммой платежа, а потом уже проверять, меньше ли она ежемесечного платежа или нет? Прост я смотрю и как-то у тебя реализовано слишком сложно.

Ответы: >>960424 >>960533
Аноним 2017/03/25 00:43:27  №960424 136
>>960423
и только после этих проверок вычитать из суммы долга 5 тыщ либо сколько там осталось.
Ответы: >>960425
Аноним 2017/03/25 00:48:15  №960425 137
>>960320
>>960424
и да, проверь, твой алгоритм неправильный. Например, если сумма долга будет всего 1000, а не 40 тысяч, то этот долг школьник будет отдавать у тебя 2 месяца. Не очень логично, не находишь?
Ответы: >>960533
Аноним 2017/03/25 01:47:11  №960436 138
https://jsfiddle.net/ebaloSnositelXX/wfxtxq59/
jQuery, который Джек не строил #3. Первые две jQuery задачи я исправил по твоим советам и все работает (включая плавный скролл на мозилле), не вижу смысла кидать - время у опа отнимать. Алсо использовал букву "X" вместо unicode символа, так как >>958999 .
Ответы: >>960439 >>962229
Аноним 2017/03/25 02:00:03  №960439 139
>>960436

Желтый фон, если что для визуализации блока. В решении его быть не должно, поэтому я не использую для него css свойство filter, которым я воспользовался для...
> Виджет должен работать с полями ввода любых размеров, цветов (в том числе с белым текстом на черном фоне)
Аноним 2017/03/25 02:46:34  №960443 140
Есть laracasts 5.4 на английском, и перевод или 5.1, или 5.3 (на laravel.ru). Много ли я упущу, если буду делать по старым гайдам приложение на 5.4 версии? Вроде бы сама система не поменялась на первый взгяд, но хотелось бы услышать совет от знающих людей.
Аноним 2017/03/25 03:08:31  №960447 141
Анон, поясни долбоёбу за один момент.
Я получаю JSON, декодирую, и выходит массив array ('response' => 1), в котором к элементу с индексом response я обращаюсь как массив->response, хотя логично будет массив["response"].
У меня есть свой массив, в котором к элементу message я обращаюсь массив["message"], но никак не могу массив->message.
Знаю, что тупой, но я первый день это дело пердолю и не совсем втыкаю. Походу я совсем тупой. В чём проблема?
Ответы: >>960451 >>960452
Аноним 2017/03/25 03:54:08  №960451 142
>>960447
$zalupa = (object)[ "key" => value]
Если массив привести к типу обьекта, то ключи массива можно использовать как открытые свойства класса.
$zalupa->key;

Ответы: >>960454
Аноним 2017/03/25 03:58:34  №960452 143
>>960447
Для этого у функции json_decode есть второй параметр, он отвечает за то, вернет ли функция объект ($array->key) или обычный массив ($array['key'])
http://php.net/manual/en/function.json-decode.php
Ответы: >>960454
Аноним 2017/03/25 04:10:18  №960454 144
>>960451
>>960452
Сам уже понял, то ситуацию вы мне ещё лучше прояснили. Спасибо огромное :з
Аноним 2017/03/25 04:38:57  №960455 145
123.png (16, 600x230)
230x600
Посоны начал учиться php недавно. И вот ошибка уже два часа сижу.
При выполнении echo $link;
Ошибка "Catchable fatal error: Object of class mysqli could not be converted to string in "
Алсо
$link = mysqli_connect (HOST, USER, PASS, DB) or die('No connect to Server');

Что нужно с ответом сделать, чтобы можно было использовать $link в mysqli_query($link, $query)?
это я в кратце. если нужно всю функцию то она на первом пике

Если без echo, то ошибка Notice: Undefined variable: link in file.php on line 16
Кажется ошибка именно в том как link принимается я хз
Ответы: >>960456 >>960457
Аноним 2017/03/25 04:50:36  №960456 146
>>960455
$link вне функции, передавай ее как аргумент
Аноним 2017/03/25 04:55:53  №960457 147
>>960455
>echo $link;
Ну тебе же пишут, что не может конвертировать объект в строку.
>Что нужно с ответом сделать, чтобы можно было использовать $link в mysqli_query($link, $query)?
Нужно изучить область видимости переменных в PHP. В твоем случае в функции создается новая переменная с именем $link. Нужно передать линк как пораметр функции или объявить $link глобальной переменной.
http://php.net/manual/ru/language.variables.scope.php
Ответы: >>960459
Аноним 2017/03/25 05:14:46  №960459 148
>>960457
>Ну тебе же пишут, что не может конвертировать объект в строку.
Объект надо разбить в массив?

В функцию добавил global $link;. Проблема Undefined variable: link in ушла.
Не уверен, что это как то решило мою проблему.
Функций много и для каждой писать не вариант.
С $GLOBALS еще не пойму как массив захуячить правильно что бы для всех функций было понятно какое свойство у $link.
Пиздец кароче, запутался уже. Не варит башка.
Ответы: >>960465
Аноним 2017/03/25 05:30:02  №960465 149
>>960459
Ты читать умеешь, сука?
Ответы: >>960466
Аноним 2017/03/25 05:43:41  №960466 150
>>960465
яхз. Наверное рано мне с php связываться ещё. не получается даже объект в строку конвертировать.
Ответы: >>960468
Аноним 2017/03/25 05:43:44  №960467 151
Вкатываюсь.
Кинга - "Создаем динамические веб-сайты с помощью PHP, MySQL и JavaScript"
Нормальная? Можно по ней учиться?
Ответы: >>960470
Аноним 2017/03/25 05:48:18  №960468 152
>>960466
Ты даже аргумент функции передать не можешь, почитай учебники какие-нибудь или видео курсы на ютабе.
Ответы: >>960469
Аноним 2017/03/25 05:49:14  №960469 153
>>960468
Для начала шапку треда прочитай.
Ответы: >>960470
Аноним 2017/03/25 05:49:47  №960470 154
someApprentice 2017/03/25 06:01:28  №960475 155
А чем обусловлена необходимость иметь @Id у всех сущностей в Doctrine?

И как перенести данные на 'новую' схему? Для этого нужно использовать Doctrine Migrations? Там есть возможность преобразовать все данные на новый лад? В частности, сгенерировать id для всех записей?

Я мог бы в ручную отредактировать дамп-файл, но будет ли это правильным путем?
Ответы: >>960478 >>960478
Аноним 2017/03/25 06:05:45  №960478 156
>>960475
>А чем обусловлена необходимость иметь @Id у всех сущностей в Doctrine?
Это с Doctrine связанно, а с самой СУБД И БД.

>>960475
>И как перенести данные на 'новую' схему? Для этого нужно использовать Doctrine Migrations? Там есть возможность преобразовать все данные на новый лад? В частности, сгенерировать id для всех записей?

Если ты изменил сущность ( поля новые добавил/убрал или поменял), то просто делай doctrine:shceme:update
Ответы: >>960491 >>960493
Аноним 2017/03/25 07:04:35  №960491 157
>>960478

СУБД тут не причем, просто без id доктрина не сможет искать записи. Когда ты делаешь

$em->remove($entity);
$em->flush();

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

DELETE FROM x WHERE id = ?

или

DELETE FROM x WHERE id1= ? AND id2= ?

Для составных ключей.

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

Есть такой проект: http://docs.doctrine-project.org/projects/doctrine-migrations/en/latest/reference/introduction.html

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

Также, есть опция генерации миграции путем сравнения текущей схемы БД и схемы, заданной в описании сущностей: http://docs.doctrine-project.org/projects/doctrine-migrations/en/latest/reference/generating_migrations.html

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

Соответственно doctrine:scheme:update годится разве что для тестирования, так как она не генерирует миграции. Обновлять БД в команде надо через миграции, если человек пишет один то можно конечно и без них, но лучше бы сразу их осваивать.

Самому же удобно, прогнал миграцию на локальном сервере, проверил, если все ок - прогнал на продакшене. А как иначе обновлять несколько баз? руками? руки отвалятся.
Ответы: >>960493 >>960608 >>962187
someApprentice 2017/03/25 07:44:10  №960493 158
>>960478
>Если ты изменил сущность ( поля новые добавил/убрал или поменял), то просто делай doctrine:shceme:update
У меня возникали ошибка когда я делал это. Я думал, это потому что нельзя делать апдейт поверх данных, но теперь я погуглил что это за ошибки и исправил их.

>>960491
>СУБД тут не причем, просто без id доктрина не сможет искать записи.
Легко было предположить что на этом завязано её устройство. Я ещё предполагал, что есть некоторая договоренность между программистами делать для каждой таблицы колонку с id.

>Обновлять БД в команде надо через миграции, если человек пишет один то можно конечно и без них, но лучше бы сразу их осваивать.
Сейчас освою...
Ответы: >>964069
Аноним 2017/03/25 11:00:44  №960533 159
Ответы: >>960578 >>964070
Кошкопинатель 2017/03/25 12:10:23  №960550 160
Да чо учить в этом php. Изи же
Аноним 2017/03/25 12:45:21  №960566 161
Пацаны. php еще жив?

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

Что рассматриваю:
1. быстро и легко кодить, крутые фреймворки
2. низкая стоимость владения. vps не нужен. пойдет копеешный шаред хостинг (этот пункт еще актуален?)
Ответы: >>960587
Аноним 2017/03/25 13:23:01  №960578 162
>>960533
>for (;;)
Плохой подход.
Попробуй заменить на другой тип цикла: foreach или while.
>if ($credit<4000)
Это вообще никак разумно не объяснить, откуда взялись 4к, откуда взялось это условие?
Неверный подход, хотя и считает вроде бы верно, потому что говнокод, который не поддерживается и не имеет смысла.
Теперь, когда ты разобрался в работе цикла, мог бы переписать.
Но ты не станешь, ведь ты же ленивая задница, ага, да, я тебя знаю.
Ответы: >>960585 >>960603
Аноним 2017/03/25 13:35:37  №960585 163
>>960578
>if ($credit<4000)
Это из-за того что, каждый месяц начисляется 1000 рублей комиссии. Если ставить 5000, то он ещё один круг делает. Что-то пока не получается придумать альтернативный вариант.
>for (;;)
Заменил на while ($credit>0)
Ответы: >>960586 >>960636
Аноним 2017/03/25 13:37:25  №960586 164
>>960585
>то он ещё один круг делает
Наоборот, цикл завершается раньше, чем нужно.
Фикс.
Аноним 2017/03/25 13:38:11  №960587 165
>>960566
>Пацаны. php еще жив?
Более чем. С седьмой версией очень приятный стал, с тайпхинтингом и быстротой. Дальше они еще JIT компиляцию сделают, если все пойдет хорошо.

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

>пойдет копеешный шаред хостинг (этот пункт еще актуален?)
Тут уже зависит от того насколько нагруженным будет проект и как ты архитектуру построишь.
Ответы: >>960610 >>960626 >>960997
Аноним 2017/03/25 13:53:38  №960603 166
Ответы: >>960609 >>960636 >>964070
Аноним 2017/03/25 13:57:50  №960608 167
>>960491
>СУБД тут не причем, просто без id доктрина не сможет искать записи. Когда ты делаешь
Это просто фейспалм. Почитай хоть про индексацию и нормализацию данных в бд.
Ответы: >>962147
Аноним 2017/03/25 13:59:17  №960609 168
>>960603
Я тут вообще мимо проходил, а div и mod не завезли в пхп? Число символов после запятой не многова-то?
Ответы: >>960611
Аноним 2017/03/25 13:59:22  №960610 169
>>960587
>Если ты хочешь сделать что-нибудь в реалтайме (чат, к примеру), то PHP тут вряд ли подойдет.
Ето мы еще посмотрим.
Ответы: >>960612
Аноним 2017/03/25 14:01:00  №960611 170
>>960609
>а div и mod не завезли в пхп?
Тебе гугл завезли?
Ответы: >>960613
Аноним 2017/03/25 14:01:16  №960612 171
>>960610
Я знаю что есть Ratchet, но никогда не видел чтобы его в продакшене кто-нибудь использовал. Легче взять проверенные временем библиотеки на ноду или пайтон.
Ответы: >>960618 >>962147
Аноним 2017/03/25 14:02:16  №960613 172
>>960611
Мне лень завезли братан
Ответы: >>960618
Аноним 2017/03/25 14:09:23  №960618 173
>>960613
Нет, просто ты дол>>960612
>никогда не видел чтобы его в продакшене кто-нибудь использовал.
Если ты не видел - это не значит, что его никто не использует.

Я вообще на симфоновском http://symfony.com/doc/current/components/http_foundation.html#streaming-a-response буду пытаться сначала сделать.

Если понадобится более производительный чат, то перепешу это сервер на Го или Си/C++ на крайняк.
Но обмазываться питоном да еще И Н О Д О Й я точно не буду.



Ответы: >>960620
Аноним 2017/03/25 14:11:27  №960620 174
>>960618
>это сервер
этот сервис

[spoile]Блять, клаве пизда уже[/spoiler]
Аноним 2017/03/25 14:17:23  №960626 175
>>960587
>Дальше они еще JIT компиляцию сделают, если все пойдет хорошо.
Поясните ньюфагу, что это изменит для среднего крокодила? Просто скорость выполнения скриптов увеличится?
Ответы: >>960630
Аноним 2017/03/25 14:21:56  №960630 176
>>960626
> скорость выполнения скриптов увеличится
Да, но это не точно. + переносимость, не придется таскать с собой все исходники, чтобы что-то запустить.

Они уже делали разок так. И у них ничего не получилось.
Ответы: >>960647
Аноним 2017/03/25 14:24:56  №960636 177
>>960585
>Это из-за того что, каждый месяц начисляется 1000 рублей комиссии. Если ставить 5000, то он ещё один круг делает.
Ну вот хоть тресни - не пойму, почему 4к, а не 3к, не 2к? Если бы как-то было связано с имеющимися значениями - было бы понятно.
Представь, это работающее приложение, а другому программисту что-то надо в нём поменять, - так он же не поймёт этого условия.
>Что-то пока не получается придумать альтернативный вариант.
Нужно исходить из того, в чём суть действий, это и ставить в условия.
1. Анону нужно выплатить кредит, поэтому цикл должен, поэтому цикл будет продолжаться, пока сумма кредита больше нуля.
2. Когда сумма кредита (с процентами и тысячей за обслуживание!) меньше 5000 - выплачиваем только её и завершаем цикл.
Всё, тут больше ничего нет.
>>960603
О, вот тут уже всё отлично!
>$total=$total+5000;
Лучше избегать использования подобных цифр, когда у нас есть переменная для обозначения сути. Это же $payment, так пусть там и будет она.
Отлично, братишка, верной дорогой идёшь!
Прости за "ленивую задницу", был не прав.
Ответы: >>960867
Аноним 2017/03/25 14:33:56  №960647 178
>>960630
>переносимость, не придется таскать с собой все исходники, чтобы что-то запустить.

Это в принципе тогда можно будет заказчику отдавать байткод, а исходный код у тебя остается до оплаты проекта. Для фриланса очень круто.
Ответы: >>960653
Аноним 2017/03/25 14:43:59  №960653 179
>>960647
Ну да впринципе. Сейчас тоже так можно делать, но это денег стоит.
Аноним 2017/03/25 15:08:15  №960668 180
krasivyy-belyy-golub.jpg (215, 1920x1080)
1080x1920
>>958715 (OP)
Как быстро вкотиться в конструктор битрикса? Посоветуйте видеокурс или что-то вроде (русский, доступный на шару) Чтоб за пару-тройку часов уже уметь верстать лендинги и прочие несложные страницы? Верстать более-менее умею, там вообще какие-то есть отличия от html/css или других визивиг-редакторов веб-страниц? Может, кто возьмется помочь через скайп/телеграм/етц? Да, я чому-то не вижу на торрентах этого самого битрикса, его где брать, только с офф-сайта качать триал? Оно мне в системе не насрет?
Ответы: >>960671
Аноним 2017/03/25 15:11:24  №960671 181
>>960668
Такого мы не знаем.
Ответы: >>960679 >>960742
Аноним 2017/03/25 15:23:30  №960679 182
>>960671
Не по себе стало от её зомбированности.
Аноним 2017/03/25 16:45:39  №960742 183
>>960671
Ты чего такой злой?
Аноним 2017/03/25 16:49:18  №960747 184
Сейчас ссылки формата site.com/controller/action?some_param=some_value зашквар или норм?
Ответы: >>960767 >>960862 >>964070
Аноним 2017/03/25 17:04:19  №960767 185
>>960747
Норм. Только controller можно опустить.
Ответы: >>960777
Аноним 2017/03/25 17:09:21  №960777 186
>>960767
Ну контроллер это я имею ввиду что-то типа books/categories, если страница заглавная то и контроллера нет.
Ответы: >>960832
Аноним 2017/03/25 17:51:43  №960832 187
>>960777
>Ну контроллер это я имею ввиду что-то типа books/categ
Ну тогда все заебись.
Еще в место ?some_param=some_value
можно просто парсить значение из URL.
/controller/action/some_value
Аноним 2017/03/25 18:10:30  №960862 188
>>960747
friendly url же давно во всех нормальных решениях, станет site.com/this-is-my-hello-world-page/param1value/param2value

контроллер и экшн исчезают, на их место приходит какой-то генерируемый из контента тайтл, параметры все без ?, = и &, просто слэшами разделены.
Ответы: >>964070
Аноним 2017/03/25 18:20:26  №960867 189
>>960636
Большое спасибо, всё исправил. Теперь выглядит красиво и понятно.
Аноним 2017/03/25 20:31:58  №960928 190
ОП, анон, кто-нибудь... Есть на примете какая-нибудь готовая js галерея, встраиваемая в сайт? Чтобы вот прямоугольник, в нем текущая картинка + они потихоньку сменяют друг друга + стрелочки вперед-назад + каждая картинка является ссылкой на какую-либо страницу эльфы набегают, можно играть за охрану дворца. Ну и все, собственно. Чтоб совсем-совсем минимум кода и он более-менее понятный был, в идеале, я так понимаю, эта хуйня на 50 строк (сам я на жс максимум десятистрочную хуйню писал и очень боюсь эволюционировать), чтобы понять, разобраться и допилить, что захочу?
Аноним 2017/03/25 20:34:16  №960929 191
Ответы: >>960940
Аноним 2017/03/25 20:40:14  №960932 192
Ответы: >>960940
Аноним 2017/03/25 20:50:13  №960940 193
>>960929
Да, она самая.
>>960932
Ну нет, спасибо, анон, но это для меня пока еще чертовщина какая-то, какие-то непонятно вообще как работающие классы-айди... С ходу (если не смотреть в хеад на линки на жс) вообще выглядит как какой-то умный хтмл, лол. Я до бутстрапа пока еще не дорос, мне бы в азах jQuery разобраться сначала...
Ответы: >>960960 >>960988
Аноним 2017/03/25 21:29:51  №960960 194
>>960940
Давай вместе учить Angular.
Ответы: >>960965 >>960968
Аноним 2017/03/25 21:37:07  №960965 195
Ответы: >>960971
Аноним 2017/03/25 21:40:05  №960968 196
>>960960
С середины лета готов вместе с няшей-аноном учить хоть фортран
Ответы: >>960971
Аноним 2017/03/25 21:43:07  №960971 197
>>960968
К середине лета я уже буду вовсю пользоваться своим первым приложением.
>>960965
Хочу друга с хотя бы одним общим интересом.
Ответы: >>960975
Аноним 2017/03/25 21:47:37  №960975 198
>>960971
Круто, у меня почти та же фигня, я бы тоже хотел хотя бы одного друга. Но нет желания учить 100500 говнофреймворков на полгода. жКвери, бутстрап - да, в свое время. Ресты, боны, ангуляры - нахуйнахуй, мне не так много платят за это дерьмо. А ближайшие два месяца у меня госы и диплом, вот.
Ответы: >>960976
Аноним 2017/03/25 21:52:25  №960976 199
Ответы: >>961040
Аноним 2017/03/25 22:14:11  №960988 200
>>960940
Что там понимать, бутстрап js подключается, он крутит эту карусель. Надо только структуру как там задать, структура ниже объяснена еще.
Ответы: >>961001
Собеседование Аноним 2017/03/25 22:19:51  №960989 201
Некого спросить кроме вас.
Что у вас спрашивали при первом собеседование по пхп?в понедельник иду на собеседование, немного волнуюсь, поэтому спрошу у вас.
Как долго длилось собеседование, что спрашивали?
>Английский на уровне чтения технической документации
Как они проверять его будут?типа дадут листик и попросят прочитать или как?
Стоит ли забивать на универ или как?
Специальность разработчик программного обеспечения, она нужна мне или лучше что-то другое выбрать?


Ответы: >>960996
Аноним 2017/03/25 22:35:08  №960996 202
>>960989
>Специальность разработчик программного обеспечения, она нужна мне или лучше что-то другое выбрать?
Тебе нужно что угодно, что может прокатить за бакалавра в IT (computer sience, computer networking etc) для последующей эмиграции. Т.е. нужно узнать смогли ли выпускники твоего ВУЗа устроится на этом вашем западе. Как узнать? Найти в соц. сецях и спросить "Были ли проблемы с подтверждением диплома при получении разрешения на работу?".
Аноним 2017/03/25 22:37:02  №960997 203
>>960587
>Если ты хочешь сделать что-нибудь в реалтайме (чат, к примеру), то PHP тут вряд ли подойдет.

чаты на пхп были еще на заре инета
Аноним 2017/03/25 22:40:49  №961000 204
>Потребление кофе или зарплата не являются свойствами так как они вычисляются из других свойств и хранить их не надо.
ОП, ну зачем это? Понятно, что тут при создании работника надо тупо проверять профессию, чтобы определить кофе, зарплату и страницы.
Но не усложнение ли это?
Вот тут я сделал без такого: >>960162
Почему бы просто не сделать это всё свойством класса?
Смотришь на класс и свойства - видишь кофе, зарплату, страницы, а так надо смотреть в метод addEmployee, чтобы это всё узнать или поменять?
Это сделать не проблема же, просто смысл в чём, ведь неудобно же! Захочешь поменять - меняешь в свойстве соответствующего класса, а не в этом методе.
Ответы: >>961014 >>964070
Аноним 2017/03/25 22:41:53  №961001 205
>>960988
Я хочу вкатываться постепенно. Хочу код, который могу допиливать, а не сделатьохуенно.мин.жс
Аноним 2017/03/25 23:03:07  №961014 206
>>961000
Ну вот так сделал, как предлагаешь в подсказках: https://3v4l.org/IC9kb
Реально кажется это менее удобным, чем если бы было в свойствах.
Я помню, ты всегда говорил, что всё то, что может вычисляться, не надо хранить, но если мы представим, что нам надо создать миллионы экземпляров работников, то это будет большей нагрузкой, чем просто хранить свойства в их классах, разве нет?
Загоняюсь, но ведь ты способствуешь этому и это хорошо.
Ответы: >>962325 >>964070
Аноним 2017/03/25 23:13:28  №961016 207
изображение.png (35, 708x578)
578x708
4dd.jpg (30, 600x600)
600x600
Аноним 2017/03/26 00:04:18  №961035 208
Почему он мне выдает ошибку? Надо же ставить фигурные скобки, я поставил, в чем проблема?
Ответы: >>961036 >>961038
Аноним 2017/03/26 00:08:01  №961036 209
Ответы: >>961042
Аноним 2017/03/26 00:10:03  №961038 210
>>961035
Ох, каков я аутист. Не надо было у else писать что-то. Чего то ступил.
Аноним 2017/03/26 00:10:20  №961040 211
>>960976
Что ты имеешь ввиду под "учить вместе"?
Аноним 2017/03/26 00:11:05  №961042 212
>>961036
Да как-то из головы вылетел. Знал же.
Аноним 2017/03/26 00:24:07  №961048 213
Не, ну это уже толсто. Как тру, если не тру? Что за шутейки тут мне шутят?
Аноним 2017/03/26 00:25:48  №961050 214
>>961048
Такая же проблема с числами.
Аноним 2017/03/26 00:28:29  №961051 215
TAwDXC-4EW8.jpg (93, 1111x597)
597x1111
>>961048
== - знак равенства
= - оператор присваивания
Аноним 2017/03/26 00:28:33  №961052 216
Ответы: >>961053
Аноним 2017/03/26 00:31:12  №961053 217
>>961052
Извращенец! Ты зачем на английском кидаешь?
Ответы: >>961055
Аноним 2017/03/26 00:35:31  №961055 218
Ответы: >>961058
Аноним 2017/03/26 00:39:35  №961058 219
14819719516340.png (101, 500x500)
500x500
Аноним 2017/03/26 00:43:34  №961060 220
>>961048
попробуй так еще if ($p = count("Hitler"))
Аноним 2017/03/26 01:05:50  №961063 221
>>960928
Бамп Бампоевич Бампов.
Аноним 2017/03/26 01:08:14  №961064 222
Решил первую задачу из урока "Повторим?". Проверьте, пожалуйста, да советов мудрых дайте.
https://3v4l.org/RpEMF
Ответы: >>964071
Аноним 2017/03/26 11:10:38  №961149 223
Ответы: >>961212 >>964071
Аноним 2017/03/26 11:54:47  №961177 224
22.JPG (12, 470x48)
48x470
3.JPG (27, 1276x129)
129x1276
Открыт тут ваши уроки, решил порешать задачки.
Про кубики, все написал от руки, всё работает, но в моём браузер не работает перенос строки. Т.е это \n не работает. Всё пишется сплошняком, а в опере вообще траблы с кодировкой. Меня такие мелочи волнуют.
https://ideone.com/eIgrnT
Аноним 2017/03/26 11:57:26  №961180 225
>>961177
А ещё зачем заключать переменные в echo в круглые скобки?
Только по лицу не бейте.
Ответы: >>961187
Аноним 2017/03/26 12:10:04  №961187 226
Аноним 2017/03/26 12:12:43  №961189 227
Ответы: >>961192
Аноним 2017/03/26 12:14:54  №961192 228
>>961189
Да, я сразу же пофиксил, просто ссылку забыл в после поменять. Однако почему не работает перенос строки в брауезере?
Файл index.php, запущен openserver.
Ответы: >>961212
Аноним 2017/03/26 12:16:15  №961194 229
>>960335

А почему ты на pastebin ответ не кинешь? Зеленый-чай-кун.
Ответы: >>962229
Аноним 2017/03/26 12:52:30  №961209 230
>>960928
Анон, не игнорь меня пожалуйста.
Аноним 2017/03/26 12:58:16  №961210 231
https://ideone.com/NBN7a3
Пиздец я тупой? Почему это не работает? Цикл прогоняется ровно 1 раз, почему?
Ответы: >>961212
Аноним 2017/03/26 13:04:16  №961212 232
>>961149
> нормальные значения
Ты хочешь, чтобы тесты сразу джойнились с автором? Доктрина по умолчанию не джойнит всё, что возможно, а создаёт прокси-классы: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-objects.html
Для получения теста с автором можно использовать DQL с джойном, можно указать доктрине подгружать конкретную связь жадно (указав fetch="EAGER" в ManyToOne аннотации), но это наверное не очень гибко.

Ещё у тебя там метод setAuthorId в классе Test, зачем? Доктрина это о том, как работать с объектами, а не с айдишниками из БД.

>>961192
HTML разметка игнорирует переводы строк. Если нужно их сохранить, то можно обернуть вывод echo в тег <pre>

>>961210
> if ($bank = 1000000) {
Это присвоение, а не сравнение. Может будет интересно: https://ru.wikipedia.org/wiki/Условия_Йоды/
Ответы: >>961214
Аноним 2017/03/26 13:05:41  №961214 233
>>961212
>Это присвоение, а не сравнение.
Блядь.....
Аноним 2017/03/26 14:18:08  №961276 234
Почему в шапке советуют Апач рядом с фреймворками? Есть же божественный nginx.
Апач-то у шаред хостеров.
Ответы: >>961287 >>961402
Аноним 2017/03/26 14:24:12  №961287 235
>>961276
Я бы вообще новичкам советовал встроенный в PHP веб-сервер - никакой мороки с установкой + запуск проще некуда + все ошибки сразу в консоль, не нужно искать логи (некоторые новички о них просто не знают). А то люди банально не осиливают установку всего руками и скатываются к васяносборкам.
Аноним 2017/03/26 14:49:29  №961306 236
У меня возникают трудности при устоновке Doctrine Migrations.

http://docs.doctrine-project.org/projects/doctrine-migrations/en/latest/reference/introduction.html#use-as-supplement
Если я использую Pimple и PSR-4 могу я загрузить этот класс через них?

bootstrap.php
use Doctrine\DBAL\Migrations;

$container['Migrations'] = function () {
return new Migrations();
};
...

http://docs.doctrine-project.org/projects/doctrine-migrations/en/latest/reference/introduction.html#configuration
>The last thing you need to do is to configure your migrations. You can do so by using the –configuration option to manually specify the path to a configuration file.
-configuration это опция чего? Через doctrine:migrations -configuration ошибка о несуществующей команде.

Я создал вручную файл migrations.xml и скопировал туда код из манула поменяв путь к папке с классами миграциий.

При выполнении любой комманды в консоле возникает ошибка:

Loading configuration from file: migrations.xml


[Symfony\Component\Debug\Exception\FatalThrowableError]
Class 'DOMDocument' not found



Ответы: >>964071
Аноним 2017/03/26 15:32:29  №961316 237
аноны, подскажите пожалуйста, как закрыть индекс ссылок ajax'ом?
Аноним 2017/03/26 15:37:04  №961319 238
ОП, анон, кто-нибудь... Есть на примете какая-нибудь готовая js галерея, встраиваемая в сайт? Чтобы вот прямоугольник, в нем текущая картинка + они потихоньку сменяют друг друга + стрелочки вперед-назад + каждая картинка является ссылкой на какую-либо страницу эльфы набегают, можно играть за охрану дворца. Ну и все, собственно. Карусель стандартная по сути. Но чтоб совсем-совсем минимум кода и он более-менее понятный был, в идеале, я так понимаю, эта хуйня на 50 строк (сам я на жс максимум десятистрочную хуйню писал и очень боюсь эволюционировать), чтобы понять, разобраться и допилить, что захочу?
Ответы: >>961325 >>961337
Аноним 2017/03/26 16:06:19  №961325 239
>>961319
>чтобы понять, разобраться и допилить
Честно, если бы ты именно этого хотел, уже бы сделал.
Аноним 2017/03/26 16:30:51  №961337 240
Ответы: >>961404
Аноним 2017/03/26 18:27:17  №961400 241
>>961177
nl2br($string) в php используй же.
Аноним 2017/03/26 18:30:34  №961402 242
Аноним 2017/03/26 18:39:39  №961404 243
>>961337
>fotorama.io
Там куча обфусцированного кода в 5 строк, да и вообще сложно.
Аноним 2017/03/26 21:13:33  №961474 244
Выполнил вторую задачу из урока "Повторим?". Прошу проверить и советов мудрых дать. https://3v4l.org/p5od8
Ответы: >>964072
Аноним 2017/03/26 21:21:20  №961478 245
Никак не могу открыть доступ к проекту.
Делаю chown -R usarname /opt/lampp/htdocs/projectname/
chmod -R 755 /opt/lampp/htdocs/projectname/
Но доступа нету
Ответы: >>964072
SQL лайки Аноним 2017/03/26 22:48:31  №961553 246
https://arhivach.org/thread/245785/#955805

http://sqlfiddle.com/#!9/c53f34/1
Долго ломал голову и исписал не один лист в длинющих таблицах из декартовых произведений.

> https://github.com/codedokode/pasta/blob/master/db/databases.md#Усложненная-но-более-жизненная-задача-про-лайки/
У меня несколько решений разной степени неадекватности.
1) с использованием таблицы 'всё_что_можно_лайкнуть': http://sqlfiddle.com/#!9/3cfb52/2
Плюсы:
- легко добавить новый вид сущности, которую можно лайкать (просто добавляем новую таблицу)
Недостатки:
- Костыли при каждой вставке сущности

2) все лайкабельные сущности в одну таблицу: http://sqlfiddle.com/#!9/989697/3
Плюсы:
- вставка сущностей без костылей
Недостатки:
- Для каждой новой сущности нужно добавлять новый столбец в таблице likes, нужно не забыть добавить уникальный ключ.


Ответы: >>961558 >>964072
Аноним 2017/03/26 22:57:23  №961558 247
>>961553
1, только полиморфные связи осуществляются не только по id, но и по table_name/model_name. В целом фреймворки работу с такими вещами автоматиизируют вполне.
Ответы: >>961559 >>961591 >>964072
Аноним 2017/03/26 22:58:40  №961559 248
>>961558
Ну и likeable_id в таком случае можно из других таблиц убирать.
Ответы: >>961591
Аноним 2017/03/27 00:20:21  №961591 249
>>961559
>>961558
Вроде бы идею полиморфных связей понял, таблица лайков будет выглядеть так:

| id| from_user | likeable_type | likeable_id|
| 1 | 1_______| PHOTO_____| 1_______|
| 2 | 1_______| USER______| 2_______|
(Юзер 1 поставил лайк Фотографии 1 и Юзеру 2)

Но внешний ключ тут можно проставить только для from_user, а как ставить ограничения на likeable_id - непонятно.
Ответы: >>961633 >>964072
Аноним 2017/03/27 00:50:31  №961599 250
А что более расово правильно использовать? Switch или if?
Ответы: >>961603 >>961604
Аноним 2017/03/27 00:52:38  №961602 251
Ответы: >>961607
Аноним 2017/03/27 00:53:15  №961603 252
>>961599
Используй силу, люк. Что хочешь, то и пиши, только свич не везде подходит. Есть мнение что то иф, то сфитч медленнее (мнения расходятся), но это такая себе на спичках экономия. Я еще неистово злоупотребляю словарями, что поидее и того и другого медленее, но когда у меня полсотни обработчиков для динамических данных можно ебануться в условия впихивать.
Аноним 2017/03/27 00:56:51  №961604 253
>>961599
Cмотри по ситуации. Обычно switch-case читается проще, чем нагромождение из if-elseif-elseif. Но у switch есть недостатки:
- он по умолчанию использует нестрогое сравнение (==)
- в if-ах можно делать более хитрые проверки, например if ($a instanceof Foo)
Аноним 2017/03/27 01:06:16  №961607 254
>>961602
Погуглил. phpQuery подойдет для таких целей?
Ответы: >>961608 >>961635
Аноним 2017/03/27 01:09:15  №961608 255
>>961607
Да. Для конвертации в XML тоже есть готовые решения, просто погугли.
Ответы: >>961612
Аноним 2017/03/27 01:32:44  №961612 256
>>961608
Я наверное не совсем правильно выразился. Имел виду, что сохранять данные на диск мне не нужно, мне нужно все распарсить, а потом использовать для создания своей страницы. Все на ходу, без сохранения.

То есть мне нужно создать класс Profile, предусмотреть в нем все необходимые переменные, потом создать объект этого класса и запихнуть туда распарсенные данные. Правильно?
Ответы: >>961627 >>961634
Аноним 2017/03/27 02:41:16  №961626 257
Поясните за protected и public переменные в классе, в чем разница?
Ответы: >>961627
Аноним 2017/03/27 02:43:26  №961627 258
>>961626
Все, разобрался сам. А с этим поможете? >>961612
Аноним 2017/03/27 03:13:29  №961633 259
>>961591
Сделай две таблицы, photo_likes и user_likes, которые содержат связи like_id-photo_id или user_id. На них уже можешь внешние ключи ставить. А в твоей таблице тогда только первые 3 колонки останутся.
Ответы: >>964072 >>966596
Аноним 2017/03/27 03:23:08  №961634 260
>>961612
В php есть DOM, в него грузишь твою страницу, потом используешь xquery, чтобы получить данные из нужных узлов. Это не задача класса Profile, он должен уже готовые данные получать через конструктор. Пишешь другой класс HtmlStatsLoader, который весь XML парсит и данные в нужных местах отдает, потом связываешь с Profile через конструктор. Получится что-то вроде $profile = new Profile($loader->getUser(), $loader->getLevel(), $loader->getStats(), $loader->getEquipment()) ну и дальше в таком духе. Дальше чтобы сохранить Profile, пишешь класс XmlProfileSaver, который в конструктор принимает твой объект класса Profile, вытаскивает из него данные и сохраняет в xml через тот же php dom.
Ответы: >>961635
Аноним 2017/03/27 03:24:55  №961635 261
>>961634
Но я уже определился, что использую библиотеку phpQuery, а не ДОМ напрямую >>961607
Ответы: >>961636
Аноним 2017/03/27 03:26:35  №961636 262
>>961635
Не юзал твой phpQuery, судя по описанию просто какая-то тупая надстройка над DOm в стиле jquery. Обычно DOMа и Xquery для всех подобных задач по уши хватает, синтакс там не сложный.
Ответы: >>961637 >>961638
Аноним 2017/03/27 03:28:12  №961637 263
6.png (8, 349x120)
120x349
>>961636
Я когда-то пробовал и обосрался с иксквери. Ну вот смотри, что выходит с этой библиотекой. Красиво же по большим кускам сразу разобрал, а потом эти большие куски уже разребу по переменным.
Ответы: >>961639
Аноним 2017/03/27 03:29:29  №961638 264
7.png (37, 734x400)
400x734
>>961636
Вот целый код, чет не догадался сразу весь заскринить.
Аноним 2017/03/27 03:30:58  №961639 265
>>961637
В xquery ты точно так же эти куски получить можешь прямыми запросами. Дальше ты просто тот же дом юзаешь, как у тебя на скринах. Не вижу смысла со стороннюю либу мучать, если делает все то же самое, что встроенные в php средства.
Ответы: >>961640
Аноним 2017/03/27 03:33:23  №961640 266
8.png (22, 807x204)
204x807
>>961639
Ну фиг знает, я купился еще на то, что в какой-то статье говорилось о сравнении скорости работы, и эта штука работала "в 8 раз быстрее, чем встроенные в пхп методы".

Пикрилейтед моя предыдущая попытка, я там обосрался и мне надоело гуглить, так что можешь не пояснять в чем была проблема.
Ответы: >>961641 >>961642
Аноним 2017/03/27 03:35:57  №961641 267
>>961640
С виду все правильно, вангую у нод были свои childnodes, их надо было тоже через dom или xquery доставать. Тут var_dump/die помогает.
Аноним 2017/03/27 03:44:14  №961642 268
>>961640
По скорости - первая ссылка в гугле говорит, что phpquery твой парсит заново документ на каждой итерации, т.е. при каждом запросе селектора. Так что уже тормознее будет. Если скорость важна, вообще лучше через expat parser в php читать, он просто один раз проходит по всем нодам и кидает тебе эвенты, весь dom даже не нужно в память грузить.
Ответы: >>961643
Аноним 2017/03/27 03:45:49  №961643 269
>>961642
Все это хорошо, но я нубас и боюсь обосрусь снова и потеряю желание.
Ответы: >>961644
Аноним 2017/03/27 03:52:28  №961644 270
>>961643
Вполне возможно, у меня средней сложности xml импортер на expat переписать заняло дня 2. Если плохо в dom ориентируешься, уйдет больше.
Ответы: >>961651
Аноним 2017/03/27 05:31:38  №961651 271
1.png (109, 1142x642)
642x1142
0.png (48, 1041x661)
661x1041
>>961644
Распарсил таки с помощью phpQuery, очень легко вышло. В результате имею объект, который могу вертеть, как захочу.
Аноним 2017/03/27 10:18:53  №961699 272
Добрый день. ОПчик посмотри пожалуйста ещё незавершенный проект, я не уверен в выбранной архитектуре проекта

https://github.com/Si0n/fileshare-project
Аноним 2017/03/27 11:04:35  №961705 273
2к.JPG (28, 611x155)
155x611
Задача: Айпад в кредит.
http://archive-ipq-co.narod.ru/l1/functions.html

https://ideone.com/VHVCW8
Я верно посчитал?
Меня лишь смутил ввод новой переменной ради единовременной выплаты за открытие счета в последнем банке, кажется это лишнее и нужно как-то покрасивее это сделать.
Третий банк не наебал.
Юзаю <br>, потому что код проверю в браузере, а он не переносит строку с помощью /n.
Ответы: >>961729
Аноним 2017/03/27 12:05:56  №961729 274
>>961705
Нет, задача решена неверно.
Второй банк нужен для того, чтобы после задачи про Айфон проверить правильность работы скрипта. Во втором банке должно было получиться 61270, ты что, про Айфон не решал задачу?
Также у тебя не определена переменная $sum перед циклом как пустая, как ноль или подобное. Функции должны работать с известными им переменными, которые или в аргументах туда идут (в скобках), или внутри самой функции определяются.
Ответы: >>961740
Аноним 2017/03/27 12:40:40  №961740 275
>>961729
https://ideone.com/zSuvX5
Теперь верно, но я пока не догоняю почему так. Я всего лишь вынес вычисление остатка по кредиту за условие, в начало цикла.
Ответы: >>961776
Аноним 2017/03/27 14:38:59  №961776 276
>>961740
Скрин. Избавляйся, иначе в большом приложении вообще не будет работать, это Идеоне такой лояльный.
Также лучше разделять пробелами выражения, а то сложно читается в таком виде:
>$value+$comiss+($value*$persent/100);
>Я всего лишь вынес вычисление остатка по кредиту за условие, в начало цикла.
Так и должно быть - сначала сумма кредита увеличивается на проценты и тысячу за обслуживание, а потом подпадает под действия условий в if...else.
Аноним 2017/03/27 19:17:16  №961994 277
Раньше для форм в Laravel я использовал Illuminate\Html, но в 5.4 Collective\Html.
В контроллере использовал use Illuminate\Http\Request; и use Request;
Далее
public function store {
$input = Request::all();
return $input;
}

Но как сделать такое же с Collective\Html? Request:all уже не работает.

Не стукайте только, я меньше недели занимаюсь
Аноним 2017/03/27 19:34:55  №962002 278
аноны в какой версии пхп еще нету PDO?
Ответы: >>962009 >>962011 >>962015
Аноним 2017/03/27 19:49:50  №962009 279
>>962002
PDO ships with PHP 5.1, and is available as a PECL extension for PHP 5.0; PDO requires the new OO features in the core of PHP 5, and so will not run with earlier versions of PHP.
Аноним 2017/03/27 19:56:21  №962011 280
>>962002
В той, которые тебе всё равно не надо пользовать.
Ответы: >>962013 >>962028
Аноним 2017/03/27 20:06:28  №962013 281
Аноним 2017/03/27 20:07:40  №962015 282
>>962002
Назовите пожалуйста трех русских композиторов.
Ответы: >>962017 >>962070
Аноним 2017/03/27 20:10:07  №962017 283
>>962015
твоя мать твой батя твоя сестра
Ответы: >>962032
Аноним 2017/03/27 20:24:04  №962028 284
Аноним 2017/03/27 20:28:30  №962032 285
>>962017
Таки какой вопрос, такой и ответ, гой.
Аноним 2017/03/27 22:01:42  №962069 286
Переписал аутентификацию, чтобы можно было логиниться под одним пользователям на разных пк и она не слетала.

Ежу понятно, что в таком виде это огромная дыра в безопасности, потому что было так:
https://github.com/grigoryMovchan/auth/blob/auth_mvc/app/models/AuthModel.php

а стало так:
https://github.com/grigoryMovchan/STKApps/blob/master/app/models/AuthModel.php

Как вообще белые люди делают, когда стоит такая задача?
Ответы: >>962074
Аноним 2017/03/27 22:01:42  №962070 287
>>962015
Киркоров, Билан, Басков.
Аноним 2017/03/27 22:14:06  №962074 288
>>962069
Ну не знаю, вроде неплохо, а где дыра?

А еще спасибо ОП-у за паттерн TDG. С отделением SQL кода от основного намного свободнее себя чувствую.
Ответы: >>962099
Аноним 2017/03/27 22:41:52  №962099 289
>>962074
Кукисы украдут и все.
Ответы: >>962117
Аноним 2017/03/27 22:56:24  №962112 290
Не столько ПХП, сколько его настроек вопрос.
У меня есть годовалый сайтик для 50 человек, где я внезапно обнаружил уже ~900к файлов сессий, из них >850к пустых, гостевых.
Как так и что делать?
И да, удалять сессии по лайфтайму не хочу. Хочу реюзать сессии четче и не создавать их для гостей.
Ответы: >>964072
Аноним 2017/03/27 23:01:19  №962117 291
>>962099
Можно подшифровать хэш хэшом сессии. Сам не пробовал, но почему нет.
Ответы: >>962133
Аноним 2017/03/27 23:36:24  №962133 292
>>962117
Тогда, вроде, сессия привязана к кукам на пеке? Хэш же в БД хранится будет?
Ответы: >>962156
Аноним 2017/03/27 23:50:35  №962146 293
Test
Аноним 2017/03/27 23:51:05  №962147 294
>>960608

Зачем мне читать про нормализацию, если я писал про нее уроки?

Каким образом "индексация" (и что это такое, кстати? Это ты так пишешь слово "индекс"?) требует наличия первичного ключа? Не надо сбивать людей с толку.

В MySQL можно создавать таблицы без первичных ключей. И можно делать составные первичные ключи.

Тебе самому сначала стоит почитать документацию.

>>960612

Как можно писать что-то на ноде или питоне если там даже тайп-хинтов нет?
Ответы: >>962153
Аноним 2017/03/27 23:54:37  №962150 295
Я зеленый новичок, которому нужно за 2 месяца вкатиться и написать небольшой сайтец (хотя бы сайт-визитку), используя полноценные фреймы и т.д. Советы из ОП-поста подойдут в такой ситуации?
Ответы: >>962157
Аноним 2017/03/27 23:58:17  №962153 296
>>962147
>Как можно писать что-то на ноде или питоне если там даже тайп-хинтов нет?
Но ведь TypeScript в котором более развиты тайпхинты чем сейчас в PHP
Аноним 2017/03/27 23:59:46  №962156 297
>>962133
Как бы да, но надо уточнить, проверяется ли хэш на "истинность" на стороне сервера по ip. Так-то айпишник используется в генерации хэша.
Подозреваю, что всем на все пох - спер куку, перенес на другую машину и привет, хоть обзапрещайся.
Если бы я параноил, то, наверное, сделал бы лайфтайм для сессии или большую кнопку ВЫХОД.
Белые люди, кстати, еще делают педаль "выйти из всех сессий".
Ответы: >>962173
Аноним 2017/03/28 00:00:46  №962157 298
Ответы: >>962164
Аноним 2017/03/28 00:04:11  №962164 299
>>962157
Курсач, который я хочу использовать в качестве трамплина.
Ответы: >>962173
Аноним 2017/03/28 00:12:28  №962173 300
14772099612560.jpg (2443, 2560x1600)
1600x2560
Ответы: >>962175
Аноним 2017/03/28 00:14:42  №962174 301
Итак, бан вроде пока сняли, запощу тут информацию про проверенные задачи:

- DOM который построил Джек, 5: проверено тут http://arhivach.org/thread/245785/#956739
- https://github.com/never3ver/fileshare - проверено 19 марта: http://arhivach.org/thread/245785/#956732

Далее, на доброчане в /s/ в PHP треде (ссылку на всякий случай давать не буду, а то у нас тут свободное общение) я проверил некоторые другие задачи, почитайте ответы к ним:

>>958664 задача с регулярками и телефонным номером, от 22 марта
- студенты https://github.com/sylenien/students-exercise/tree/master
- блог https://github.com/honeydev/s-blog/
- p-sch 19/03/17 >>956914 - вопрос по обработке исключений
- https://github.com/grigoryMovchan/auth/
- https://bitbucket.org/learning_acc/discounts/
- https://github.com/kubk/students
- https://github.com/greenTea242/MinesweeperMVC

Зайдите, посмотрите.

Ну и как всегда, если кого-то из предыдущего треда пропустил, напомните о себе.
Ответы: >>962180
Аноним 2017/03/28 00:17:26  №962175 302
>>962173
>Сайт-визитку можно за несколько дней сделать по уроку
Хотя, уже не советую. Только что вспомнил, что в последней версии ларавела есть отличия от информации из урока. Без некоторых знаний можно не въехать даже прочитав советы в комментариях.

Я еще и вагрант неделю пердолил, пока разобрался. Теперь понимаю, почему многие программисты так высокомерно к новичкам относятся - очень быстро забываешь, как пердолился с чем-то одним неделями.
Аноним 2017/03/28 00:31:52  №962180 303
14831331277010.jpg (35, 353x334)
334x353
>>962174
>- https://github.com/grigoryMovchan/auth/
Видел ответ в прошлом треде. Многие советы реально улучшили мой код. Спасибо.

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

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

https://github.com/grigoryMovchan/STKApps
Аноним 2017/03/28 00:58:56  №962187 304
>>960491
В presta shop миграция БД специальными скриптами, где sql схема смешана с вызовами Php функций, которые в отдельных файлах лежат.
Пример:
https://github.com/PrestaShop/PrestaShop/blob/develop/install-dev/upgrade/sql/1.6.1.1.sql
А вот парсер этого:
https://github.com/PrestaShop/PrestaShop/blob/e1e72b4faa122013684d3b202311cab48a2c3ba8/src/PrestaShopBundle/Install/Upgrade.php

Норм такая схема миграции, или лучше бывает?
Ответы: >>962230
Аноним 2017/03/28 02:17:18  №962199 305
В базе есть таблица Categories c полями ('id', 'user_id', 'category_name')
return App\Category::all(); возвращает мне всё как надо в JSON, но я хочу сделать API без 'user_id'. Куда копать?
Ответы: >>962200
Аноним 2017/03/28 02:19:18  №962200 306
Аноним 2017/03/28 04:30:10  №962214 307
Хочется также пожелать чего-нибудь плохого криворукому инвалиду, которому было лень прокрутить пару страниц и найти тред, и который создал новый тред с кривой шапкой, потеряв часть ссылок и советы по оформлению кода.

>>958750

Он не может найти драйвер для соединения с БД. одно из двух: либо в конфиге ларавеля у тебя выбран неправильный, либо у тебя не установлено какое-то расширение PHP (pdo, pdo_mysql и тд).

>>958791
>>958904

Ты наверно кроме PHP еще что-то ставил.

Судя по интернету, php-fpm ставится только пакетом php5-fpm, соответственно ты его наверно выбрал. Проблем никаких нет, ты легко можешь отключить сервис php-fpm с помощью systemctl disable, погугли статьи про systemd вроде такой: http://vladimir-stupin.blogspot.ru/2013/02/systemd-1.html


>>958849

php companion
docblockr
emmet (для HTML/CSS)
jshint gutter

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

>>958999

Нужен как минимум шрифт, содержащий эти символы.

Можно попробовать выполнить советы отсюда: http://unicode.org/help/display_problems.html

Тут пишут, немного по другой проблеме (юникодные символы то появляются, то исчезают) https://superuser.com/questions/520355/permanent-fix-for-unicode-characters-not-displaying-correctly-as-boxes что иногда помогает создание на рабочем столе файла с японскими символами в тексте.

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

У меня например кандзи отображаются, а многие юникодные символы - тоже нет.

Тут есть примеры шрифтов с указанием диапазонов символов в них: https://en.wikipedia.org/wiki/Unicode_font

Какие символы есть в веб-шрифтах, легко проверить на Google Fonts.
Аноним 2017/03/28 04:30:31  №962215 308
>>959187

Объект модели создается в bootstrap.php, и сохраняется в переменную $postsService . Контроллер просто обращается к этой переменной. Так как переменная глобальная (создана не внутри функции), то она видна везде.

Если ты изучал Си, то в PHP include/require это совсем другая вещь. require просто выполняет код из указанного файла. То есть достаточно где-то один раз сделать require для класса, этот класс будет описан в файле, PHP его запомнит, и второй раз делать require уже не надо.

Так как приложение маленькое то проще всего вызвать файлы с описанием классов в bootstrap, создать все нужные объекты и потом не мучаться. В большом приложении используем PSR-4 и автозагрузку классов, и DI container.

>>959289

Думаю, это то, что описано в моем учебнике + на всякий случай перечитать мануал PHP.

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

>>959353

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

Использовать автозагрузку не обязательно, можно просто руками зареквайрить все классы в bootstrap, если их мало.
Ответы: >>962218 >>962319
Аноним 2017/03/28 04:30:49  №962216 309
>>959357

Для чю/щю хватит одной регулярки. Просто надо в выражении для замены использовать $0, $1, $2 ... - это выражение берет кусок строки, захваченный соответствующими скобками в регулярке или всей регуляркой для $0. Подробнее в мануале по preg_replace.

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

Пример:

echo preg_replace("/(ж|ш)([аоуэыи])/ui", '0 = $0, 1 = $1, 2 = $2', 'шипы'); // 0 = ши, 1 = ш, 2 = и

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

>>959464

Я тебе помочь не смогу. Без цифр пока программировать не получится. Не понимаю, почему тебя это пугает, ведь считать придется компьютеру, а не тебе.

>>959545

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

>>959663

Так и надо, поставить скобки и указать повторение 10 раз.
Ответы: >>962218
Аноним 2017/03/28 04:31:21  №962217 310
>>959687

любые буквы в любом количестве - зак - любые буквы в любом количестве

>>959723

Было бы полезно еще усвоить основы HTML/CSS/JS, основы SQL, какую-нибудь простую CMS. Ну и имей в виду, что на простые задачи конкурс большой, сам понимаешь, чем больше способных справиться, тем ниже цена.

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

>>959725

Вместо твоих магических цифр лучше передавать в checking() фразу для замены.

А еще можно сделать массив вида [ регулярка => замена ] и циклом его обойти.

Выражение /\bз(д[а-яё]+ заменит "здание" на "сдание".

> ([^,;.])( )(а|но)
Это выражение ошибется если идет запятая, за ней 2 пробела и за ними слово.

> if ($error == true){
Можно просто if (count($matches[0]) > 0)

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

> И заодно подскажите, как надо настроить регулярку? А то она у меня в предложении:
> "после таких знаков:восклицательного!И даже"
> отсутствие пробела в "знаков:восклицательного" вылавливает, а уже в "восклицательного!И" не вылавливает

Это потому, что твоя регулярка при совпадении захватывает идущие за символами буквы, и поиск нового совпадения начинается после них. Надо либо не захватывать все слово после знака препинания, либо использовать утверждения при поиске (http://php.net/manual/ru/regexp.reference.assertions.php )

То есть для поиска символов перед "но" можно попробовать использовать утверждение (?<) но там есть свои ограничения.

Также, еще один вариант - просто применять регулярку в цикле, пока есть что заменять.
Ответы: >>962218
Аноним 2017/03/28 04:32:31  №962218 311
Интересный вопрос про проверку пароля SRP Аноним 2017/03/28 04:32:33  №962219 312
>>959742

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

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

Вот от каких атак защищает алгоритм:

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

Также, там упомянуто, что на сервере не хранится сам пароль, а хранится "cryptographic verifier derived from the password", то есть это даже не хеш от пароля, а число, полученное из хеша.

Рассмотрим сам алгоритм.

> q and N = 2q + 1 are chosen such that both are prime (which makes q a Sophie Germain prime and N a safe prime). N must be large enough so that computing discrete logarithms modulo N is infeasible.
Это пока понятно.

> g is a generator of the multiplicative group.
Вот это уже сложнее. Это уже пошла сложная математика, попробуем разобраться:

Кликаем по ссылке и читаем описание:

1) https://ru.wikipedia.org/wiki/Сравнение_по_модулю

(тут, если читать постепенно, все относительно понятно)

2) https://ru.wikipedia.org/wiki/%D0%9C%D1%83%D0%BB%D1%8C%D1%82%D0%B8%D0%BF%D0%BB%D0%B8%D0%BA%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F_%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%BA%D0%BE%D0%BB%D1%8C%D1%86%D0%B0_%D0%B2%D1%8B%D1%87%D0%B5%D1%82%D0%BE%D0%B2

> Мультипликативная группа кольца вычетов

В криптографии часто используется арифметика с использованием модуля (остатка от деления) на какое-то число N. Это усложняет выполнение обратных операций. Одно дело, если мы возвели число в квадрат - мы всегда можем взять корень и получить исходное число, а другое дело, если мы например взяли от результата только 3 последние цифры (остаток от деления на 1000) - тут уже корень взять становится труднее, мы будет вынуждены использовать перебор (возводим числа от 1 до N в квадрат и сравниваем последние цифры), что сильно замедлит нам нахождение исходного числа. Может и есть какие-то пути ускорить этот перебор, но в любом случае, выполнение обратной операции получается дольше, чем исходной (возведение в квадрат).

При операциях с модулем N числа a - 2N, a - N, a, a + N, a + 2N сравнимы, так как дают тот же остаток от деления на N. Более того, некоторые математические операции с ними дадут сравнимый результат (то есть одинаковый остаток).

Например, a в квадрате и (a + N) в квадрате дадут сравнимый результат (если взять остаток от деления на N). Проверь.

Набор таких сравнимых чисел называют "классом вычетов числа a по модулю N" (congruence class or residue class). Таких классов будет ровно N и вместе они называются "полная система вычетов по модулю N" (complete residue system modulo n). "вычет" - видимо значит "остаток от деления".

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

Далее, мы можем из этих чисел еще убрать те, которые имеют общие делители с N (ну например, если N = 14, то число 6 мы убираем, так как 6 и 14 оба делятся на 2, убираем 7 и 8, а 9 оставляем так как оно взаимно простое с 14). Если мы оставим только взаимно простые с N числа, то получается "Приведённая система вычетов по модулю N" (reduced residue system modulo n).

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

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

Возвращаясь к генератору, что же такое генератор? Я погуглил, и нашел это:

- https://crypto.stanford.edu/pbc/notes/numbertheory/gen.html
- https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D0%B2%D0%BE%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D1%80%D0%B5%D0%BD%D1%8C_(%D1%82%D0%B5%D0%BE%D1%80%D0%B8%D1%8F_%D1%87%D0%B8%D1%81%D0%B5%D0%BB)
- http://e-maxx.ru/algo/primitive_root

Генератор (или primitive root, или первообразный корень группы), это такое число, которое мы берем из этой группы, возводим в степени от 1 до x и получаем все другие числа в этой группе (с учетом остатка от деления разумеется). Тут важно понимать, что как только мы получим в результате возведения сам генератор, то круг замкнется, числа начнут повторяться, и если мы не успели получить все числа в группе к этому моменту, то уже никогда их не получим.

Вот там приводили пример для N = 9, и группы из чисел {1, 2, 4, 5, 7, 8}. Если мы берем в качестве генератора 2, и возводим его в разные степени, то получаем:

2 ^ 1 ~ 2
2 ^ 2 ~ 4
2 ^ 3 ~ 8
2 ^ 4 ~ 7 (остаток от деления 16 на 9 = 7)
2 ^ 5 ~ 5 ( = 32 % 9)
2 ^ 6 ~ 1 (= 64 % 9)
2 ^ 7 ~ 2
2 ^ 8 ~ 4

и далее снова будут получаться те же числа. Число 2 при возведении дает все остальные числа из группы. Потому число 2 может служить генератором для этой группы.

А если мы попробуем взять число 4:

4 ^ 1 ~ 4
4 ^ 2 ~ 7
4 ^ 3 ~ 1
4 ^ 4 ~ 4

Оно дает нам только числа 4, 7, 1 и не даст остальные числа из группы. 4 не является генератором группы N = 9.

Число 2 хорошо тем, что если его возводить в разные степени, получаются все возможные числа из группы. Число 4 плохо тем, что получаются не все числа. Зачем это нужно?

Операция возведения g в степень по модулю труднообратима. Если мы возьмем секрет w, и получим из него открытый ключ W = g ^ w mod N, то восстановить w, зная g, N и W очень сложно и долго. Эта операция называется дискретное логарифмирование: https://ru.wikipedia.org/wiki/%D0%94%D0%B8%D1%81%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%BE%D0%B5_%D0%BB%D0%BE%D0%B3%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5

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

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

(g ^ a) ^ b = g ^ (ab) = (g ^ b) ^ a

Допустим Иван знает число a, а Петр знает b. Иван вычисляет A = g ^ a, Петр вычисляет B = g ^ b, они ими обмениваются в открытую. Затем Иван вычисляет S = B ^ a = (g^b) ^ a = g ^ (ab), а Петр вычисляет A ^ b и получает то же число S. Теперь они оба знают общий секрет S, а злоумышленник, хоть и видит A и B, не может из них получить a и b и вычислить S. На этом свойстве и основам алгоритм обмена. У хеш-функции такой особенности нет, она тут не подходит. Кстати, это я описал протокол Диффи-Хеллмана, если ты с ним знаком (советую прочесть):

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

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

Важно, чтобы g было именно генератором группы. Генератор при возведении в степень дает любое число из группы. Если это не так, то при возведении в степень будет получаться не любое число, а только часть чисел из группы, и будет проще подобрать число, которое при возведении в степень даст такое же W.

..... далее ниже
Ответы: >>963349 >>963897
Интересный вопрос про SRP, часть 2 Аноним 2017/03/28 04:33:54  №962220 313
>>959742

продолжение

В нашем алгоритме, к счастью, вычислять генератор не требуется. В нем и q, и g выбираются заранее, например, берутся из какого-нибудь справочника, спецификации. Также, их можно сгенерировать командой openssl dhparam, указав требуемую сложность в битах. Вот тут пример: https://wiki.openssl.org/index.php/Diffie-Hellman_parameters

Вот пример команды: openssl dhparam -text 1024

Она сгенерирует и выведет простое число q и генератор g для N = 2^q + 1.

У меня это вывело длинное простое число q, закодированоое в 16-чном виде и генератор, равный 2.

То есть мы закладываем q, N, g на этапе написания кода.

Также заранее мы вычисляем число k по формуле k = H(N, g), где H - хеш-функция (например, md5, sha1 и тд). Мы как-то смешиваем N и g (например, разделив их двоеточием) и берем хеш. Тут при вычислении хеша лучше числа кодировать не цифрами вроде "123", а в двоичном виде, и брать хеш от двоичной строки.

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

> x = H(s, p) (s is chosen randomly)
Мы генерируем случайную соль, получаем хеш пароля с солью (простейший пример: $hash = md5("$salt:$pass")). Для надежности советуют в хеш еще и логин, и имя хоста добавить (чтобы они были разные даже при одинаковых паролях у 2 пользователей).

> v = g^x (computes password verifier)
Затем получаем password verifier путем возведения в степень (разумеется по модулю N). Этот v мы и сохраняем на сервере, вместе с логином пользователя I и солью s (тройку I, s, v). Как я понимаю, восстановить по нему исходный пароль можно разве что перебором.

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

Теперь посмотрим, как происходит обмен данными:

> User -> Host: I, A = g^a (identifies self, a = random number)
Пользователь генерирует случайное (большое) число a и вычисляет из него A. Он отправляет на сервер логин и это число A.

Число a - это что-то вроде секрета, который знает только пользователь. Получить a из A очень трудно и долго.

> Host -> User: s, B = kv + g^b (sends salt, b = random number)
Сервер в ответ генерирует случайное число b, вычисляет из него B и шлет пользователю пару (s, B). b - это секрет сервера. Число B составлено смешиванием v и случайного числа b, так что восстановить из него v нельзя, не зная b, а b знает только сервер.

a и b стоит хранить в памяти (не сохранять на диск) и очищать ее после разрыва соединения. Как только a и b уничтожены, восстановить что-то по перехваченным данным становится очень сложно.

Оба они затем вычисляют параметр u:

> Both: u = H(A, B)

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

Пользователь далее вычисляет сессионный ключ K:

> User: x = H(s, p) (user enters password)
> User: S = (B - kg^x) ^ (a + ux)

Здесь мы видим, что пользователь по сути вычисляет то же самое число v (g^x), что хранится на сервере, затем по формуле B - kg^x вычисляет g^b и возводит его в степень (a + ux). Попробуем немного преобразовать выражение для S:

(B - kg^x) = g^b (смотри выше формулу для B)

S = (g^b) ^ (a + ux) = g ^ (b *(a + ux)) = g ^ (ba + bux) = g ^ ba * g ^ (bux) = g ^ ba * (g ^ x) ^ (bu)

Тут надо вспомнить что g ^ x = v, подставим это в выражение.

S = g ^ ba * v ^ (bu)

Ну и далее из S мы зачем-то вычисляем хеш и получаем сессионный ключ:

> User: K = H(S)

Теперь посмотрим, что делает сервер:

> Host: S = (Av^u) ^ b (computes session key)
Преобразуем формулу для S:

A = g^a
S = (Av^u) ^ b = ((g ^ a) * v ^ u) ^ b = (g ^ a) ^ b * (v ^ u) ^ b = g^(ab) * v ^ (ub).

да это тот же самый ключ, что посчитал пользователь! То есть получается так:

- пользователь отправляет на сервер логин и число A, вычисленное из случайного секретного числа a
- сервер отправляет пользователю соль s и B, вычисленное из секретного случайного b и числа, полученного из пароля v
- они делают вычисления и получают одинаковый сессионный ключ S. Берут от него хеш K.

При этом важно, что сторонний наблюдатель, перехвативший A, B, s, не способен из них получить S. Тут используется факт необратимости хеш-функции, и то, что для операции g ^ a по модулю трудно произвести обратную операцию.

Имея K, сервер и клиент проверяют, что они получили одинаковое число (чтобы проверить, что они оба - те, за кого себя выдают). Затем этим K шифруются данные с помощью симметричного шифрования.

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

Разберем принципы устройства алгоритма:

- стойкость алгоритма основана на 2 принципах: сложности обратимости хеша и сложности обращения возведения в степень по модулю. Это сделано для защиты при обнаружении слабости в одном из алгоритмов.
- случайные (криптографически случайные) числа a, b нужны, чтобы сессионный ключ был непредсказуем, не вычислен из каких-то известных значений. b еще используется для защиты v при передаче числа B.
- v используется при вычислении S, чтобы сессионный ключ еще зависел от пароля и без знания пароля его было не получить.
- v является общим секретом, который знают и пользователь, и сервер
- злоумышленник не знает ни a, ни b, ни v
- g выбирается по определенным правилам, чтобы оно было генератором, чтобы при возведении его в степень мы могли получить любое другое число из группы (а не часть этих чисел, что может упростить перебор).

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

Ну вот теперь у тебя достаточно знаний, чтобы попробовать реализовать это в программе.
Ответы: >>963349
Аноним 2017/03/28 06:02:53  №962227 314
>>959742

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

Тут написано: для защиты от атаки, позволяющей проверить 2 пароля за соединение: http://crypto.stackexchange.com/questions/6328/why-does-the-srp-6-calculation-of-b-include-a-multiplier-k-3/18724#18724

И тут анон еще тебе прокомментировал вопрос: >>959839

>>959760

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

Иногда роутер объединяют с фронт-контроллером и он еще и создает и вызывает контроллер.

То, что ты предалгаешь, не логично.

>>959839

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

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

Ну просто для сравнения, в случае ssh, если злоумышленник внедрился в процесс sshd, он получит пароль. А в SRP - нет, хоть и получит передаваемые по каналу данные.

Плюс, он хорошо защищает хранящиеся на сервере верификаторы пароля от восстановления.

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

>>959846

Похожих букв конечно больше. Для исправления слов лучше наверно сделать так:

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

ну и твоя программа не найдет английские слова с русскими буквами внутри.
Ответы: >>963349
Аноним 2017/03/28 06:03:18  №962228 315
>>960162

на картинке числа от балды поставлены.

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

У твоего наследования есть один недостаток: нельзя никак догадаться, что при наследовании мы обязаны определить значения вроде $coffee. Лучше сделать в базовом классе абстрактный метод getBasicSalary(), а в наследниках - его реализации. Тогда забыть его реализовать точно не получится.

> public function addEmployee($profession, $number, $rank = 1, $boss = false) {
> for ($i = 0; $i < $number; $i++) {
> $this->employees[] = new $profession($rank, $boss);
Это не очень правильно, что департамент сам создает работников. Лучше сделать метод, в который передается уже созданный employee. А так у тебя нельзя создать отдельно работника и назначить его в департамент.

Да и ты закладываешь ограничение, что у любого работника ровно 2 аргумента в конструкторе. А что если завтра напишут новый класс профессии, где 3 аргумента (например добавится опыт в годах)?

> getTheValues
Лучше printValues

> foreach ($departments as $key => $value) {
Названия плохие. Надо так: foreach ($departments as $department)

Может, еще стоит сделать класс Компания?

>>960231

Лучше бы сначала без, а потом можно добавить Slim или Silex. Это микрофрейморки.

>>960251

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

>>960262

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

>>960270

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

>>960279

Есть урок по MVC на гитхабе, там почти целиком пример готового приложения, можно просто сделать как там.

>>960285

Не надо сюда эту идеологию работника на конвейере вбрасывать. У нас нет цели учить людей переписывать примеры кода из видеоурока. У нас есть цель объяснить что и зачем нужно.
Ответы: >>962325
Аноним 2017/03/28 06:03:40  №962229 316
>>960320

Пара советов:

- число 5000 повторяется много раз, его надо вынести в переменную
- лучше не писать длинные выражения в шапке цикла, плохо читается, лучше писать их в теле цикла
- выражение ($credit+($credit*0.03+1000)); повторяется, надо избавиться от повторов

> if ($credit+$service<5000)
Это условие неправильное, так как оно не учитывает проценты, а только комиссию.

Можно сделать так:

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

«Платим» здесь значит уменьшаем долг и увеличиваем общую сумму выплаченного.

>>961194

на Доброчан запостил потому что, там хоть отвечать на пост можно.

>>960436

Немного не по теме задачи, но почему table? Это же флоатами или на худой конец display: table верстается прекрасно. Если что, у нас есть задачи по HTML/CSS.

Вот кстати решение без использования JS: https://codepen.io/shidhincr/pen/ICLBD - догадаешься, как? Я не догадался.

> var btn = $($("#template-clear-btn").html());
Тут наверно было выгоднее вписать код строчкой, например $('<span...>'), чтобы плагин было проще подключить к странице. Хотя конечно вопрос, что делать, если код более сложный? Простого ответа тут нет. Кто-то в строки вписывает, кто-то в отдельный шаблон и потом как-то собирает в единый файл.

> if (methods.isChromeOrMacClient() &&
> methods.isSearchType(input))
Здесь, к сожалению, есть проблема, что это довольно ненадежный подход:

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

Как например насчет яндекс-браузера и прочей армии хромоколонов?

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

Вот тут человек пытается по нестандартным CSS-селекторам обнаружить наличие крестика:

- http://stackoverflow.com/questions/16234268/detect-input-type-search-clear-button-in-chrome-and-ie10
- http://stackoverflow.com/questions/6942207/html-type-search-detect-clear-button-support

> if (html.attr("dir") == "rtl")
Тут есть важный момент. Ты читаешь атрибут dir, если он задан на html. Но во-первых, dir логично читать на инпуте или его обертке, он может быть разный. Во-вторых, там есть значение auto, когда браузер определяет его сам по содержимому. Что с ним делать?

Я тут поэкспериментировал, и увидел что в Хроме вычисление

window.getComputedStyle($0).direction (это CSS-свойство direction)

дает либо ltr, либо rtl даже при атрибуте dir="auto". Может оно поможет?

Я бы еще обратил внимание на CSS-псевдокласс dir(), который можно было использовать: https://developer.mozilla.org/en-US/docs/Web/CSS/:dir - только оно пока нигде не поддерживается.

Также, есть CSS-правила вроде html[dir=...] .xyz, но они наверно не помогут прочитать dir с инпута.

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

> if (!target.closest(".outer-clear-btn")) {
Это никогда не вернет false так как возвращается объект jQUery. Надо проверять closest().length

Кстати, обнаружил интересную особенность события input при вводе в японской раскладке. Там сначала печатается латинская буква, а когда их набирается несколько, они превращаются в иероглиф. При этом генерируются события keydown/keyup/input, а keypress не генерируется. Оно генерируется только для ввода в латинской или русской раскладке. С другой стороны, совсем древние браузеры input не генерируют.

Так в общем, особых ошибок я не вижу.
Ответы: >>962504
Аноним 2017/03/28 06:08:31  №962230 317
Аноним 2017/03/28 06:34:11  №962231 318
>>961177

Чтобы переносы строк нормально работали и в браузере и в ideone (и в консоли), можно использовать для этого \n, а в начале программы поставить

header("Content-Type: text/plain; charset=utf-8");

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

Иначе перенос строки будет в исходном коде страницы (его можно увидеть нажав Ctrl + U), но на самой странице его не будет.

Заодно указание кодировки исправит проблемы с отображением букв. А то как браузер узнает, в какой кодировке страница? Либо заголовок, либо meta charset нужен.
Ответы: >>962233
Аноним 2017/03/28 06:40:54  №962233 319
Снимок.JPG (18, 1367x30)
30x1367
Ответы: >>962234
Аноним 2017/03/28 06:50:15  №962234 320
>>962233

header можно использовать только до вывода текста, даже один пробел нельзя перед ним вывести. Если ты сохранил файл в utf-8 c BOM то этот символ BOM в начале файла уже все портит. Сохраняй без него

https://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%80%D0%BA%D0%B5%D1%80_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%B1%D0%B0%D0%B9%D1%82%D0%BE%D0%B2

Если вдруг интересно, есть еще сложный урок про кодировки https://github.com/codedokode/pasta/blob/master/cs/strings.md
Ответы: >>962235
Аноним 2017/03/28 06:55:20  №962235 321
>>962234
>BOM
Что?

Т.е если мой php-код в середине html-документа, то header работать не будет?

Ответы: >>962236
Аноним 2017/03/28 06:57:58  №962236 322
>>962235

То его надо поставить в начало документа. Хотя тут речь о выводе текста с переводами строк, а не HTML. Кодировку так же можно задать тегом meta в HTML.

Ответы: >>962237
Аноним 2017/03/28 07:01:03  №962237 323
Снимок.JPG (53, 787x529)
529x787
>>962236
> Кодировку так же можно задать тегом meta в HTML.
Я так и сделал. Хтмл я ещё не забыл, а пхп начал с нуля, ну и засунул php-код в html, что бы мог кодировку в этом html-е указать. Щас снёс всё, оставил только php и header заработал.
Ответы: >>962286
Аноним 2017/03/28 10:24:46  №962275 324
Хоть убейте но не могу понять как написать функцию делающую первую букву предложении заглавной. Вроде тема регулярных выражений описана достаточно понятно, но как заменить первый символ в строке - это просто за гранью моего понимания. Хочется засунуть строку в одномерный массив, выдрать первый элемент, условием проверить является ли она заглавная, затем засунуть нужную букву назад. блядь.
Ответы: >>962277 >>964069
Аноним 2017/03/28 10:31:24  №962277 325
>>962275
Ищешь символ с индексом 0 в слове, делаешь его заглавным. Что сложного?
Аноним 2017/03/28 10:45:31  №962286 326
>>962237
А как ты пхп в шинде поставил? Wamp?
мимоньюфаг
Ответы: >>962287 >>962714
Аноним 2017/03/28 10:48:39  №962287 327
Снимок.JPG (53, 569x404)
404x569
Ответы: >>962289 >>962290
Аноним 2017/03/28 10:52:16  №962289 328
>>962287
Это русская разработка? Выглядит как мокрописька, что-то страшно такое ставить.
И никаких исходников даже.
Аноним 2017/03/28 10:53:42  №962290 329
>>962287
>Программы в комплекте
>Skype — Общение;
>TeamViewer — Удалённый помощник;
>uTorrent
Ой-ёй, не-не, такое мне не надо, извините.
Аноним 2017/03/28 12:10:47  №962319 330
>>962215
>Если ты изучал Си, то в PHP include/require это совсем другая вещь. require просто выполняет код из указанного файла. То есть достаточно где-то один раз сделать require для класса, этот класс будет описан в файле, PHP его запомнит, и второй раз делать require уже не надо.
Спасибо!
Я не изучал программирование до РНР, иду практически с нуля.
Аноним 2017/03/28 12:30:21  №962325 331
>>962228
>Может, еще стоит сделать класс Компания?
Я не могу представить, как должно выглядеть следующее: Компания создаёт Департамент, который создаёт Работников. Как, например, в этом случае потом отдельно создавать работников и включать их в компанию? Не могу осмыслить...
>Антикризисные меры я бы сделал так: делаем класс АнтикризисныйКомитет и у него 3 метода в стиле применитьМеруN(компания). Метод принимает на вход компанию и что-то в ней меняет, например, увольняет людей. Ну или если тебе хочется заморочиться, можно как-то сделать 3 класса, каждый для своей меры, но не вижу смысла.
Сложнота для меня, но если разберусь с классом Компания, то и тут пойму, наверное.
>У твоего наследования есть один недостаток: нельзя никак догадаться, что при наследовании мы обязаны определить значения вроде $coffee. Лучше сделать в базовом классе абстрактный метод getBasicSalary(), а в наследниках - его реализации. Тогда забыть его реализовать точно не получится.
О, я дальше сделал так, как ты советовал в подсказках, - до этого я делал без чтения подсказок.
Вот тут: >>961014
Действительно, теперь если появится дополнительный параметр (потребление воды из кулера, использование мыла или выкуривание сигарет - для примера), достаточно его прописать в методе addEmployee(), в соответствии с профессией.
>> public function addEmployee($profession, $number, $rank = 1, $boss = false) {
>> for ($i = 0; $i < $number; $i++) {
>> $this->employees[] = new $profession($rank, $boss);
>Это не очень правильно, что департамент сам создает работников. Лучше сделать метод, в который передается уже созданный employee. А так у тебя нельзя создать отдельно работника и назначить его в департамент.
То есть я вообще неверно понимал, что Компания должна создавать Департаменты, Департамент должен создавать Работника... Получается, этим всем могут заниматься простые функции, а методы в этих классах работают только с подсчётом всего по компании или департаменту?
>Да и ты закладываешь ограничение, что у любого работника ровно 2 аргумента в конструкторе. А что если завтра напишут новый класс профессии, где 3 аргумента (например добавится опыт в годах)?
Ну, тогда можно ведь в конструктор добавить $this->experience = $experience;, а в аргументах поставить по умолчанию $experience = false, чтобы уже имеющииеся работники у нас создавались нормально? Горожу что-то непонятное, конечно.
>> getTheValues
>Лучше printValues
Хм, да, действительно.
>> foreach ($departments as $key => $value) {
>Названия плохие. Надо так: foreach ($departments as $department)
Точно, спасибо, это я машинально записал, а потом не подчистил.

Спасибо за такой подробный разбор! Постараюсь разобраться - задача интересная.
Ответы: >>962338 >>964069
Аноним 2017/03/28 13:38:30  №962338 332
>>962325
Ну вот сделал с нормальным foreach: https://3v4l.org/mHNMJ
Признаться, что-то и не сразу вышло вообще - структура почему-то неочевидной оказалась.
Аноним 2017/03/28 14:34:55  №962351 333
Аноним 2017/03/28 14:35:52  №962352 334
Unable to write in the "/opt/lampp/htdocs/tvProject/public/images/logo/" directory
Laravel 5.4
Я так понимаю траблы с доступом к папке?
Ответы: >>962356
Аноним 2017/03/28 14:40:26  №962355 335
Алсо поясните, как правильно данные передавать в сессии? Делаю редирект после регистрации. Сохраняю сначала урл в сессию допустим такой
/?sort=name&page=6
А на странице регистрации он уже так выглядит
/?sort=name&amp;amp;page=6&notify=registered
ЧЯДНТ?
Ответы: >>962434
Аноним 2017/03/28 14:41:19  №962356 336
>>962352
Скорее всего адрес неправильный. Убери слеш в конце, может в нем дело.
Ответы: >>962357
Аноним 2017/03/28 14:43:32  №962357 337
>>962356
Погуглил, оказалось действительно права доступа. Накатил chmod 755 на папку и всё норм.
Аноним 2017/03/28 14:57:16  №962361 338
В треде есть автор учебника на narod'e?
Ответы: >>962362
Аноним 2017/03/28 14:58:52  №962362 339
>>962361
Не факт, возможно его макаба доебала и он перекатился на доброчан.
Ответы: >>962363
Аноним 2017/03/28 15:02:47  №962363 340
>>962362
хреново, я на задаче его застрял, а решения этот гений в учебник не включил
Ответы: >>962364
Аноним 2017/03/28 15:06:18  №962364 341
Ответы: >>962365
Аноним 2017/03/28 15:11:01  №962365 342
Ответы: >>962378
Аноним 2017/03/28 15:16:49  №962367 343
И снова выхожу на связь с ларавелом:
При сохранении файла делаю
$file->move($path, $file->getClientOriginalName());
Как мне вместо getClientOriginalName дать собственное имя файлу?
Ответы: >>962374 >>962491
Аноним 2017/03/28 15:23:57  №962374 344
>>962367
Бля пиздец, да почитай ты уже документацию. Эта хуйня одинаковая во всех фреймворках.
Аноним 2017/03/28 15:38:56  №962378 345
444ок.JPG (26, 636x131)
131x636
>>962365
Не верно. В уроке есть ответ.
$xBal нужно перед условием объявить и обнулить.
php намекает
PHP Notice: Undefined variable: xBal in /home/vKdGL9/prog.php on line 20
PHP Notice: Undefined variable: xBal in /home/vKdGL9/prog.php on line 21

Почитал твой код и нихуя не понял
Сам я ньюфаг-вот моё решение https://ideone.com/dZDFn3


Ответы: >>962387
Аноним 2017/03/28 16:21:03  №962387 346
>>962378
$sum определи уже, что ж ты творишь-то, ааа
ВОН ИЗ ПРОФФЕСССИ!1
Ответы: >>962388
Аноним 2017/03/28 16:22:39  №962388 347
>>962387
Prostite, я больше не буду.
Аноним 2017/03/28 16:49:35  №962396 348
Поясните, а как делать разделение на контроллеры в случае с о слимом? Ну точнее даже не знаю как сказаь, но вот в студентах у меня парсилась ссылка и в зависимости от урла возвращается объект с контроллером. Регистрация и отображение списка студентов разграничены в итоге разными контроллерами, так код не разрастается до неприличия и в целом удобно. Но в слиме я не могу понять как такое сделать - уже документация наталкивает на мысль о том, что надо ебашить все экшены в одном файле. Да, для задачки с файлообменников оно нормас, а что делать в случае крупных приложений? Как это правильно делается то?
Ответы: >>962434
Аноним 2017/03/28 16:56:29  №962400 349
Делаю задачи на строки. Ideone ругается на mb_internal_encoding('utf-8'), мол неизвестная функция. вот текст ошибки:

PHP Fatal error: Uncaught Error: Call to undefined function mb_internal_encoding() in /home/tkDcLc/prog.php:4
Stack trace:
#0 {main}
thrown in /home/tkDcLc/prog.php on line 4


В гайде написано, что как раз там это все должно работать. Может я что-то не так делаю?
Ответы: >>962406
Аноним 2017/03/28 17:01:41  №962406 350
>>962400
Проблема со строками на Идеоне уже давно, перекатывайся на https://3v4l.org
Базарю, поцене 38 рублей, намного удобнее и лучше Идеоне. Это что-то вроде контроля версий - в браузере при каждом запуске скрипта будет сохраняться его копия, код не потеряешь, можно в истории просмотров вернуться к нужному варианту и т.п.
Ответы: >>962415
Аноним 2017/03/28 17:10:20  №962415 351
>>962406
Спасибо, очень выручил!
Ответы: >>962416 >>962671
Аноним 2017/03/28 17:12:16  №962416 352
Ответы: >>962672
Аноним 2017/03/28 17:38:19  №962434 353
>>962396
> разделение на контроллеры в случае с о слимом?
Есть же пример в документации, раздел "Allow Slim to instantiate the controller": https://www.slimframework.com/docs/objects/router.html

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

>>962355
Зачем сохранять урл в сессию?
Ответы: >>962447 >>962449
Аноним 2017/03/28 17:52:20  №962447 354
>>962434
>Зачем сохранять урл в сессию?
Что бы после регистрации пользователь на ту же страницу попадал откуда и попал не регистрацию.
Аноним 2017/03/28 17:57:05  №962449 355
>>962434
А, понел. Но все равно какая-то хуйня выходит, надо же опять же определять вот это:
$app->get('/', \HomeController::class . ':home');
$app->get('/contact', \HomeController::class . ':contact');
Аноним 2017/03/28 19:06:33  №962491 356
>>962367

Ты ларавель изучаешь или просто код с экрана переписываешь? Открой документацию по move() и прочти.
Аноним 2017/03/28 19:25:18  №962504 357
>>962229

Оп, а ты всегда теперь на доброчане отвечать будешь?
Ответы: >>962521
Аноним 2017/03/28 19:27:16  №962507 358
Доброчан мертв, там одни лицемеры, а оп-неженка, который не готов к суровым реалиям общества.
Аноним 2017/03/28 19:41:52  №962521 359
>>962504

Где будут спрашивать, там и буду отвечать. Если что-то случится - перекатываемся на доброчан.
Аноним 2017/03/28 20:07:23  №962544 360
Что я делаю не так? Точнее я уже понял ошибку но не могу понять как можно исправить. Задача про Генератор имен.
Мой код: http://ideone.com/fork/mHPI0v
Ответы: >>962545
Аноним 2017/03/28 20:09:08  №962545 361
>>962544
Ты каждый раз перезаписываешь переменную $name, видимо задумка была в её дописывании.
Аноним 2017/03/28 22:02:32  №962671 362
>>962415
Гляжуст в тебя, как в зеркало, до головокружения...
Ответы: >>962672 >>962678
Аноним 2017/03/28 22:03:09  №962672 363
Аноним 2017/03/28 22:14:24  №962678 364
>>962671
Опять в бухгалтерии бабки радио включали? Завязывай с госконторами.
Аноним 2017/03/28 22:21:57  №962680 365
Не могу никак определиться, где быстрее работу найти? Пилить говнокод на битриксах или заняться фреймворками и искать проекты?
php на уровне ООП
Аноним 2017/03/28 22:24:25  №962681 366
Аноним 2017/03/28 22:27:07  №962682 367
Сап! В универ надо сделать один сайт, использовать Symfony и MySql. Все бы ничего, но я в вебе вообще нулячий. Накатил симфони, поднял xampp, вроде норм, потратил на запуск кучу времени. Но вот что дальше? Читаю гайды и нихуя не понимаю. Как прикрутить бутстрап, создать простую страницу? И еще, стоит ли тратить время на Doctrine?
Ответы: >>962686
Аноним 2017/03/28 22:27:52  №962684 368
>>962680
Фреймворки. Битриксы это хуже червя-пидора-1сника.
Ответы: >>962688
Аноним 2017/03/28 22:29:02  №962686 369
>>962682
Ты что, в хтмл-ксс не могешь?
Ответы: >>962690
Аноним 2017/03/28 22:30:00  №962688 370
>>962680
>>962684
"Саморазвиваться с фреймворками" можно и в свободное время, а кушать хочется всегда.
Ответы: >>962689
Аноним 2017/03/28 22:31:53  №962689 371
>>962688
Фреймворки это рост, зарплата.
Для тебя так сложно задрочить фреймворк?
Ответы: >>962698 >>962732
Аноним 2017/03/28 22:33:40  №962690 372
Ответы: >>962692
Аноним 2017/03/28 22:34:56  №962692 373
>>962690
Можешь на html программировать?
Ответы: >>962716 >>962716
Аноним 2017/03/28 22:41:24  №962698 374
hqdefault.jpg (16, 480x360)
360x480
>>962689
Мне нужна работа за миску еды хотя бы что бы не сдохнуть с голоду. Я бы не против yii освоить, но без работы мне сейчас не вариант
Всё очень утрированно но суть ты понял
Ответы: >>962703 >>962709
Аноним 2017/03/28 22:44:14  №962703 375
>>962698
Ну, хули, сам ответил на свой вопрос, учи битриксы и вордпрессы.
Аноним 2017/03/28 22:53:12  №962709 376
>>962698
Как у тебя с мозгами? Ты тупой, как и я? Если да, то можем обменяться контактами и вместе подыхать с голоду, я к лету как раз освобожусь.
Аноним 2017/03/28 23:01:49  №962714 377
>>962286
xampp удобнее в винде
Аноним 2017/03/28 23:02:24  №962716 378
Аноним 2017/03/28 23:05:38  №962717 379
>>962680
Быстрее всего открыть вакансии по своему городу и расписать требования, количество работ и зарплаты в excel таблицу. Сразу и понятно станет, что учить.
Аноним 2017/03/28 23:11:23  №962721 380
Нужна помощь по задачке. Условия задачи: "W5.2 Некто кладет в банк 10000 р. Банк начисляет 10% годовых (то есть, каждый год на счету становится на 10% больше, чем в прошлом году). Напиши программу, считающую, через сколько лет в банке будет миллион? Сколько лет будет этому некто? Доживет ли некто до этого дня, если сегодня ему 16 лет?"
Задача по циклам, остановился на составлении цикла. Код: "<?php
error_reporting(-1);

$bankAmount = 10000
$bankPercent = 0.1

for ($years = 1; $years <= 100; $years ++) {

}"
Дальше я не знаю как и что.
Ответы: >>962730
Аноним 2017/03/28 23:14:09  №962724 381
Бамп
Аноним 2017/03/28 23:25:39  №962730 382
>>962721

Внутри цикла надо написать примерно такую команду:

увеличить сумму в банке с учетом процентов;
вывести на экран год и текущую сумму;

Это для начала. Потом надо будет добавить еще проверку, если сумма достигла миллиона, то напечатать, сколько лет прошло, и выйти из цикла.
Аноним 2017/03/28 23:26:39  №962732 383
>>962689
Я к примеру пошел на работу опенкарт ковырять. В свободное время изучил второй язык js (не на уровне манипуляции с дом -поработал с нодой, в частности с sails, с Cordova ). Сделал с десяток тасков на этом. Потом плотно занялся MySQL так вы процессе работы с нагруженными e-commerce нужно много оптимизировать. Сейчас в свободное время взялся за slim, потом планирую в laravel/symphony. А мог бы дальше у мамки на шее сидеть и учить фреймворки.
Ответы: >>962735 >>962737 >>962748
Аноним 2017/03/28 23:31:17  №962735 384
>>962732
А я тоже на работу быстро выкатился, подучил там mysql, пару фреймворков, js и юнит тесты, бабла на год безработной жизни подкопил, щас думаю работу кидануть и на фрилансы попробовать вкатиться. На работе вообще все быстрее учится, дома как-то медленно слишком шло.
Ответы: >>962738 >>962740 >>962745
Аноним 2017/03/28 23:34:52  №962737 385
>>962732
Поясни нубу за ноду, нахуй она нужна если у тебя в стеке уже есть серверсайд технология?
Ответы: >>962848
Аноним 2017/03/28 23:35:37  №962738 386
>>962735
Фриланс, Хз, я по удаленке пробовал работать, лично я не могу, сложнее из дома сосредоточиться
Аноним 2017/03/28 23:36:19  №962740 387
>>962735
Тоже с джумл всяких начал?
Ответы: >>962756
Аноним 2017/03/28 23:48:01  №962745 388
>>962735
Ты пиздишь как дышишь. Никакой нормальный человек не будет вкатываться на фрилансы с ирл работы.
Ответы: >>962754
Аноним 2017/03/28 23:49:19  №962748 389
>>962732
Ты и сейчас сидишь на шее у мамки, просто выучил пару модных слов с уроков на ютубе, которые ты не смог осилить. Прекращай уже заниматься хуйней, иди на завод, ты нужен стране.
Аноним 2017/03/29 00:00:21  №962754 390
>>962745
Почему? На работе сидеть заебывает, душный офис, куча народу в комнате 5х5 метров, все галдят и невозможно сосредоточиться, линейки с докладами каждое утро по часу и злобный начальник, у которого все должно быть сделано вчера. На фрилансе сидишь дома в уюте и пишешь код как король.
Аноним 2017/03/29 00:02:12  №962756 391
>>962740
Ага, с магазинов.
Аноним 2017/03/29 03:07:56  №962807 392
Может кто-то помнит ответы на задачу про айпад с функциями?
Вроде в тело функции рабочий код с первой задачи пришил, к Клубнике банку 7777 р. добавил, но мучают сомнения. В ОПовском учебнике на выводе видно что у Клубники банка на "конце" 08. Хуй знает.
Ответы: >>962816
Аноним 2017/03/29 04:29:14  №962815 393
Вот я охуел от задачки считалка, в общей сложности 3 часа просидел. Оп вообще не через массивы решал, но я без понятия как вообще это сделать.
https://3v4l.org/LB3b5
Аноним 2017/03/29 04:33:14  №962816 394
>>962807
У меня в третьем случае вышло
>Кредит от банка StrawberryBank, обойдётся в 53560, выплаты составят - 11 месяцев

Я функции добавил новую вводную переменную "единоверменная выплата", двух других банков она была равна 0, у третьего 7777, собственно в формуле подсчёта эта переменная участвует.
Ответы: >>962818
Аноним 2017/03/29 04:45:11  №962818 395
>>962816
Указывал 39999 или 40 000?
Ответы: >>962819
Аноним 2017/03/29 04:46:38  №962819 396
Ответы: >>962820
Аноним 2017/03/29 04:49:19  №962820 397
>>962819
А попробуй ввести данные из задачи про айфон? Корректно выведет? У меня просто вроде сходится, но вывод разный у нас.
Ответы: >>962821
Аноним 2017/03/29 04:52:33  №962821 398
Ответы: >>962823 >>962828
Аноним 2017/03/29 05:08:56  №962823 399
>>962821
Скорее всего у тебя что-то не так. При данных 1000р., 3%, комиссия 500р. вывод неверный.
Ответы: >>962825
Аноним 2017/03/29 05:16:35  №962825 400
33.JPG (41, 738x362)
362x738
>>962823
Комиссия 1000р, а не 500.
Ответы: >>962826 >>962827
Аноним 2017/03/29 05:22:04  №962826 401
>>962825
Бля, соррян, не увидел. Тогда хуй знает почему на функциях ответы не совпадают. Говнокод не комментировал, стыдно кидать.
Аноним 2017/03/29 05:29:30  №962827 402
>>962825
Так, ответы не совпадают только у strawberryBank, теперь хоть буду знать где фиксить.
Ответы: >>962828
Аноним 2017/03/29 05:41:22  №962828 403
>>962827
>>962821
Все, пофиксил, теперь сходятся. Код у тебя компактный, не то что моя гора текста. Но буду оправдываться тем что пользовался технологиями которые в учебники ранее давались, из читерского только While прикрутил.
Аноним 2017/03/29 08:59:34  №962848 404
>>962737
Мне сам язык нравится, после Флэнагана полюбил js.
Аноним 2017/03/29 10:22:41  №962878 405
Господа, поясните за кеширование динамических страниц при хайлоаде? Гугл говорит, что нужно сохранять контент в текстовый файл и погружать оттуда? Т.е. Пр обновлении данных новые данные пишутся и в текстовый файл и в бд? Таким образом в файле всегда будет лежать свежая инфа?
Ответы: >>962946 >>963203 >>963204
Аноним 2017/03/29 12:47:08  №962940 406
Снимок.JPG (58, 644x337)
337x644
Задача из "ОПП...", тут как бы и так довольно сложно вникать в это, но масла в огонь добавляет отсутствие вменяемых условий для задачи.
В Родительском классе задано одно поле:
text; в котором задаётся текст вопроса.
Всё, а поле которое мы должны проверять где? Куда? В Классах-предках есть поля:
$options; // варианты ответа на вопрос
$correntOption; // правильный вариант на вопрос

$answer; // ответ
$deviation; // допустмая погрешность

Среди них есть с чем сравнивать - правильные ответы и два других. Но с чем сравнивать? Пользователь ввёл ответы - где эта переменная? Как писать функцию function checkAnswer($answer) если НЕ С ЧЕМ СРАВНИВАТЬ? Ответов пользователя НЕТ.

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


Ответы: >>962949 >>962952
Аноним 2017/03/29 12:50:11  №962946 407
>>962878
>Господа, поясните за кеширование динамических страниц при хайлоаде?
Ночью запускается скрипт (кроном) и он создаёт много-много файлов с расширением .php
Они потом прогоняются через интерпретатор. IRL от высоких нагрузок это не спасает, гугли MySQL, таблицы в памяти, плоские таблицы с одним ключом.
Ответы: >>963203
Аноним 2017/03/29 12:51:17  №962949 408
>>962940
Блядь хуйню написал и рад, в общем для меня там не заданы условия в ЯВНОМ виде, вот что я хотел донести. Буду рад пояснениям.
Ответы: >>963203
Аноним 2017/03/29 13:00:24  №962952 409
>>962940

Объект Question хранит только информацию о вопросе. Ответ в нем естественно не хранится, а хранится в отдельной переменной или массиве (так как ответов много).

Там же есть пример в уроке: функция function checkAnswers($questions, $answers)

Она получает на вход отдельно массив объектов-вопросов и отдельно массив ответов. В цикле обходим вопросы и берем соответствующий вопросу ответ из другого массива.
Ответы: >>962970
Аноним 2017/03/29 13:34:38  №962970 410
>>962952
Всё ровно не понял... задача рамазана по всей странице...ладно, скипну.
Ответы: >>963055
Аноним 2017/03/29 14:26:36  №963002 411
Поясните за конструкцию вида ClassName::class - это типа получение полного имени класса вместе с неймспейсом?
Ответы: >>963203
Аноним 2017/03/29 15:09:23  №963024 412
Да ебена мать, помогите разобраться. Все никак не могу прикрутить bootstrap к симфони.
Добавляю бутстрап: bower_components/bootstrap/dist/css/bootstrap.css
Создаю бандл, там есть такое: src/Blogger/BlogBundle/Resources/views/Default/index.html.twig. Сюда я пытаюсь вкорячить хтмл-код, также дописываю
<link rel="stylesheet" href="{{ asset('bower_components/bootstrap/dist/css/bootstrap.css') }}">
И нихуя не работает. Просто обычная страница без css.
Ответы: >>963025 >>963203
Аноним 2017/03/29 15:13:06  №963025 413
>>963024
У тебя bower_components в публичной папке? Обычно после установки через bower нужные файлы копируют собственными скриптами.
Ответы: >>963032
Аноним 2017/03/29 15:17:21  №963032 414
>>963025
А хз. Я по трем разным инструкциям делал. Вообще наверно можно было все руками скопировать, bower все-равно де ничего не сконфигурировал.
Ответы: >>963045
Аноним 2017/03/29 15:31:18  №963045 415
>>963032
У тебя публичная директория web, а файлы бутстрапа совсем в другом месте. Руками копировать не всегда хорошо, так как при установке твоего приложения на другую машину, сисадмину нужно будет делать то же самое, а без подробной инструкции очень сложно догадаться что именно нужно скопировать, куда и откуда. Легче и проще один раз написать скрипт который это все делает, а потом если ты к примеру решишь поменять структуру файлов в публичной папке, ты сможешь сделать это в скрипте, при этом тебе не придется писать новуб инструкцию при установке.
Ответы: >>963049 >>963052
Аноним 2017/03/29 15:35:19  №963049 416
>>963045
>писать скрипты в 2017 вместо простого разворачивания божественного докер-контейнера
Ответы: >>963203
Аноним 2017/03/29 15:39:27  №963052 417
>>963045
Ладно, вот я скопировал папку бутстрапа в веб, и все равно нихуя. Может еще чего надо написать?
Ответы: >>963062 >>963203
Аноним 2017/03/29 15:42:15  №963055 418
>>962970
>ладно, скипну.
Я те блять щас скипну, пииииидр!!1
Это самое важное в учебнике, всё, что было до этого - это подготовка к ООП. Все фреймворки на нём, всё вменяемое программирование - на нём.
А ты - "скипну".
А на давай быстро вопросы задавай!

Что ты не можешь конкретно понять?
Ответы: >>963063
Аноним 2017/03/29 15:54:42  №963062 419
>>963052
Для начала ты можешь открыть инструменты разработчика в браузере и посмотреть откуда он пытается загрузить стили. Эта информация поможет тебе определить источник проблемы. И в следующий раз пользуйся гуглом, решение тво ей проблемы можно найти за минуту.
Ответы: >>963073
Аноним 2017/03/29 15:55:21  №963063 420
>>963055
Ну пожалуйста, давай я решу задачу про Вектор, а эту мы пропустим?
Ответы: >>963089 >>963199
Аноним 2017/03/29 15:55:30  №963064 421
Есть ли тут те, кто вкатился в PHP после нескольких лет кодинга на Java, C# или других нормальных языках? Как унять блевотные призывы и приучить себя к любви к сладкому хлебушку? Ведь на жабе нет фриланса/удаленки.
Ответы: >>963066 >>963138 >>963199
Аноним 2017/03/29 15:58:58  №963066 422
>>963064
Нахуй писать на языке который тебе противен? Ты чё мазахист?
Ответы: >>963068
Аноним 2017/03/29 16:01:01  №963068 423
>>963066
Так кушать хочется, и за интернеты платить надо. Не все могут на шее у мамки сидеть или бабкину квартиру сдавать.
На жабе работы-то нет.
Ответы: >>963748 >>963831
Аноним 2017/03/29 16:02:01  №963069 424
Еще рассматривал 1C, но там конкуренция большая, а я не знаю предметную область.
Аноним 2017/03/29 16:07:55  №963073 425
>>963062
Честно, по всем гайдам пытался, и в composer.json вписывал зависимости, и в config.yml всякие asertic, никак.
А стили пытается грузить откуда я и указал, но Failed to load resource.
Ответы: >>963199
Аноним 2017/03/29 16:36:30  №963089 426
>>963063
С ума сошёл! Там ты обсеришься из-за сложноты, инфа соточка!
Сначала же простое надо понять, о чем ты вообще..
Аноним 2017/03/29 16:41:08  №963096 427
Сап двач, я не могу осилить синтаксис пхп, я обсерился. Зачем эти сложные :: $, разве нельзя было сделать как в питончике? Ааа, почему так сложна?
Ответы: >>963173 >>963199
Аноним 2017/03/29 17:22:02  №963138 428
>>963064
Да изи, работаю на джаве с шарпом параллельно с пхп. Ничего против пхп не имею сейчас, но поначалу тоже не очень было.
Аноним 2017/03/29 18:19:29  №963173 429
>>963096
>Зачем эти сложные ::
С этим все очень просто, лол. Два двоеточия и стрелка используется от того, что точка уже используется для конкатенации, лол.
Аноним 2017/03/29 18:59:21  №963199 430
>>963096

Почему в питончике нельзя было сделать $ и ::? Как сложно.

>>963073

Для начала посмотри в исходном коде страницы, какие теги вставляются в HTML-код. Посмотри на вкладке network в отладчике, куда идут запросы. И посмотри, нет ли чего в логах.

С assetic нужно разбираться и читать доки.

>>963064

даже на западном фрилансе?

>>963063

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




Аноним 2017/03/29 19:10:18  №963203 431
>>963052

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

>>963049

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

>>963024

Смотри, что выводится в HTML-коде, что пишется в логи Симфони и лог ошибок PHP.

>>963002

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

>>962949

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

>>962946

Ну и бред ты пишешь. Зачем людей путаешь?

>>962878

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

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

Есть презентация с объяснениями разных подводных камней: http://lib.custis.ru/images/6/6d/WebAppCache.pdf (не знаю, где искать запись выступления, можешь по названию погуглить)

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

Если хочешь, можем еще какую-нибудь практическую задачу решить - например прикрутить кеширование к блогу на вордпрессе который без этого весьма тормозной.
Ответы: >>963218 >>963279 >>963442
Аноним 2017/03/29 19:12:14  №963204 432
>>962878

В твоем случае про текстовый файлы - 100% бред так как база данных сама хранит данные в файлы. Какой смысл пытаться дублировать то, что она делает, при этом делать это хуже? База данных например умеет кешировать результаты запросов в памяти, умеет кешировать прочитанные с диска данные в памяти, ты предлагаешь все это выбросить и использовать более медленный способ?
Аноним 2017/03/29 19:46:45  №963218 433
Ответы: >>964068
Аноним 2017/03/29 20:22:50  №963244 434
В каком случае писать йоба функции/методы со всякими необязательными параметрами задействовав которые можно сильно поменять возвращаемый результат? Вот как в нативном php много функций с такими паратреами. Вот здесь я захотел вернуть секцию со слимКонфигом и инициализировать им слимовское приложение, но на тот момент уже был написан метод getValue, который возвращает только конкретное значение. Создавать второй метод?
Ответы: >>963245 >>963255 >>963380
Аноним 2017/03/29 20:23:09  №963245 435
PJ95IDZpzmE.jpg (156, 1018x658)
658x1018
>>963244

Отцепился скрин.
Аноним 2017/03/29 20:43:32  №963255 436
>>963244
Начнем с того, что в пыхе нет перегрузки методов
Ответы: >>963258
Аноним 2017/03/29 20:46:30  №963258 437
>>963255
Я не про перегрузку. Ты меня не понял. Приведу пример. parse_ini_file("/path/to") - возвращает массив со всеми ключами-значениями. Но если мы добавим во второй необязательный параметр true - будут еще секции.
Ответы: >>963273 >>963277 >>963282
Аноним 2017/03/29 21:06:20  №963273 438
>>963258
Добавление необязательных параметров, которые слишком сильно меняют поведение метода это bad practice. В ядре пыхи подобные функции есть, но это не повод на них равняться, в пыхе много чего есть - наследие времен, когда php был юн и наивен.
Создавай метод с необязательными параметрами если:
1 - поведение метода остается очевидным и предсказуемым
2 - дополнительные параметры либо лишь уточняют поведение метода, либо меняют лишь способ достижения того же результата, либо каким-либо косметическим образом влияют на возвращаемое значения
3 - это необходимо для сохранения обратной совместимости при рефакторинге или изменении метода, если остальной код, который эту функцию вызывает отрефакторить не получается по каким-либо уважительным причинам
4 - когда этот необязательный параметр просто присваивает параметру значение по-умолчанию из множества возможных для этого параметра значений

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

В случае parse_ini_file необязательные параметры лишь декорируют результат и привносят в него дополнительные сведение, но контекстное поведение функции никак не меняется - это по прежнему парсинг ini файла.
Ответы: >>963280
Аноним 2017/03/29 21:10:04  №963277 439
>>963258
Думаю, в твоем случае поведение метода уже завязано на имени getValue, т.е. получить значение. Если при вызове getValue ты получаешь целую секцию, то это уже слишком большое изменение результата. Я ожидал конкретно значение из секции, а получил всю секцию. Лучше создай метод getSection.
Ответы: >>963280
Аноним 2017/03/29 21:12:13  №963279 440
>>963203
> Смотри, что выводится в HTML-коде, что пишется в логи Симфони и лог ошибок PHP.
Ну бля. Я вижу, что он не может подгрузить css, и все.
https://pastebin.com/3xkPYVQP
Ответы: >>963288 >>963380
Аноним 2017/03/29 21:13:03  №963280 441
Аноним 2017/03/29 21:14:00  №963282 442
>>963258
И еще один совет чисто по стилистике от меня. Если вызов функции без указания необязательного параметра, подразумевает, что этот параметр должен быть просто проигнорирован, то не присваивай ему false, а лучше присвой null. Т.к. "возможность" присвоить аргументу false, означает, что ему также можно присвоить и true, что будет странным, если наличие значение у аргумента при вызове не подразумевает bool значение.
Аноним 2017/03/29 21:24:45  №963288 443
>>963279
Вот это в хтмл идет
<link rel="stylesheet" href="/web/bootstrap/dist/css/bootstrap.css">
Аноним 2017/03/29 21:45:51  №963300 444
А все, я реально даунич. Еще и шаблон кривой был, вообще пиздец, целый день хуйней прострадал.
Аноним 2017/03/29 22:38:00  №963326 445
На сколько PHP5 в подлиннике актуальна? Какие главы изучать.
Ответы: >>963336
Аноним 2017/03/29 22:59:15  №963335 446
Не могу найти инфу по сути работы конструкции с if...else логического или какого-то там типа:
public function getImage()
{
return ($this->image) ? '/uploads/' . $this->image : '/no-image.png';
}

это ? аргумент : аргумент - или я хз, что-то такое было даже у ОПа в учебнике, помогите найти
Ответы: >>963338 >>964067
Аноним 2017/03/29 23:00:41  №963336 447
>>963326
Актуальна для РНР5, он-то остался на том уровне.
Это ещё долго будет актуально, хотя в 7 изменения были, конечно, но в процессе разберёшься.
Аноним 2017/03/29 23:08:22  №963338 448
>>963335
Ну допёр, вспомнил суть:
выражение ? действие1 : действие2;
Если выражение истинно, то действие1, если не истинно - действие2.
Аноним 2017/03/29 23:45:18  №963349 449
>>962219
>>962220

Вот это объяснил. Сохрани к себе на GitHub, пожалуйста, в пасты, супер полезная информация. Приступаю к работе.

>>962227
>А если программа-клиент?

Именно! Потихоньку пишу такую на (клиент: js + nwjs) <=> (сервер: rest api на php + mysql).

Конечно, ломать меня никто не будет, но тема зацепила, и из всех вариантов SRP тут подходит замечательно: бесплатно и можно реализовать своими силами (и черт возьми, как же интересна оказалась простая математика).

Алсо, иногда вижу в тредах про программирование "нахуй матан в пхп лол ты че нуб?". Абсолютный пиздеж, очень нужна в любом языке. Жалею, что в школе и в универе на матишу забивал болт, это блин чудо-наука.
Аноним 2017/03/30 00:18:51  №963357 450
Ответы: >>963364
Аноним 2017/03/30 00:32:02  №963364 451
>>963357
Судя по описанию, стандартная шарага, где учат на примитивном уровне как на видеокурсах с ютуба. Про трудоустройство ясно пиздеж, или в шараги какие устраивают с никакими перспективами (хотя после курсов с ютуба и так пойдет). Сертификаты пригодятся конечно, но вангую за них с тебя отдельно баблосы обдерут, т.е. ты эти сертификаты и без них так же получить можешь, записавшись и сдав экзамен помимо их шараги.
Аноним 2017/03/30 01:09:38  №963380 452
>>963244

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

В PHP есть ошибки проектирования и не стоит их повторять.

>>963279

Ты используешь assetic или нет?

Если нет то читай мануал

- http://symfony.com/doc/current/reference/twig_reference.html#asset
- http://symfony.com/doc/current/templating.html#linking-to-assets

И проверяй, все ли сделано как надо. Правильно ли указан путь к файлу, относительно нужной ли папки?

Если ты используешь assetic, то там 2 варианта:

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

Открывай мануал по assetic.

http://symfony.com/doc/current/assetic/asset_management.html

Сделал все, что там написано? Бандл добавил? Конфиг прописал?

Если не используешь assetic то стоит для начала научиться правильно функцию asset использовать.

assetic кстати как раз умеет отдавать или копировать файлы в нужные папки, если его настроить.

И надо читать документацию, а не повторять то, что делают в видеоуроках, особенно если там используется другая версия Симфони. Нужно понимать, что значит каждая строчка кода в твоем приложении, а не слепо их копировать откуда-то.
Аноним 2017/03/30 08:16:55  №963442 453
>>963203
Что-то еще больше вопросов стало. Есть серверное, а есть клиентское кэширование (http)?
В общем, как мне кэшировать страничку динамическую, если пользователь ввел данные на эту страницу и они обновились в бд и при перезагрузке ему нужно вывести эту же страницу только с новыми данными (а они берутся из старого кэша, а не из бд)? Как обновлять кэш при POST запросе? Для этого нужно использовать редис, nginx или memcashed?
Почитал англоязычный ресурс, там написано, что кэш удаляется при пост запросе, т.е. при удаленном кэше данные подргужаются из бд, а потом опять кэшируются? Я запутался. Нет ли где-нибудь ссылки на гитхаб с реализацией подобного кэширования дин. страницы? В докладе что-то про сокеты говорится, но разрабы с моей работы говорили, что создавать на каждое соединение по сокету при хайлоаде - не эффективно.
Ответы: >>964067
Аноним 2017/03/30 12:19:20  №963535 454
Снимок.JPG (83, 1176x842)
842x1176
Взялся за задание "Вектор", ебался 6 часов, не понял главного - как здесь использовать методы, у меня из-за них одни проблемы, почему не понаписать просто функций? Я поместил объекты(сотрудников) в массив, но методы не вызываются так как функции, им нужен объект или ещё нашёл такой способ Employees::CalculateTheSalary($employees); Где $employess - массив внутри которого объекты. Так на кой, черт, делать метод, когда лучше сделать функцию? Откройте мне глаза, зачем, нужны, методы? Может быть, возможно, что бы сократить сплошной текст и соотнести метод к определенному классу и что бы этим методом мог воспользоваться только объекты класса, но в моём случае нет объектов к которым я мог это применить, у меня, блядь, массив с объектами.
Так же я нахуярил методов в суперклассе, но вызывать мне их совсем не хочется, потому что, блядь, массив. Можно заюзать форич в теле программы, что бы по одному дёргать объекты из массива засовывать его в функции, отличное блядь, решение, но как оказалось я проебал ещё пол часа, что бы понять, что каждый раз вызывая метод - я стираю все переменные внутри, и мой блядь, счетчик зарплат обнулялся.

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

Ответы: >>963542 >>963544 >>964062
Аноним 2017/03/30 12:42:26  №963542 455
>>963535
Чем тебе методы не функции?
У тебя Employees и Department. По логике очень схожие сущности. Может ты хотел сделать Employee (один наемный рабочий), у которого свои свойства и методы, соответственно у Department будет свойство employees в котором будет массив экземпляров класса Employee.
Если у Employee будет метод ::getSalary(); то к примеру в Department может быть метод ::getTotalSalary() который бы обходил в цикле всех своих сотрудников и у каждого вызывал бы getSalary() и доплюсовывал в какой нибудь $total который бы потом этот метод возвращал
Ответы: >>963551
Аноним 2017/03/30 12:45:33  №963544 456
>>963535
И ещё вопрос, почему Employees наследуется от Department, по логике Department более узкое понятие, специфическое понятие, а Employees более широкое, если абстрагироваться от кода внутри них на скрине, то по логике Department должен наследоваться от Employees (К примеру: Политический митинг extends Группа людей)
Ответы: >>963547 >>963549 >>964063
Аноним 2017/03/30 12:49:40  №963547 457
>>963544
Зачем их вообще друг от друга наследовать? По логике это 2 вообще разные сущности с разными свойствами и функциями.
Аноним 2017/03/30 12:51:09  №963549 458
>>963544
Люди работают в департаменте, департамент более широкое понятие. В Департаменте создан массив куда будут помещаться объекты "сотрудников."
Аноним 2017/03/30 12:53:33  №963551 459
>>963542
>Если у Employee будет метод ::getSalary(); то к примеру в Department может быть метод ::getTotalSalary() который бы обходил в цикле всех своих сотрудников и у каждого вызывал бы getSalary() и доплюсовывал в какой нибудь $total который бы потом этот метод возвращал
Зачем вообще создавать два метода? Почему не одну функцию? Предлагаешь на любое действие -- создавать пару методов?
>getPage
>totalGetPage
>getCofe
>totalGetCofe
Ответы: >>963556 >>964063
Аноним 2017/03/30 13:01:12  №963556 460
>>963551
>Зачем вообще создавать два метода? Почему не одну функцию?
Потому что Employee это общее понятие, у тебя может быть "Архитектор" или "Уборщик", разные условия оплаты, значит у них метод подсчета зарплаты может отличаться.
>Предлагаешь на любое действие -- создавать пару методов?
Может оп лучше объяснит, каждый метод должен описывать какое-то целостное действие.
Ответы: >>963562 >>963653
Аноним 2017/03/30 13:11:14  №963562 461
Снимок.JPG (42, 932x382)
382x932
>>963556
> у тебя может быть "Архитектор" или "Уборщик", разные условия оплаты, значит у них метод подсчета зарплаты может отличаться.
В условиях задачи написано, что з/п может различаться только из-за ранга и статуса "начальник", что учтено в методе.
Аноним 2017/03/30 13:13:45  №963563 462
>>963562
Т.е вот эта конструкция $totalSalary=Employees::CalculateTheSalary($employees);
Является нормой?
Метод CalculateTheSalary считает зарплату каждого и возвращает $totalSalary.
Ответы: >>963565 >>964063 >>964067
Аноним 2017/03/30 13:17:19  №963565 463
>>963563
Вот тот switch не нужен, это должно быть внутри метода Employee - он должен вернуть уже посчитанный для конкретного employee конечную цифру зарплаты, Департамент вообще не должен знать о том, как считать зарплаты своим сотрудникам.
Ответы: >>963567
Аноним 2017/03/30 13:20:06  №963567 464
>>963565
>>963562
Если у тебя добавится ещё с десяток rank'ов сотрудников - у тебя свич станет головной болью, придется заводить константы потому что на каком то этапе ты перестанешь понимать кто такой rank = 1, а кто такой rank= 15
Ответы: >>963568 >>964062
Аноним 2017/03/30 13:23:14  №963568 465
Снимок.JPG (44, 815x404)
404x815
>>963567
Не понял в чём проблема свича? Либо он, либо тонна условий режущих глаза. Я так например блядь созданием сотрудников сделал, говнокод ебучий.
Аноним 2017/03/30 13:28:37  №963571 466
>>963568
А ты блядь подумай, какой нужен абстрактный класс, чтобы не было этих тонн условий, свитча и проблем с введением новых должностей.
Аноним 2017/03/30 13:29:33  №963572 467
>>963568
Проблема свитча тут в том, что ты делаешь комментарии для того, чтобы не перестать понимать свою хуйню, вместо того, чтобы завести какой-нибудь массив или словарь, в котором компактно будет описано, сколько и чего нужно создать. Это как минимум.

мимопроходил
Аноним 2017/03/30 13:33:22  №963573 468
>>963568
Вместо свича при подсчете - сделай в методе getSalary() у Employee подсчет конечной цифры зарплаты, которая бы больше никак не изменялась, она должна отражать зарплату работника всецело, департамент не должен ничего с ней делать, департамент вообще ничего не должен знать о её пересчете или подсчете. в итоге у тебя останется простенький цикл вида пикрелейтед
Ответы: >>963576
Аноним 2017/03/30 13:43:42  №963576 469
>>963573
Вот хоть убей, я не вижу способа в getSalary подсчитать зарплату без свича или условий. Поделись секретом, чего я не вижу.
Напоминаю работники в массиве $employees, у работника есть свойсва rank и baseSalary. Открой мне глаза.
Ответы: >>963578
Аноним 2017/03/30 13:44:38  №963578 470
>>963576
В нем делай как угодно, со свичами, с ифами, там ему место, а не в департаменте.
Ответы: >>963584
Аноним 2017/03/30 13:48:44  №963584 471
>>963578
...
Я думал ты пытаешься заставить меня убрать свич, что у тебя есть гениальное решение без условий.
...
В департаменте вообще ничего не считается, пока. Ты же видел скрин, я и зарплату по сотрудникам и тотал по зарплате посчитал в одном методе, метод этот принадлежит Empolyees, никакого отношения к депортаменту он не имеет. Ты хочешь разнести эти действия по разным методам...
Ответы: >>963590
Аноним 2017/03/30 13:53:30  №963590 472
>>963584
> https://2ch.hk/pr/src/958715/14908686745960.jpg
Employees в принципе существовать не должен, департамент состоять должен из массива в котором единицей является "1 работник", а не из массива "группа работников"
Аноним 2017/03/30 13:54:29  №963591 473
>>963590
>а не из массива "группа работников"
а не из масссива где единицей является "группа работников"
selffix
Ответы: >>963593
Аноним 2017/03/30 13:57:34  №963593 474
>>963590
>>963591
Я не понимаю, чего в итоге ты хочешь. Департамент ничего не считает.
В массиве в 1 ячейке лежит 1 работник, у которого есть поля, по полям можно понять к какой профессии он относится, хоть это и не важно.
Аноним 2017/03/30 14:40:01  №963608 475
blob (1, 277x168)
168x277
Придумал логотип для PHP и нарисовал его в программе Paint. Оцените
Аноним 2017/03/30 14:45:00  №963611 476
blob (2, 220x208)
208x220
>>963608
Логотип рядом с талисманом
Ответы: >>963882
Аноним 2017/03/30 14:48:02  №963613 477
Аноним 2017/03/30 14:48:30  №963614 478
Аноним 2017/03/30 15:46:22  №963653 479
>>963556
>Может оп лучше объяснит, каждый метод должен описывать какое-то целостное действие.
Он ещё говорил мне, что это нужно для удобства. Видишь класс Работник - вот тут все действия для работы с ним: нанять, уволить, посчитать зарплату, исходя из ранга и профессии - и т.п.
То есть у объекта Работник должны быть все методы работы с ним.
>>963562
>В условиях задачи написано, что з/п может различаться только из-за ранга и статуса "начальник", что учтено в методе.
Код должен быть гибким. Например, может понадобиться внести подсчёт выкуренных сигарет, выпитой воды, туалетной бумаги и т.п. бреда, который там и так был про кофе и страницы. Вот методы у суперкласса Работник должны позволять легко и компактно это всё вносить.

Мимо выше решал первую часть Вектора до антикризисных мер
Ответы: >>964062
Аноним 2017/03/30 15:47:46  №963654 480
Анон, это опять долбаебшкольник с этой программой про айфон(http://archive-ipq-co.narod.ru/l1/loops.html в самом конце). Я вообщем роде её решил, посмотрите пожалуйста, не сделал ли я полную хуйню. Если сделал-то поясните что не так. Спасибо. http://ideone.com/bQT7DS
Ответы: >>963657 >>963665 >>964062
Аноним 2017/03/30 15:50:27  №963657 481
>>963654
>роде
вроде
быстрофикс
Аноним 2017/03/30 15:50:48  №963658 482
>>963568
Говнокод тут в том плане, что ты мог сделать создание работников - методом класса Работник, у которого в аргументах стояло бы: профессия, количество работников, которых нужно создать, ранг, боссы или нет. И в этом методе уже был бы цикл for, который создавал экземпляры класса, при этом по профессии ещё наделял их кофе и страницами (для этого профессии должны быть классами, унаследованными от Работника).
Вот ещё тебе плюс в пользу использования методов.
Ответы: >>963673 >>964061
Аноним 2017/03/30 15:51:57  №963660 483
Аноним 2017/03/30 15:57:01  №963665 484
>>963654
Считает верно, но объясни вот это условие:
>if ($creditBalance < 4000)
Что оно означает, почему никак не привязано к имеющимся значениям?
Было выше такое решение у анона, это неверное решение в том плане, что поддержке не поддаётся: какие 4000 тысячи, что это за условие - не понять.
Ответы: >>963668
Аноним 2017/03/30 15:59:15  №963668 485
>>963665
ну смотри. изначально это должно было быть 5к, но тут еще добавляется 1к платы за месяц.
Ответы: >>963675 >>964061
Аноним 2017/03/30 16:10:18  №963673 486
>>963658
Да, но в данном случае и обозримом будущем параметр "профессия" не играет роли, так зачем плодить классы для деления работников на эти самые профессии?
Ответы: >>963674 >>964061
Аноним 2017/03/30 16:14:22  №963674 487
>>963673
Ну не обязательно создавать классы под профессии, действительно, однако метод для создания работника в классе Работник тогда просто должен содержать то, что ты наговнокодил, чтобы было чётко и понятно, чтобы всё делал этот метод, а не циклы громоздкие при создании.
Ответы: >>963678
Аноним 2017/03/30 16:17:36  №963675 488
>>963668
Ты сам не понимаешь, о чём говоришь.
Куда прибавляется тысяча, если у тебя if ($creditBalance < 4000)? Это тут без этой тысячи, но с процентами? С какой такой стати? Что это за условие вообще?
Также условие для работы цикла for непонятное и не универсальное - если меньше 20 месяцев. С какой такой стати? А если сумма кредита будет 80 тысяч, то там больше 20 месяцев будет выплачиваться - всё сломается.
Поэтому там лучше условие вот такое: если сумма кредита не ровна нулю.
Ответы: >>963678
Аноним 2017/03/30 16:19:52  №963678 489
>>963674
Вот уже понятнее, просто я сразу не дошёл до того, зачем нужны методы(и сейчас смутно представляю дальнейшие действия).
я вчера только статью про ООП прочитал.


>>963675
Этого поддержу, не могу въехать откуда эти 4 тысячи вылезли. А за условие в цикле не ругай, так ОП накодил.
Ответы: >>964061
Аноним 2017/03/30 17:25:03  №963714 490
code.png (9, 772x286)
286x772
Как указать диапазон в диапазоне ? То есть в mt rannd значения от 1 до 100, как указать промежуток, скажем, от 50 до 99 ?
Ответы: >>963724 >>963748 >>964060
Аноним 2017/03/30 17:43:59  №963724 491
>>963714
задать в b 50 и в a 99.
Аноним 2017/03/30 18:18:03  №963737 492
Я один не могу разобраться с пространствами имен?
Ответы: >>963743 >>963748 >>963789
Аноним 2017/03/30 18:26:15  №963742 493
Делаю файлообменник и встал вопрос с контейнером. Короче делаю такой то контейнер
$container = $app->getContainer();
$container['twig'] = function(){
$loader = new \Twig_Loader_Filesystem('../app/Templates/');
$twig = new Twig_Environment($loader);
return $twig;
};
И все работает, проблема в том, что с таким подходом не работает автодополнение кода для объектов в контейнере. Его можно как-то подрубить туда?
Ответы: >>963748 >>964060
Аноним 2017/03/30 18:26:37  №963743 494
Аноним 2017/03/30 18:41:36  №963748 495
>>963737
По неймспейсам есть хороший мануал: http://php.net/manual/en/language.namespaces.php

>>963714
if ($x > 50 && $x < 99) { ...

>>963742
Обычно делают так:
/ @var Twig_Environment $twig */
$twig = $container['twig'];

>>963068
Признайся, что у тебя просто низкая квалификация и ты пришёл сюда поныть. Среди одногруппников 4 человека пишут код за деньги, двое из них как раз на C#.


Ответы: >>963781 >>964230 >>964230
Аноним 2017/03/30 18:52:20  №963753 496
blob (1, 135x129)
129x135
Аноним 2017/03/30 19:45:45  №963781 497
>>963748
>/ @var Twig_Environment $twig */
Идея понятна, только я не понял где мне это писать. Прямо в этом методе?
>$twig = $container['twig'];

public function index(\Slim\Http\Request $request, \Slim\Http\Response $response, $args)
{
$template = $this->container->get('twig')->load('index.html.php');
echo $template->render();
return $response;
}
Ответы: >>964060
Аноним 2017/03/30 20:01:44  №963789 498
Аноним 2017/03/30 20:49:48  №963831 499
>>963068
PHP не виноват, что ты просто дно. Если после нескольких лет кодинга на джаве и шарпе ты не можешь себе доширак обеспечить, то мкарьера офис-менеджера ждет тебя.
Аноним 2017/03/30 21:49:14  №963882 500
Аноним 2017/03/30 22:07:26  №963897 501
>>962219
Оказалось, что PHP на моем компьютере не поддерживает целые числа больше 2147483647. Поэтому при вычислении $v = pow(2, $x) % $N получаю 0 или число 2 ^ n , что есть абсурд, ибо как я понял, оно должно получаться довольно длинным. Эпик фэйл. Придется использовать библиотеки, позволяющие работать с большими числами?
Ответы: >>963954 >>964060
Аноним 2017/03/30 23:54:08  №963954 502
Ответы: >>963963
Аноним 2017/03/31 00:12:04  №963963 503
>>963954
Ого! Продолжаю тогда. Нужно научиться лучше гуглить.
Ответы: >>963969
Аноним 2017/03/31 00:21:15  №963969 504
Аноним 2017/03/31 09:22:19  №964052 505
Няши, подскажите простой фреймворк для реализации REST API?
Ответы: >>964078
Аноним 2017/03/31 09:46:26  №964059 506
Напомню, что проверено в старом треде:

- DOM который построил Джек, 5: проверено тут http://arhivach.org/thread/245785/#956739
- https://github.com/never3ver/fileshare - проверено 19 марта: http://arhivach.org/thread/245785/#956732

Далее, на доброчане в /s/ в PHP треде ( dobrochan.org/s/res/23225.xhtml ) я проверил некоторые другие задачи, почитайте ответы к ним:

>>958664 задача с регулярками и телефонным номером, от 22 марта
- студенты https://github.com/sylenien/students-exercise/tree/master
- блог https://github.com/honeydev/s-blog/
- p-sch 19/03/17 >>956914 - вопрос по обработке исключений
- https://github.com/grigoryMovchan/auth/
- https://bitbucket.org/learning_acc/discounts/
- https://github.com/kubk/students
- https://github.com/greenTea242/MinesweeperMVC

Зайдите, посмотрите.

Ну и как всегда, если кого-то из предыдущего треда пропустил, напомните о себе.
Аноним 2017/03/31 09:47:40  №964060 507
>>963897
>>963742

А ты первый раз что ли с криптографией работаешь? Встроенные в PHP типы данных не годятся:

- int - только до 2 млрд (больше на 64-битных системах, но все равно недостаточно)
- float - не гарантирует точность больше 8-16 знаков после запятой

Потому нужно использовать специальные расширения для точной работы с большими числами:

- http://php.net/manual/ru/book.bc.php
- http://php.net/manual/ru/book.gmp.php

>>963781

@var позволяет указать тип переменной и пишется на предыдущей строке, до переменной. Но недостаток тут в том, что тип надо будет указывать каждый раз, как ты берешь что-то из контейнера. Решения проблемы - описать именно сервисы в самом контейнере:

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

public function getTwig() { return $this->container['twig']; }

Перед методом мы пишем phpdoc @return SomeClass и теперь IDE будет распознавать тип значения при вызове $x = $container->getSomething();

Это максимально совместимо с разными IDE, но требует создания лишнего класса.

2) Использовать плагин для IDE, который умеет читать конфиги конкретного DI контейнера. Применимо к фреймворкам вроде Симфони, где сервисы описываются в конфигах.

Для Pimple есть дампер + плагин для PhpStorm: http://stackoverflow.com/questions/6395737/how-do-i-make-my-php-ide-understand-dependency-injection-containers/6418373#6418373

3) Pimple позволяет получать сервисы, как будто бы они хранятся в полях класса:

$pimple->twig

мы можем унаследовать от Pimple пустой класс и описать типы сервисов в нем с помощью аннотации @property: http://stackoverflow.com/questions/6395737/how-do-i-make-my-php-ide-understand-dependency-injection-containers/6418373#6418373

4) Можно создать специальный файл с описанием сервисов и их типов только для PhpStorm: https://confluence.jetbrains.com/display/PhpStorm/PhpStorm+Advanced+Metadata

В общем, это все описано тут (англ): http://stackoverflow.com/questions/6395737/how-do-i-make-my-php-ide-understand-dependency-injection-containers

Аннотации вида @var или @return или @property - это стандарт phpDoc, советую с ним ознакомиться.

В твоем примере кода подсказку @var можно поставить только на переменную $template.

>>963714

Можно объединять несколько условий с помощью && (И) или || (ИЛИ) или !(НЕ). Не забывай ставить скобки в сложных случаях:

if ($x > 100 && $x < 200 && ($a > 1 || $b > 1 || !($x < 150)))
Ответы: >>964117 >>964573
ООО Вектор Аноним 2017/03/31 09:48:22  №964061 508
>>963678

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

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

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

То есть подумай, какие действия ты хочешь делать с объектом и какие методы понадобятся.

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

> А за условие в цикле не ругай, так ОП накодил.
Можно поменять, если не нравится.

>>963673

Разные классы нужны, если одно и то же действие для разных профессий делается по-разному. Ну например, подсчет зарплаты идет по разным формулам для инженера и для менеджера (например у менеджера зарплата зависит от опыта, а у инженера от ранга). Вообще, варианта тут два:

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

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

>>963668

Ты не учел проценты, там еще проценты есть, не только комиссия. И что если мы поменяем сумму комиссии или месячную выплату - твое число 4000 тоже само поменяется?

>>963658

Тогда метод логично сделать статическим. Или вообще отдельной функцией. Ибо неправильно создавать одного Работника, только чтобы он создал еще нескольких.
Вектор, наследование Аноним 2017/03/31 09:49:19  №964062 509
>>963654

Слишком сложно. Лучше так:

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

«Платим» здесь значит уменьшаем долг и увеличиваем общую сумму выплаченного.

>>963653

> То есть у объекта Работник должны быть все методы работы с ним.

В этом и идея ООП, что вместе собраны данные (поля) и методы для выполнения действий с ними. Ну условно говоря, представь себе например класс Лифт. "текущий этаж", "открыты ли двери" - это состояние , а "поехать на N-й этаж", "открыть двери" - это методы, меняющие состояние лифта.

Было бы неправильно сделать например класс Лифт только со свойствами, а действия выше в виде отдельных функций.

>>963590

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

>>963568

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

$employees = createEmployees(тип, кол-во, ранг);
$employees = array_merge($employees, createEmployees(тип, кол-во, ранг));
...

Можно сделать описание в массиве вида

[
[кол-во, профессия, ранг],
[кол-во, профессия, ранг],
...
]

А можно сделать массив вида ['3ме1', '2ин3'] и функцию, которая его разберет и создаст нужные объекты.

>>963567

Это да, но пока их там 3, а не 15, можно не заморачиваться.

>>963535

Ты бы код дал ссылкой, а не скриншотом, как его читать?

По коду:

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

Также, при наследовании мы должны соблюдать совместимость. Мы всегда можем передать объект класса B в код, который рассчитан на объект класса A, и этот код должен работать корректно (принцип замещения Барбары Лисков). В примере выше, если у нас есть функция, которая считает сумму налога на Организацию, в эту функцию можно передать Банк и она должна работать правильно. Так как Банк это разновидность Организации.

В твоем случае "Работники" - это не разновидность Департамента. Наследование применено неверно.

Важно понять этот принцип, а не наследовать все от всего.

Классы называются в единственном числе, не Employees, а EmployeeGroup. Но я бы советовал так не делать, а делать 1 объект = 1 сотрудник, иначе трудно будет например повысить ранг только одному человеку в группе - надо будет переразбивать группу, сложно.

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

Если у тебя у ГруппыРаботников есть метод вроде посчитатьСуммарнуюЗарплату(), то ему не надо ничего передавать - ведь в объекте и так есть информация об этих работниках. Обычно метод предназначен для выполнения каких-то действий с объектом, с его полями.

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

В этом и идея ООП, что в объекте вместе собраны данные (поля) и методы для выполнения действий с ними. Ну условно говоря, представь себе например класс Лифт. "текущий этаж", "открыты ли двери" - это состояние , а "поехать на N-й этаж", "посчитать высоту", "открыть двери" - это методы, работающие с состоянием лифта.

Было бы неправильно сделать например класс Лифт только со свойствами, а действия выше в виде отдельных функций.

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

> Я поместил объекты(сотрудников) в массив, но методы не вызываются так как функции, им нужен объект
Да, потому что метод - это часть объекта. Ты же не можешь прочитать поле объекта, не имея самого объекта.

> Откройте мне глаза, зачем, нужны, методы?
Чтобы сразу было видно, какой метод к какому объекту относится. В случае с функциями, это не понять, особенно если программа большая и у тебя тысячи функций, они просто свалены в кучу. А в ООП все методы аккуратно разложены по разным классам. Каждый класс имеет свою зону отвественности и решает свою задачу.

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

----

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

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

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

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

----

> но в моём случае нет объектов к которым я мог это применить, у меня, блядь, массив с объектами.
Это значит, что ты не смог пока придумать решение задачи, соответствующее идеям ООП, и разбить код на отдельные классы, а пытаешься по старой привычке писать все вперемешку.

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

И посмотри, ниже я дал ссылки на статьи с описанием видов отношений между классами.
Ответы: >>965428 >>965844
Аноним 2017/03/31 09:50:05  №964063 510
>>963544

Неверно, прочитай мои примеры выше. Департамент это не группа работников, Департамент нанимает Работников, тут между классами отношение делегирования: https://ru.wikipedia.org/wiki/%D0%90%D0%B3%D1%80%D0%B5%D0%B3%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)

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

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

- http://www.intuit.ru/studies/courses/1007/229/lecture/5956?page=3
- https://habrahabr.ru/post/150041/
- https://metanit.com/sharp/patterns/1.2.php


>>963551

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

И эти 2 метода он предлагает сделать в разных классах.

>>963562

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

Копипасту в switch стоит убрать, лучше там задавать только коэффициент.

>>963563

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

Ты пытаешься писать код не в ООП-стиле, а как обычный процедурный код из отдельных функций.

А ты решал предыдущие задачи на ООП, про тесты и вопросы и тд?
Ответы: >>964165
Аноним 2017/03/31 09:55:45  №964067 511
>>963563

Также, если хочешь лучше разобраться в ООП, предлагаю (только после решения Вектора) глянуть эту задачку посложнее : http://www.cyberforum.ru/php-oop/thread1459985.html

(решения при желании гуглятся, так что не гугли).

И еще эту статью советую тоже: https://habrahabr.ru/post/153225/

>>963442

> Есть серверное, а есть клиентское кэширование (http)?
Да. У браузера есть кеш, когда ты переходишь с одной страницы сайта на другую, браузер может не скачивать повторно CSS-файл, а взять из кеша. Или взять из кеша и спросить сервер, не изменился ли он за это время? Управляется это кеширование HTTP заголовками, которые отдает сервер.

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

- https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching?hl=ru
- http://html5.by/blog/cache/
- https://ruhighload.com/post/%D0%9A%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5+%D1%81%D1%82%D0%B0%D1%82%D0%B8%D0%BA%D0%B8+%D0%B8+cache-control
- https://webo.in/articles/habrahabr/104-client-side-caching-basics/

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

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

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

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

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

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

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

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

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

> Для этого нужно использовать редис, nginx или memcashed?
Ты все смешал вместе. Редис - это хранилище, нгинкс - это веб-сервер. Хотя их можно использовать вместе.

> Почитал англоязычный ресурс, там написано, что кэш удаляется при пост запросе,
Бред. Это наверно какой-то частный случай, то есть на каком-то одном сайте сделано так, что при POST запросе удаляется какой-то элемент кеша. Это не рецепт, который подходит всем.

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



>>963335

Тернарный оператор
https://github.com/Si0n/fileshare-project Аноним 2017/03/31 09:56:16  №964068 512
>>963218

В README хорошо бы кратко еще написать, как развернуть проект (залить дамп в БД, прописать пароли в конфиге, запустить композер и тд)

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

Лог тоже в гитигнор.

https://github.com/Si0n/fileshare-project/blob/master/config/config-dist.php
тут стоит добавить комментарий, что это образец конфига, и что с ним делать.

> "dir" => "/var/www/fileshare.home/files"
Это неудобно, лучше сделать автоматическое определение текущей папки.

> 'driver' => 'mysql',
Хорошо бы в конфиге писать только те настройки, что пользователь может поменять. Ведь если мы тут пропишем другой тип БД, все перестанет работать, так как твои запросы написаны под mysql?

https://github.com/Si0n/fileshare-project/blob/master/system/bootstrap.php#L8
> require_once '../controller/file.controller.php';
> require_once '../controller/home.controller.php';
настрой автозагрузку по PSR-4 через композер, у меня есть урок на гитхабе https://github.com/codedokode/pasta/blob/master/php/autoload.md

https://github.com/Si0n/fileshare-project/blob/master/system/dir.php
Имя и папку с файлом надо привести в соответствие с PSR-4

И зачем там final? Есть какие-то веские причины почему тут запрещено наследование?

https://github.com/Si0n/fileshare-project/blob/master/system/dependencies.php#L26
> $container['App\Controller\File'] = function ($c) use ($app) {
По умолчанию контейнер при повторном обращении не создает новый экземпляр класса, а возвращает старый. Для контроллера это нелогично, так как удобнее, когда один контроллер обрабатывает один запрос и выкидывается, а не используется для обработки нескольких запросов. Лучше сделать, чтобы каждый раз создавался новый.

> (str_ireplace('index.php', '', $container['request']->getUri()->getBasePath())
Это коряво. А что, если папка называется index.php? Удалить имя файла из пути удобнее через dirname().

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

https://github.com/Si0n/fileshare-project/blob/master/system/controller.php#L10
> var $app;
Что это за устаревший синтаксис из PHP4? Ты по учебнику какого года учился?

https://github.com/Si0n/fileshare-project/blob/master/system/controller.php#L19
> public function __get($var) {
Я не советую тут использовать магию, так как при опечатке в имени свойства ошибка не будет замечена. Также непонятно почему это публичный метод. В задачи контроллера входит предоставлять другим классам сервисы? Я думал, это задача контейнера.

> public function setModel($model) {
Непонимание MVC. Между контроллерами и моделями нет соответствия один-к-одному. Плюс твой метод подразумевает, что одному контроллеру можно давать разные модели, и он в любом случае будет корректно работать. Не думаю , что у тебя это так.

> abstract public function index($request, $response, $args);
Название неудачное, лучше handleRequest(). И тайп-хинты проставить.

> use App\Local\File as LocalFile;
Этого лучше избегать, синонимы запутывают чтение кода, человек не робот, чтобы в уме их преобразовывать в имена классов.

https://github.com/Si0n/fileshare-project/blob/master/controller/file.controller.php
Имя файла не соответствует PSR-4.

https://github.com/Si0n/fileshare-project/blob/master/public/index.php#L2
> ini_set('display_errors', 1);
Это логичнее в php.ini задавать, или ты и на продакшене собрался показывать всем ошибки?

> require '../vendor/autoload.php';
> require '../config/config.php';
Это логично перенести в бутстрап.

> $capsule = new Illuminate\Database\Capsule\Manager;
И это тоже.

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

$ php cli/upload.php /tmp/file.txt
http://example.com/file/123456

Можно добавить опции, например

$ php cli/upload.php --comment="Комментарий к файлу" /tmp/file.txt

Для разбора опций есть функция getopt.

https://github.com/Si0n/fileshare-project/blob/master/public/css/style.css#L77
> input[type=file] {
Это неправильный стиль, он на всем сайте скроет поля выбора файла, а надо только в одном конкретном месте.

https://github.com/Si0n/fileshare-project/blob/master/sql/install.sql#L3
А где таблица юзеров?

> `filename` VARCHAR(155) NOT NULL,
> `path` VARCHAR(255) NOT NULL,
Зачем путь к файлу в 2 частях хранить?

> `status` TINYINT(1)
тут бы ENUM подошел лучше

https://github.com/Si0n/fileshare-project/blob/master/system/controller.php#L11
> protected $table;
Очень странное поле, и непонятно зачем оно тут.

> protected $html;
То же самое.

https://github.com/Si0n/fileshare-project/blob/master/system/router.php#L4
> $this->{'App\Controller\Home'}-
Как-то странно смотрится. Тут лучше либо синтаксис массива использовать, либо дать сервису другое имя.

> $uploaded_files = $this->{'App\Controller\File'}->upload($request);
Это неправильное использование контроллера. Контроллер это не сервис, чтобы его так можно было вызывать. Контроллер обычно получает на вход запрос и выдет на выходе HTTP ответ, например HTML страницу.

> $app->get('/files/{file_id}', function ($request, $response, $args) use ($app) {
> //Need to check file owner
> $this->{'App\Controller\File'}->files($request, $args);
тут почему-то не используется $response

Также, обрати внимание, Слим позволяет указывать в качестве обработчика сервис-контроллер: https://www.slimframework.com/docs/objects/router.html#container-resolution и тебе не надо писать анонимные функции.

> "document" => ["title" => "Home page",
> "styles" => ["/css/bootstrap.min.css", "/css/style.css"]]
Зачем эти многоэтажные массивы? Лучше либо отдельные переменные, либо объект с полями и методами. Ну и передавать одни и те же стили для каждой страницы не очень удобно, может стоит как-то их по умолчанию задать?

Кстати, добавлять скрипты к странице (а также переопределять title) можно через наследование шаблонов в твиге, если оставить в head зону для их добавления.

> "upload" => "/upload"
Неудачное название, трудно понять, что это? URL для формы? Тогда лучше его там же и прописать либо получать какой-нибудь функцией.

https://github.com/Si0n/fileshare-project/blob/master/controller/file.controller.php
Код отсюда надо будет вынести в сервис загрузки файлов, иначе ты не сможешь сделать задачу про cli скрипты. перечитай на всякий случай мой урок по MVC: https://github.com/codedokode/pasta/blob/master/arch/mvc.md

Обрати внимание:

> Весь функционал приложения содержится в модели. Контроллер и вью предоставляют лишь возможность пользователю взаимодействовать с моделью и отображать данные из нее. К примеру, если мы делаем сайт объявлений, с такими функциями, как "добавить объявление", "удалить объявление", "найти объявления по критериям", то для каждого действия где-то в модели должна быть функция, которую можно вызвать. Если выкинуть все контроллеры и вью, то мы все равно можем добавлять объявления, вызывая методы модели.

https://github.com/Si0n/fileshare-project/blob/master/model/file.model.php
> public function setFile(FileController $file) {
Здесь что-то очень неправильное. Контроллер это не модель, чтобы хранить информацию о файле и иметь методы вроде getDescription(). У контроллера могут быть только методы вроде handleRequest(). А методы вроде getDescription() должны быть как раз у модели. Перечитай урок по MVC.

https://github.com/Si0n/fileshare-project/blob/master/controller/file.controller.php#L33
> $file_model = new FileModel();
> foreach ($files as $file) {
> $local_file = $this->uploadFile($file);
тут непонимание, как работает ORM. Модель представляет информацию об одном файле, одну модель нелогично использовать для загрузки нескольких разных файлов.

Почитай про active record https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md

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

https://github.com/Si0n/fileshare-project/blob/master/view/layout.twig#L6
> maximum-scale=1.0, minimum-scale=1.0">
Зачем так делать? Ты издеваешься над пользователями что ли?

Вместо include body.twig удобнее использовать наследование шаблонов, когда страница наследуется от лейаута.
Ответы: >>964074 >>964504
Аноним 2017/03/31 09:56:49  №964069 513
>>962325

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

компания = создать Компанию;
департамент = создать Департамент;
компания->добавитьДепартамент(депармамент);
сотрудник = создать Сотрудника();
депарматент->добавитьСотрудника(сотрудник);

И так далее.

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

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

И там еще есть один момент. В твоем варианте, чтобы добавить новую профессию, надо править существующий код. В моем - просто добавить новый класс, не трогая старый код. Гибче. А у тебя нало программу в нескольких местах править (свитч как минимум). А представь, когда она огромная, и надо еще эти места все найти.

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

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

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

> Ну, тогда можно ведь в конструктор добавить $this->experience = $experience;, а в аргументах поставить по умолчанию $experience = false, чтобы уже имеющииеся работники у нас создавались нормально? Горожу что-то непонятное, конечно.

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

Вот у тебя например зарплата Инженера хранится не в его классе, а в Департаменте. Тут конечно есть своя логика (компания ведь назначает зарплату), но может быть удобнее было бы это хранить именно в классе Инженера.

> class Manager extends Employee {
> public $rank = 1;
> public $boss = false;
Это писать не надо, при наследовании все свойства наследуются из родительского класса.

>>962275

Вырезаешь (mb_substr) первую букву из строки, делаешь заглавной, вырезаешь остаток строки со второй буквы, приклеиваешь к первой букве.

>>960493

> нельзя делать апдейт поверх данных,
Если речь о добавлении, переименовании таблиц и колонок, то можно. Если изменение типа колонки - то надо чтобы при конвертации ничего не потерялось. Но вообще БД по максимуму пытается сохранить данные. Более подробно можно почитать в мануале на англ: https://dev.mysql.com/doc/refman/5.7/en/alter-table.html

Или там постгрес? Самостоятельно тогда найти мануал постгрес по ALTER TABLE, он есть и на англ, и в хорошем переводе.

> Я ещё предполагал, что есть некоторая договоренность между программистами делать для каждой таблицы колонку с id.
На практие они почти везде нужны, так как например для удаления или обновления надо указать, какую именно запись мы хотим обновить. Но первичный ключ можно делать и составным.
Аноним 2017/03/31 09:57:29  №964070 514
>>960533

> for ($credit=40000; $credit>0; $credit=($credit$persent+$service)-$payment)
Слишком много кода в шапке цикла, тяжело читать, надо перенести формулу в тело.

> if ($credit+$service<5000)
Не учтен процент

> $credit=($credit+($credit0.03+1000));
Формула повторяется второй раз.

>>960603

Тут формула повторяется 3 раза, попробуй избавиться от повторов.

>>960747
>>960862

Вообще у меня есть урок по теме https://gist.github.com/codedokode/772a4ccc03e41d6b7cba

>>960928

А погуглить? "js carousel"

>>961000

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

Так там есть условно говоря 2 зарплаты:

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

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

>>961014

Ну вот в итоге так и сделано, как я и хотел. Только в switch надо добавить default на случай, если мы ошиблись и поставили неправильный ранг, чтобы прервать программу.

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

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

Но главное тут не производительность, а то, что нам надо будет автоматически при изменении ранга как-то пересчитвать и зарплату, если она хранится в свойстве. замучаешься это писать.
Ответы: >>964270
Аноним 2017/03/31 09:58:04  №964071 515
>>961064

> $regexp = '/ + /u';
Тут можно обойтись без дублирования пробелов, например так: {2,}

> //проверяем, чтобы первый символ был не пробелом{
Тут может trim() проще использовать?

> $other = mb_substr($text, $second);
> $first = mb_strtoupper($first);
> $text = $first . $other;
Это можно записать в одну строку без лишних переменных.

Так в общем верно, но закомментированиые куски кода стоит убрать.

>>961149

Доктрина использует прокси-классы для ленивой загрузки. Ну допустим у тебя в классе Тест есть поле Автор. По идее, когда ты загружаешь из БД один Тест, доктрина должна загрузить и создать объект Автора. Если у Автора есть другие связи, она и их должна заполнить. Так мы скоро придем к тому, что надо половину базы данных в память загрузить.

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

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

Вместо реального Автора доктрина вставляет объект-прокси. У этого объектавсе поля пустые, кроме id, и при вызове любого метода, кроме getId() (например getName()), сначала запускается загрузка данных из базы, эти данные загружаются в поля объекта, и только после этого вызывается исходный метод. И таким образом, получается "ленивая" загрузка, прозрачно для твоего кода.

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

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

Аналогично прокси-классы делаются и для коллекций.

Я еще напомню, что Доктрина это Data Mapper - она пытается создавать видимость, что все твои классы находятся в памяти и скрывает факт, что на самом деле данные загружаются и объект создаются по мере надобности. И что она не требует твои классы знать о ней и о базе данных - ты можешь вообще убрать БД, создавать объекты руками и твой код с ними будет так же работать, как с загруженными из БД.

Для полей еще надо прописывать nullable=true/false. Если есть значения по умолчани, их надо прописать тоже.

https://github.com/TheSidSpears/TestHub/blob/master/web/config.php
Вот кстати это стоит ли оставлять?

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

>>961306

> Если я использую Pimple и PSR-4 могу я загрузить этот класс через них?
Да, если ты ставил доктрину через композер, то скорее всего ее автозагрузчик уже подключен где-то в vendor/autoload.php, а код в статье для тех, кто хочет подключить его вручную.

Сама по себе программа управления миграциями сделана как набор команд с использованием Symfony Console, потому надо настроить компонент Symfony Console Application (который скорее всего устанавливается вместе с доктриной).

То есть ты создаешь файл, например cli/migration.php, и в нем подключаешь свой бутстрап, настраиваешь Symfony Console Application, добавляешь в него классы-команды доктрины, настраиваешь доступ доктрине к БД. И когда все настроено, запускаешь этот Symfony Console Application, он анализирует командную строку и парамтеры и вызывает нужную команду.

В общем, я советую глянуть на описание Symfony Console, это библиотечка для создания консольных команд: http://symfony.com/doc/current/components/console.html

Там есть такой код:

> $application = new Application();
> // ... register commands
> $application->run();
Вот его и надо поместить в твой файл.

Не перепутай компонент Symfony Console (который не зависит от фреймворка Симфони) и бандл FrameworkBundle, который является частью Симфони.

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

> $container['Migrations'] = function () {
> return new Migrations();
Это не нужно делать, я думаю.

Также, вполне возможно что эти команды миграции уже подключены в скрипт доктрины bin/doctrine и можно просто вызывать его, возможно, что нет. Можно проверить, запустив bin/doctrine и выведя список доступных команд.

> -configuration это опция чего? Через doctrine:migrations -configuration ошибка о несуществующей команде.
Это опция, указываемая, при вызове какой-либо из команд миграции. Если ты изучишь Symfony Console, то увидишь что там есть опции для вывода списка доступных команд, а также вывод списка опций для любой команды.

> Class 'DOMDocument' not found
наверно расширение dom не установлено для PHP.
Ответы: >>965168
Аноним 2017/03/31 09:58:46  №964072 516
>>961474

Все правильно

>>961478

Сделай stat /opt/lampp/... и посмотри владельцев и права доступа. Затем сделай id и посмотри свой id пользователя. Учти что веб-сервер как правило работает от отдельного пользователя вроде www-data.

>>961553

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

По поводу задачи про лайки - это строго говоря случай наследования таблиц, и тут есть 3 паттерна, которые легко гуглятся:

Concrete Table Inheritable
Class Table Inheritance
Single Table Inheritance

Вот из них и стоит выбирать.

Идея с entity_type/entity_id - на мой взгляд плохая, так как не позволяет ставить внешние ключи. Хотя тоже в каких-то случаях имеет право на жизнь.

> с использованием таблицы 'всё_что_можно_лайкнуть'

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

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

> все лайкабельные сущности в одну таблицу:
Ну вот это как раз получилось применение паттерна Single TI к таблицам лайков.

> - Для каждой новой сущности нужно добавлять новый столбец в таблице likes, нужно не забыть добавить уникальный ключ.
Это как раз не проблема, проблема в том что можно по ошибке один лайк отнести к 2 сущностям. В БД вроде Postgres от этого можно защититься, добавив на таблицу ограничение CHECK:

ALTE TABLE ADD CONSTRAINT only_one_reference CHECK (like_to_user IS NOT NULL) + (like_to_photo IS NOT NULL) + ... = 1

- https://postgrespro.ru/docs/postgrespro/9.5/sql-createtable
- https://en.wikipedia.org/wiki/Check_constraint

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

>>961558
>>961591

Внешние ключи не поставить, плохо.

>>961633

А это уже применение паттерна Concrete TI

>>962112

Их удаляют кроном раз в полчаса по дате модификации обычно. Можешь конечно попробовать не сохранять пустые сессии, в PHP можно сделать свой обработчик сессий, но может лучше использовать нормальное хранилище вроде БД?
Ответы: >>966596
Аноним 2017/03/31 10:10:14  №964074 517
>>964068
>А где таблица юзеров?
Я только начал, мне просто было нужно знать по архитектуре, чтобы меньше исправлять на последних этапах
Аноним 2017/03/31 10:31:43  №964078 518
Аноним 2017/03/31 10:32:22  №964079 519
Ответы: >>965675
Аноним 2017/03/31 12:12:01  №964117 520
>>964060
Спасибо, понял насчет контейнера. Наверное остановлюсь на первом, так выглядит проще всего. Не пойму только одного, я вот загуглил PSR-11 - так вот, раз он ест и в фреймворках реализован, почему разработчики IDE не сделают эти фишки автоматическими? Ну что бы они понимали интерфейс и без лишней мороки дополняли код.
Ответы: >>964139
Аноним 2017/03/31 12:52:16  №964139 521
>>964117

PSR-11 не предлагает способа для описания самих сервисов, он только определяет интерфейс для контейнера (с 2 методами get и ha).

Ответы: >>964148
Аноним 2017/03/31 13:05:12  №964148 522
>>964139
Ну так а почему бы не дополнить его по принципу как я описал? Алсо, собираюсь тогда уже сделать обертку для контейнера с методами типа getTwig(), как его следует назвать? ContainerWrapper сойдет?
Ответы: >>964341
Аноним 2017/03/31 13:29:57  №964165 523
>>964063
>А ты решал предыдущие задачи на ООП, про тесты и вопросы и тд?
Одну решил, во второй там с уловиями проблемы, пришлось скипнуть меня уже отругали, сразу взялся на вектор, в итоге убил 8 часов, но задачу не решил.

Спасибо ОП. На выходных добью вектор.
Ответы: >>964283
Аноним 2017/03/31 14:42:02  №964230 524
Аноним 2017/03/31 15:16:37  №964270 525
>>964070
Доработал цикл, с учётом твоих замечаний, и сделал задачку по подсчету кредита в нескольких банках. ОП или просто шарящий анон, посмотрите решение и дайте советов мудрых. Спасибо.
http://ideone.com/4iXPBW
Ответы: >>964314 >>964328 >>965675
Аноним 2017/03/31 15:34:34  №964283 526
>>964165
Все даже новички решают первую задачу про тесты, затем вторую, а ты как этот...
Какое у тебя будет понимание после этого?
Аноним 2017/03/31 16:19:02  №964314 527
>>964270
Как обычно забыл прикрепить условие.
Ответы: >>964315
Аноним 2017/03/31 16:19:35  №964315 528
>>964314
Да, еб твою мать
archive-ipq-co.narod.ru/l1/functions.html
Аноним 2017/03/31 16:34:18  №964328 529
>>964270
$creditSum=39999; //сумма кредита
$payment=5000; //ежемесячная выплата
$mon=0; // кол-во месяцев (по умолчанию - 0)
$homoCreditDownPayment=0; //первый взнос в HomоCredit
$softBankDownPayment=0; //первый взнос в SoftBank
$strawberryBankDownPayment=7777; //первый взнос в StrawberryBank
$homoCreditPersent=1.04; //процент в HomоCredit
$softBankPersent=1.03; //процент в SoftBank
$strawberryBankPersent=1.02; //процент в StrawBerry bank
$homoCreditService=500; // плата за сервис в HomoCredit
$softBankService=1000; // плата за сервис в SoftBank
$strawberryBankService=0; // плата за сервис в StrawberryBank
//Пиздец. Я - индус.
$homoCreditTotal=countCredit($creditSum, $homoCreditPersent, $homoCreditService, $payment, $homoCreditDownPayment, $mon, $bankName="HomoCredit");
$softBankTotal=countCredit($creditSum, $softBankPersent, $softBankService, $payment, $softBankDownPayment, $mon, $bankName="SoftBank");
$strawBankTotal=countCredit($creditSum, $strawberryBankPersent, $strawberryBankService, $payment, $strawberryBankDownPayment, $mon, $bankName="StrawbrerryBank");
I LOLED
Короче, суть скобок у функций, в которые передаются аргументы, в том, чтобы вот так не инициализировать разные переменные - достаточно прямо в скобках у функции на месте заявленных при создании самой функции элементов указать значения.
НЕ
>$homoCreditTotal=countCredit($creditSum, $homoCreditPersent, $homoCreditService, $payment, $homoCreditDownPayment, $mon, $bankName="HomoCredit");
А
>$homoCreditTotal=countCredit($creditSum, 1.03, 500, $payment, 0, $mon, $bankName="HomoCredit");
Тогда инициализировать ничего не придётся, городить лишнего.
А так всё верно у тебя считает.
Ответы: >>964329 >>964339 >>964341
Аноним 2017/03/31 16:35:57  №964329 530
>>964328
>$bankName="HomoCredit"
*просто "HomoCredit"
Те, которые повторяются, можно ставить переменными, а индивидуальные значения лучше прямо значениями и вставлять.
Аноним 2017/03/31 16:38:28  №964331 531
код.png (27, 785x510)
510x785
Туплю походу, сделал как сказали, в итоге выводит только результат в случае если число в диапазоне 50-60, а в остальных пишет просто успешно. Что не так ?
Ответы: >>964337 >>964341 >>965675
Аноним 2017/03/31 16:45:25  №964337 532
>>964331
У тебя d=1, а в mt_rand написано b.
Ответы: >>964390
Аноним 2017/03/31 16:47:14  №964339 533
>>964328
Блядь, а я ведь сначала так и делал, как ты говоришь, но потом меня что-то понесло. Спасибо, анон.
Аноним 2017/03/31 16:52:26  №964341 534