«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Клуб изучающих PHP и webdev #92 Аноним 2017/07/28 20:27:19  №1033564 1
14995976883300.png (33, 500x500)
500x500
14995976883311.jpg (157, 1024x683)
683x1024
14995976883322.jpg (194, 1024x768)
768x1024
14995976883333.png (3449, 1920x1080)
1080x1920
Аноним 2017/07/28 21:09:35  №1033594 2
Ответы: >>1033942
Аноним 2017/07/28 21:15:17  №1033599 3
>>1033100
>Также, у тебя в коде SQL инъекция, нельзя вставлять данные прямо в запрос

Так норм?

$escaped = pg_escape_string($data);
$query = "INSERT INTO searches (data) VALUES ('{$escaped}') RETURNING id";
Ответы: >>1033907
Аноним 2017/07/29 15:54:15  №1033907 4
Аноним 2017/07/29 16:47:48  №1033942 5
>>1033594
Проценты же можно было бы не считать самому же, а в переменную $percent ввести сам процент и посчитать типа как $creditBalance*$percent/100 же.
Ответы: >>1033947
Аноним 2017/07/29 17:09:28  №1033947 6
>>1033942
А можно ли как-то передавать аргумент по умолчанию напрямую?
Вот например print_r(rateBank(1.02, 0, 7777));
Как можно запихнуть туда 7777 третьим параметром, не передавая 0 вторым?
Ответы: >>1033952 >>1034527
Аноним 2017/07/29 17:19:58  №1033952 7
>>1033947
Нет.
Только, если ты переставишь третий параметр на второе место.
Ответы: >>1033965
Аноним 2017/07/29 17:32:33  №1033965 8
>>1033952
Жаль.
Из-за этого можно внезапно обосраться, если по ошибке передать значение параметра.
Ответы: >>1033966 >>1034016
Аноним 2017/07/29 17:35:05  №1033966 9
>>1033965
Ты можешь передавать в функцию JSON в качестве единственного параметра, а уже внутри функции разбирать JSON на массив и проверять, существует ли пара ключ => значение в массиве. Всегда так делаю.
Ответы: >>1033969 >>1034016 >>1034046
Аноним 2017/07/29 17:39:51  №1033969 10
>>1033966

Что мешает вместо JSON сразу передать массив?
Ответы: >>1033970
Аноним 2017/07/29 17:40:56  №1033970 11
Аноним 2017/07/29 18:51:38  №1034016 12
>>1033966
Наркоман.
>>1033965
Просто на этапе преэктирования все необязательные параметры ставь в конце и давай им дефолтное значение.
Ответы: >>1034020
Аноним 2017/07/29 18:57:50  №1034020 13
>>1034016
>Наркоман
Ваше мнение очень важно для нас. Как думаешь, что будет читабельнее?

function givePassport($name, $surname, $lastname, $age, $city, $region, $country, $birth)

или

function givePassport($data)

?
Ответы: >>1034031 >>1034031
Аноним 2017/07/29 19:08:41  №1034031 14
>>1034020
Ебанат, он задачку из оп-поста решает какой нахуй JSON.

>>1034020
>function givePassport($data)
Лiл.

Будет читабельнее
public function getPassword() : string

Ответы: >>1034036
Аноним 2017/07/29 19:12:47  №1034034 15
Есть ли для PHP аналоги js'овского Babel, чтобы писать на нормальном языке и не блевать от каждой строки, а он бы потом переводил все это в PHP код?
Ответы: >>1034038
Аноним 2017/07/29 19:14:39  №1034036 16
>>1034031
Ты пытаешься съехать с темы, школяр. Вопрос был конкретно о том, как передать в функцию третий параметр, не передавая второй. Я ответил, что можно передать JSON. Либо, как подметил анон, массивом. А ты полез меня оскорблять зачем-то. В принципе, не удивительно. В последнее время неадекватных детей на Дваче всё больше. Спасибо,
Абу!
Аноним 2017/07/29 19:15:21  №1034038 17
>>1034034
Ебу я как-то твою мамашу в рот, а через 9 месяцев появился ты.
Ответы: >>1034046
Аноним 2017/07/29 19:22:45  №1034046 18
>>1034038

Прекращайте.

>>1033966

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

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

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

Потому, если в примере ниже данные о пользователе используются много где, лучше будет сделать объект Пользователь и передавать его.
Аноним 2017/07/29 21:25:12  №1034123 19
Я правильно понимаю, что https://github.com/nikic/PHP-Parser умеет только парсить код в AST и модифицировать его, но не исполнять? То есть если я хочу получить вычисляемое в коде значение, то этот пакет мне не подойдёт. Есть небольшая идея как улучшить отчёт функции assert, сейчас она всегда false возвращает, что неудобно. Было бы круто, если бы она ещё выводила значения переменных, которые использовались в условии assert'а.
Ответы: >>1034131
Аноним 2017/07/29 21:38:34  №1034131 20
>>1034123

Да, чтобы выполнить код, нужно AST преобразовать в строку с кодом и сделать eval.
Ответы: >>1034294
Аноним 2017/07/29 21:48:55  №1034135 21
Аноны, а ОП из предыдущего треда (если этот создал не он) пропал куда-то что ли?
Ответы: >>1034137 >>1034140 >>1034142
Аноним 2017/07/29 21:50:48  №1034137 22
>>1034135

Оп предыдущего треда сидит пока в предыдущем треде.
Аноним 2017/07/29 21:51:46  №1034140 23
>>1034135
Да, он куда-то пропал и не перекатывал тред, из-за чего он ушел в бамплимит и тот тред теперь трудно найти.
Поэтому я сделал перекат за него.
Ответы: >>1034142
Аноним 2017/07/29 21:59:47  №1034142 24
>>1034135
Он занятой человек и работает много похоже, уже давно не сидит каждый день в тредах. Я вообще удивляюсь как он до сих пор спустя 4-5 лет умудряется заходить и стараться каждому нуфагу дать ответы вываливая большущие такие посты.

>>1034140
Он сам перекатит когда всем там ответит, нуфаг сука. Тут и по 1000 постов треды были и ничего, наоборот хорошо когда он утоплен, в нем нет словестного поноса по 200 постов в день.
Ответы: >>1034150
Аноним 2017/07/29 22:10:53  №1034150 25
>>1034142
>Он сам перекатит когда всем там ответит, нуфаг сука
Почему бы ему отвечать на старые вопросы там, а новые пусть будут скапливаться здесь? Часто в тред люди заходят с напрямую /pr, особенно впервые.
>в нем нет словестного поноса по 200 постов в день
Наоборот же хорошо, может на вопросы будут отвечать и другие люди. Иначе тред какой-то полумертвый получается.
Аноним 2017/07/30 10:06:34  №1034294 26
>>1034131
Понял. В таком случае при eval значения всех суперглобальных переменных вроде $_GET и $_POST будут утеряны? Так же как и аргументы командной строки...
На случай, если из моего предыдущего сообщения не очень понятны мои мотивы: я хочу, чтобы зафейлившийся assert выдавал подробную информацию о переменных, участвовавших в условии assert'а. Например:
$a = 10;
$b = 25;
Custom\assert($a >= $b); // должно вывалиться исключение с сообщением "Expected ($a >= $b), $a is 10, $b is 25".
Тут преимущества, что assert'ы выглядят естественно, не нужны эти бесконечные assertCountEquals/assertGreaterThanOrEqual. Мне кажется, что такие assert'ы - изначально путь неправильный.
Ответы: >>1034483
Аноним 2017/07/30 17:55:57  №1034443 27
Что ньюфагу почитать про алгоритмы и структуры?
Чтобы знать как сортировочку написать, там про графы, деревья почитать.
Кормена?
Ответы: >>1034527
Аноним 2017/07/30 18:43:17  №1034483 28
>>1034294

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

eval не меняет суперглобальные переменные или аргументы командной строки.

Насчет того, хорошая ли у тебя идея, не знаю.
Ответы: >>1034527
Аноним 2017/07/30 19:36:39  №1034527 29
>>1033947
Можно в Питоне (Keyword Arguments), в PHP нельзя. Тут https://wiki.php.net/rfc/named_params что-то пытались реализовать, но сейчас всё глухо.

>>1034443
Кормен для новичка не подойдёт, ты бы хоть отзывы почитал (не на этом сайте). Гораздо доступнее учебник: http://aliev.me/runestone/

>>1034483
Без исполнения кода я смогу только фразу "Expected ($a >= $b)" вывести, а хотелось бы включить ещё и значения переменных $a и $b.
eval плохой, когда туда суют пользовательский ввод.
Я сам понимаю, что подводных камней огромное количество и написать такую штуку будет непросто.
Ответы: >>1040045 >>1040050
Аноним 2017/07/30 21:43:32  №1034588 30
Прошу прощения, но шапка, перенесенная на пастебин нечитабельна
Ответы: >>1034678
Аноним 2017/07/30 23:36:53  №1034668 31
мой котик все еще одиноко возглавляет эти треды. ._.
Аноним 2017/07/30 23:53:39  №1034678 32
>>1034588
Хорошо, куда ее перенести?
Вернуть как раньше или на гитхаб?
Ответы: >>1034705
Аноним 2017/07/31 00:56:20  №1034705 33
>>1034678
На гитхаб было бы просто идеально. Особенно если разметить как следует, с заголовками, с картиночками.
Ответы: >>1034714
Аноним 2017/07/31 01:28:30  №1034714 34
>>1034705
Лучше всего сделать шапку как и было раньше, постом, чтобы не надо было ходить не по каким ссылкам.
Аноним 2017/07/31 13:02:23  №1034810 35
Клуб анонимных геев здесь?
Ответы: >>1034813 >>1034823
Аноним 2017/07/31 13:11:47  №1034813 36
Аноним 2017/07/31 13:31:09  №1034823 37
>>1034810
сгинь, безработный студент
Аноним 2017/07/31 16:20:11  №1034925 38
Ответы: >>1035041 >>1035838
Аноним 2017/07/31 20:02:18  №1035041 39
>>1034925
Нафиг не нужна, тебе же раз 5 сказали в обоих тредах, что по ссылкам никто ходить не будет. Шапка в ОП-посте придаёт треду ламповость, а ты всё портишь, прекращай.
Аноним 2017/07/31 20:52:50  №1035065 40
Должен признаться, что я пхпшник и я гей.
Аноним 2017/07/31 22:45:56  №1035171 41
Кстати очень годные задачи есть на кодеварс, там именно по программированию, а не по вебмакакингу
Ответы: >>1035335 >>1035338
Аноним 2017/08/01 04:54:44  №1035335 42
>>1035171
Да там годные только для совсем совсем ньюфагов разьве что.
Аноним 2017/08/01 06:22:23  №1035338 43
>>1035171
Это какие же? Игру написать, или сеть? По бигдате что-то высчитать? Когда говорят о чем-то крутом, я себе представляю сразу актуальные нерешенные задачи. Или программирование - это пердолиться с тем что уже решено 20 лет назад френкенштейня новый велосипед, под предлогом того что это развивает тебя и без БАЗЫ НИКУДА И НИКАК?
Ответы: >>1035347
Аноним 2017/08/01 08:03:46  №1035347 44
>>1035338
А что в бигдате сложного то? Вообще никогда этого не понимал. Вся сложность в том, что нужно щепетильно оптимизировать, чтобы сократить время перелопачивания бигдаты. Ну и знать буквально 2 приёма которые сокращают время выполнения обхода на 22%. Хотя я почти с дивана говорю, я только 4 терабайта лопатил. Может в больших масштабах всё сложнее?
Аноним 2017/08/01 09:38:42  №1035361 45
Аноний, подскажи годный курс-вспоминалку PHP+SQL+JS.
Скоро дипломный экз в специалисте, а я уже нихера не помню, так как работа связана совершенно с другим.
(Ну и доступный, так как смотрю на foreach и нихуища не понимаю)
Ответы: >>1035365
Аноним 2017/08/01 09:44:42  №1035365 46
>>1035361
Перепройди курс специалиста, делов то.
Ответы: >>1035388
Аноним 2017/08/01 11:34:39  №1035388 47
>>1035365
Ну сколько воды льёт Борисов в уши, я бы лучше PHP The Right Way использовал и почитал бы эпизодически Котерова или подобное. А видеокурсы это долго и неэффективно, когда во второй и более раз.
Ответы: >>1035936
Аноним 2017/08/01 15:26:29  №1035482 48
Анончики, помогите пожалуйста. Сделал задачку с циклами, где нужно показать таблицу умножение от 1 до 9. Не получается перенести строчку множителей вместе с произведением.

http://ideone.com/F3qKIr
Ответы: >>1035498 >>1035506
Аноним 2017/08/01 15:58:58  №1035498 49
>>1035482
Там всякие символы перевода каретки и прочая ересь, не слышал?
\n
Ответы: >>1035505
Аноним 2017/08/01 16:07:14  №1035505 50
Untitled.png (14, 781x537)
537x781
>>1035498
Если бы это было так легко сделать, я бы сюда не писал, верно?
Аноним 2017/08/01 16:09:14  №1035506 51
>>1035482
>нужно показать таблицу умножение от 1 до 9. Не получается перенести строчку множителей вместе с произведением.
Эх, я сам когда-то таким был, на держи нормальную версию таблицы умножения http://ideone.com/9MobUt
Ответы: >>1035507
Аноним 2017/08/01 16:11:53  №1035507 52
>>1035506
Благодарствую, анон про \r я не знал
Ответы: >>1035509
Аноним 2017/08/01 16:13:09  №1035509 53
>>1035507
С \n на самом деле тоже работает, просто ты его не туда ставишь.
Ответы: >>1035510
Аноним 2017/08/01 16:14:21  №1035510 54
>>1035509
Нужно было в начало ставить? в чём различие между \r и \n?
Ответы: >>1035515 >>1035930
Аноним 2017/08/01 16:22:27  №1035515 55
>>1035510
>Нужно было в начало ставить?
Сам подумай. Спецсимвол разбивает строку ровно в том месте, где ты его поставил.
>в чём различие между \r и \n?
Дела дней давно минувших. Изначально, \r возврат каретки - это переход в начало строки, без перехода на новую строку, а \nперевод строки - переход на новую строку без постановки курсора в начало строки.
Сейчас разницы нет, и то, и то переведет в начало следующей строки.
Ответы: >>1035615
Аноним 2017/08/01 18:40:28  №1035615 56
>>1035515
cпасибо за пояснение
Аноним 2017/08/02 00:38:09  №1035838 57
>>1034925
спасибо! Лично мне удобно зафоркать к себе в профиль определенный гайд и следовать ему. Все равно гитхаб часто открыт у меня. Это удобнее, чем метаться между тредами фронт-энда и пхп. Добавил шапку в гитхабе и на двачи не заходишь
Аноним 2017/08/02 09:13:51  №1035930 58
>>1035510
С \r и \n интересная история. \r по задумке переводит курсор в начало строки, а \n - на следующую строку. В принтерах это использовалось (и до сих пор работает) для печати одних символов поверх других, например подчеркивания поверх буквы.

В тестовых файлах раньше Маки использовали \r для обозначения конца строки, а линуксы/юниксы - \n. Когда делали ДОС, для совместимости решили там обозначать конец строки как \r\n, и это перекочевало в Windows (например, блокнот исопльзует такой формат). Маки давно уже перешли на \n, так что теперь осталось только 2 варианта - либо \n, либо \r\n. IDE обычно позволяют выбирать вид конца строки, рекомендация PSR рекомендует использовать \n.

\r в консоли переводит курсор в начале строки, что позволяет обновлять информацию, перепечатывя ту же строку заново. Например, для вывода бегущей шкалы прогресса.
Ответы: >>1035937
Аноним 2017/08/02 09:24:46  №1035936 59
Аноним 2017/08/02 09:27:46  №1035937 60
>>1035930
> Когда делали ДОС, для совместимости решили там обозначать конец строки как \r\n
Было джва, получилось три, как обычно в таких случаях. Кстати, раз ты такой умный, то может знаешь, что такое вертикальная табуляция (\v)? Я сейчас читаю один любопытный документ (ISO/IEC 14977 ENBF), там встречается описание этого символа. Что такое горизонтальная табуляция - понятно, а что такое вертикальная? И что такое форм фид (\f) заодно?
Ответы: >>1035938 >>1035939 >>1035967
Аноним 2017/08/02 09:28:27  №1035938 61
Аноним 2017/08/02 09:29:36  №1035939 62
>>1035937
Символ вертикальной табуляции(\v) переводит курсор на следующую позицию вертикальной табуляции, и вывод текста продолжается с этой позиции.
Он указывает число строк, которые должны быть пропущены на странице перед началом печати очередной порции данных.
Этот символ влияет только на печать документов. Он не влияет на вывод текста на экран.
мимокрест
Аноним 2017/08/02 10:41:42  №1035967 63
>>1035937
В принтере form feed вызывает переход на новую страницу: https://en.wikipedia.org/wiki/Page_break

Про табы история тут: https://en.wikipedia.org/wiki/Tab_key - исторически в принтерах позиции табуляции задавались механически и горизонтальный/вертикальный таб перемещал печатающую головку к следующей позиции. Использовалось для печати данных в формах.

Ну и про другие управляющие символы тут:

https://en.wikipedia.org/wiki/Control_character
https://en.wikipedia.org/wiki/C0_and_C1_control_codes

Подавляющее большинство из них сегодня не используется.

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

Или другой пример: кодировка ASCII - принята аж в 1963 году, опять же не только для компьютеров, которые тогда только появлялись, а вообще для передачи данных по проводам ( https://en.wikipedia.org/wiki/ASCII ).
Ответы: >>1035973
Аноним 2017/08/02 10:46:54  №1035973 64
>>1035967
Интересно, а по 3d принтерам тоже всякого понапридумывают?
Аноним 2017/08/02 11:00:30  №1035982 65
А норм книги для новичков есть? Что там за хуита на пастебине? Ещё и с анимевасяносайтом.
Ответы: >>1036001 >>1036007 >>1036024
Аноним 2017/08/02 11:27:48  №1036001 66
>>1035982
>Что там за хуита на пастебине? Ещё и с анимевасяносайтом.
Вам нужно проследовать обратно в /b. Вы похоже заблудились.
Аноним 2017/08/02 11:49:40  №1036007 67
>>1035982
Ты предложи книги, может быть кто-то их уже читал. Вот там выше есть отзыв на "пхп 7 в подлиннике" например >>1033797

Аноним 2017/08/02 12:25:15  №1036024 68
>>1035982
>Что там за хуита на пастебине?
Вот новая шапка на гитхабе
https://github.com/phpguron/php_thead/wiki
>с анимевасяносайтом
Вполне себе годный сайт с уроками.
Аноним 2017/08/02 13:25:11  №1036054 69
Почему у этого треда PHP ассоциируется с котиками и причем тут Аниме тян?
Ответы: >>1036056
Аноним 2017/08/02 13:28:20  №1036056 70
>>1036054
Скрытая пропаганда руби
Аноним 2017/08/02 15:49:53  №1036119 71
Посоны, а по html тоже можно здесь спросить? А то я треда подходящего не нашел
Ответы: >>1036201 >>1036494
Аноним 2017/08/02 17:59:26  №1036201 72
Аноним 2017/08/03 01:34:58  №1036494 73
>>1036119
Можно, веб-разработка же
Аноним 2017/08/03 01:37:36  №1036501 74
>>1033564 (OP)
Существует ли аналог Джавы Раш для пхп?
Аноним 2017/08/03 03:04:29  №1036525 75
http://www.zendexam.com/

Нет ли такого же по 7-му рнр?
Если нет онлайн, где бы спиратить тестовый тест?

Есть несколько приложений на ведроиде, но они дико бесят рекламой, выскакивающей прямо поверх обучения.
Ответы: >>1037565
Аноним 2017/08/03 10:11:49  №1036616 76
Считается ли нормальной практикой изменение файлов RBAC в Yii2 если меня к примеру не устраивает предоставленный функционал и мне нужно его расширить мне нужны мини-админки для каждого родительского аккаунта, и чтобы он мог создавать роли для дочерних аккаунтов и назначить эти роли своим дочерним аккаунтам, в стандартной комплектации названия ролей теоретически могут конфликтовать? Или нужно пилить отдельный модуль и подключать так же как подключен стандартный?
Ответы: >>1036623 >>1036689
Аноним 2017/08/03 10:27:25  №1036623 77
>>1036616
Ну очевидно же, что тогда ты не сможешь обновлять стандартную библиотеку
Ответы: >>1036636
Аноним 2017/08/03 10:42:15  №1036636 78
>>1036623
Ну по факту, её обновления мне будут и не нужны, так как я её всё равно изменю
Аноним 2017/08/03 12:23:37  №1036689 79
>>1036616

Ни в коем случае не меняйте ничего в сторонних библиотеках. Причины:

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

А что тебе мешает сделать изменения средствами, предусмотренными фреймворком? Если ты не в силах разобраться, передай задачу тому, кто может.
Ответы: >>1036711
Аноним 2017/08/03 13:21:10  №1036711 80
>>1036689
>А что тебе мешает сделать изменения средствами, предусмотренными фреймворком? Если ты не в силах разобраться, передай задачу тому, кто может
При чем тут не в силах разобраться, разобраться можно с чем угодно. Я вот и спрашиваю - нормальный ли вариант взять за основу стандартный модуль RBAC и сделать отдельный модуль изменив то, что мне нужно
Ответы: >>1036714
Аноним 2017/08/03 13:24:49  №1036714 81
>>1036711
Абсолютно нормально.
Аноним 2017/08/03 14:57:05  №1036780 82
анон, помоги.
Необходимо изучить фреймворк yii. но каких-то хороших уроков или мануалов найти не могу. а для работы требуется его знание. А я по своей глупости сам в нем разобраться не могу.
Знаешь ли что по этой теме и с чего начать?
(студент, знаю ооп, html, php и тд на базовом уровне, ибо лентяй да и соответствующей практики не было)
Ответы: >>1036786
Аноним 2017/08/03 15:01:06  №1036786 83
>>1036780
Документация на офф.сайте?
Ответы: >>1036790
Аноним 2017/08/03 15:05:54  №1036790 84
>>1036786
теория.
мне б понять на практике.
там был пример создания их блога, но на 3 пункте при создании выходила ошибка, решить которую я не смог(гугл не помог)
Ответы: >>1036793
Аноним 2017/08/03 15:10:38  №1036793 85
>>1036790
http://www.yiiframework.com/doc/blog/ ?
ну а чем не практика? ты хочешь туториал, который гарантировано исключит любые твои же ошибки? как это?
Ответы: >>1036796
Аноним 2017/08/03 15:18:20  №1036796 86
>>1036793
http://www.yiiframework.com/doc/blog/1.1/ru/prototype.auth

вот на этой странице идет настройка Аутентификации. Выполнив все что здесь написано, решил проверить. захожу на сайт. пытаюсь войти. он выдает ошибку, что пароль неверен. Как я понял, он захэшировал пароль в БД, но не хэширует пароль проверяемый с тем, что в БД. Как происходит сравнение паролей не понимаю (да тупой и там на сайте буквально все расписано, но я даун.)
Ответы: >>1036820
Аноним 2017/08/03 15:47:20  №1036820 87
>>1036796
ну и начинай отлаживать, ты же "знаешь php"
Ответы: >>1036835
Аноним 2017/08/03 16:01:02  №1036835 88
>>1036820
значит пойду переучивать все с начала самого, и воспользуюсь гайдом с шапки. чувствую себя днищем
Аноним 2017/08/03 17:39:55  №1037002 89
Есть ли в PHP не просто ссылки, а вложенные ссылки? Что-то вроде переменного количества звёзд с Сях.
Ответы: >>1038177
Аноним 2017/08/03 18:46:27  №1037064 90
Хуй знает сюда ли надо писать
Есть сервак-файлопомойка, на него я заливаю картиночки, выдает прямую ссылку на них. Так вот, втентакле никак не хочет распознавать картинку с ссылки (т.е. скопипастил линк в сообщение, обычно картинка прикрепляется автоматически, а тут нихуя). В чем может быть проблема?
Ответы: >>1037066 >>1037094
Аноним 2017/08/03 18:54:19  №1037066 91
Аноним 2017/08/03 19:36:51  №1037094 92
Аноним 2017/08/04 02:55:32  №1037486 93
Не пострадает ли мой PhP от того, что вместе с ним я начну повторять C ? Mrmrmrmrmr
Ответы: >>1037497 >>1038177
Аноним 2017/08/04 02:58:12  №1037488 94
Блять тут жеHTMLсинтаксис или [strong]как[/strong] это [em]называется[/em]
Аноним 2017/08/04 03:17:29  №1037497 95
Ответы: >>1037510
Аноним 2017/08/04 03:40:16  №1037510 96
>>1037497
Спасибо за совет анон, а то Кернигана половину прошел.
Аноним 2017/08/04 09:06:13  №1037565 97
IMG20170804042439.jpeg (439, 1040x780)
780x1040
Аноним 2017/08/04 11:24:52  №1037634 98
Помогите советом или еще чем.
нужно написать курсач по php. Но не знаю какую тему выбрать. ничего придумать не могу. Нужно что-то интересное
Ответы: >>1037680 >>1037686
Аноним 2017/08/04 12:13:00  №1037669 99
Как готовится к собеседованию на мидла?
С джуном всё ясно, там всегда стандартный набор и похожие задачи.
А на мидлов всегда всё по разному, не понятно...
Ответы: >>1038177
Аноним 2017/08/04 12:51:42  №1037680 100
>>1037634
Способы ускорения выполнения программ на РНР
Аноним 2017/08/04 13:02:31  №1037686 101
>>1037634
блог - самое банальное
если знаешь про long polling, то сделай лобби для онлайн игры. типа, чтобы всё как в вк без обновления
Аноним 2017/08/04 14:33:48  №1037758 102
123.JPG (46, 822x238)
238x822
gghg.JPG (18, 554x183)
183x554
Подскажите, застрял на первой задачке про вклад в банке. Если считать по 10% на 10 т.р каждый год то понятно, но если начисление идёт на вклад и на проценты от вклада за предыдущие года то как написать эту формулу? До меня это никак не доходит. И как потом посчитать количество лет до 1 миллиона? count() не считает мб из за того что числа выводятся слитно... [email protected] моё фейкомыло, если не хотите палить ответ в треде.
Аноним 2017/08/04 14:37:53  №1037764 103
>>1037758
if ( Locale::getDefault() == 'ru-RU' ) {
exit('Произошла инфляция, валюта вклада обесценилась, пенсии отменены, вы проиграли');
}
Ответы: >>1037775
Аноним 2017/08/04 14:48:08  №1037775 104
>>1037764
спасибо помог, прям как оп завещал
Аноним 2017/08/04 15:17:05  №1037789 105
>>1037758

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

Вот тут написано как увеличить число на N% https://otvet.mail.ru/question/24786316

Аноним 2017/08/04 17:15:16  №1037905 106
как.PNG (41, 729x495)
495x729
пук.PNG (27, 809x623)
623x809
пись.PNG (7, 790x87)
87x790
Я где-то наебался или нет?
Мимохуй
Ответы: >>1037942 >>1040042
Аноним 2017/08/04 17:59:04  №1037942 107
>>1037905
Ты в последнем месяце платишь дважды.
Ответы: >>1038178
Аноним 2017/08/04 19:48:13  №1038034 108
Петухач, как в пхп можно сделать дамп всей бд или отдельных таблиц, как это сделано в phpmyadmin или в миграциях симфони и ларавел? Наверняка же есть простой метод в пару строк.
Ответы: >>1038177
Аноним 2017/08/04 20:42:43  №1038063 109
нид халп. дали задание сделать А/Б тестинг плагин для вордпресса. Дали кучу параметров типа conbersional rate (типа сколько пользователей зашло и откуда и сколько вернулось и купило продукт). Посоны, я в глаза этот А-Б тестинг не видел, как эти параметры высчитывать-та???
Ответы: >>1040042
Аноним 2017/08/04 22:25:14  №1038131 110
Господа помогите пожалуйста. Мне нужно, чтобы value чекбокса содержало value инпута. Как это можно воплотить в жизнь. Через форму не получилось, пытался сделать переменную инпута равной переменной чекбокса и тоже ничего не вышло.

Как то вот так пытался: $order = $amount1; где order это чекбокс, а amount1 это инпут.

<div class="input-group">
<span class="input-group-addon">
<input type="checkbox" class="form" name="order">
</span>
<input type="text" class="form-control" name="amount1">
</div><!-- /input-group -->
Так же пытался вводить в value(чекбокса) пхп код содержащий переменную инпута(тоесть с name инпута) и всё равно ничего, уже все перепробовал и никак.

Опишу даже суть идеи, чтобы было прям вот понятно, что я хочу сделать. Вообщем есть сайт-магазин с мелким оптом. Товар 1 вида но разных цветов поэтому делать корзину ну я считаю незачем. На нем вообщем фотки с цветами и подписан id цвета и внизу есть чекбокс и инпут, в котором по задумке клиент должен вводить количество товара. Далее когда клиент выставит чекбоксы на нужных товарах, а так же выставит количество он доходит до формы оформления и всё это отправляется в базу sql.
Ответы: >>1038546 >>1040042
Аноним 2017/08/04 23:56:15  №1038177 111
>>1038034
Миграции и дампы - вещи разные. Миграции описывают изменения структуры таблиц во времени, дампы содержат ещё и данные в этих таблицах. Если в миграциях происходит наполнение таблиц данными (видел такое), то автор неправильно использует миграции.

> Наверняка же есть простой метод
Да, mysqldump

>>1037486
Будет особенно полезно, если реализуешь хотя бы простые структуры данных на Си (связанные списки, стек, очереди, деревья).

>>1037002
В PHP вообще нет указателей, а указателей на указатели - подавно. Указатель - это переменная, содержащая информацию о том, где в памяти размещён какой-то объект.

>>1037669
А смысл готовиться? Рассказывай о интересных проектах, в которых участвовал, приведи профиль на GitHub'е в порядок. Мидлов не просят сортировки на листочке писать. Да и толковых джунов тоже, если с ними есть о чём говорить.
мимо-джун-прошедший-много-собесов
Аноним 2017/08/04 23:56:50  №1038178 112
15018561165041.png (42, 809x623)
623x809
>>1037942
Действительно. Надо было вот так, видимо
Спасибо
Аноним 2017/08/05 00:01:27  №1038185 113
>>1038177
>Указатель - это переменная, содержащая информацию о том, где в памяти размещён какой-то объект.
Но ведь любая переменная фактически ссылается на какой-то участок памяти, в котором расположен объект. Ну, в питоне так, по крайней мере, в пхп тоже, вроде.
Ответы: >>1038188
Аноним 2017/08/05 00:04:51  №1038188 114
>>1038185
Пиздец я хуйню написал. Забудьте
Аноним 2017/08/05 12:54:26  №1038407 115
Анон, как в пехапе преобразовать структуру типа mysite/mamka.php в mysite/somefolder/mamka/14 ? Во всех нормальных фреймворках это искаропки, а делать такие пути я еще не научился.
Ответы: >>1038413
Аноним 2017/08/05 13:04:52  №1038413 116
Ответы: >>1040419
Аноним 2017/08/05 16:40:04  №1038546 117
m1i8wdh-jeg.jpg (99, 848x900)
900x848
>>1038131
зачем вообще обрабатывать этот чекбокс на сервере, если покупатель ввёл количество товара нужного цвета?
Ответы: >>1038628
Аноним 2017/08/05 18:38:12  №1038628 118
>>1038546
потому что я вот так решил и теперь не понимаю, как это сделать(ну я вроде понимаю но чет нихуя не выходит совершенно)
Аноним 2017/08/05 20:01:43  №1038689 119
>>1038177
>А смысл готовиться? Рассказывай о интересных проектах, в которых участвовал, приведи профиль на GitHub'е в порядок. Мидлов не просят сортировки на листочке писать. Да и толковых джунов тоже, если с ними есть о чём говорить.
>мимо-джун-прошедший-много-собесов

А вот нет, просят написать какой нибудь запрос, спроектировать структуру проекта и много вопросов по паттернам всяким, олимпиадные задачки попадаются, вопросы по CS.
Для джунов я паттерн собеседований понял, а вот мидлов/суньёров нет.
К тому же, у меня например сейчас считай пустой github, так как моей конторе это не интересно, а свободного времени на реализацию чего-то что можно показать нет.
Ответы: >>1038841
Аноним 2017/08/05 22:59:13  №1038785 120
какие преимущества можно получить, храня сессии в БД, а не в файлах?
Ответы: >>1038790 >>1040042
Аноним 2017/08/05 23:16:20  №1038790 121
>>1038785
Нормальную архитектуру.
Ответы: >>1038794
Аноним 2017/08/05 23:21:53  №1038794 122
>>1038790
нене, конкретику давай, в чём плюс?

доступ к файлам быстрее работает, например.
Ответы: >>1038799 >>1040042
Аноним 2017/08/05 23:42:56  №1038799 123
>>1038794
> нене, конкретику давай, в чём плюс?
Отобразить список залогиненных на сайте пользователей со всей инфой. Гомогенный подход. Для начала тебе пойдет.
Ответы: >>1039833
Аноним 2017/08/06 00:07:48  №1038807 124
В зеленом слонике оказывается есть трейты как в Scala? Почему вы тогда их не используете в своем коде?
Ответы: >>1038841
Аноним 2017/08/06 01:50:13  №1038841 125
>>1038807
Повсюду в Laravel используются. Только вот в трейтах мало хорошего - это по сути автоматизированный копипаст, который неудобно юнит-тестировать: http://blog.ircmaxell.com/2011/07/are-traits-new-eval.html
Пример - Laravel Dusk - пакет для написания браузерных тестов, весь функционал которого построен на трейтах, вот один из них: https://github.com/laravel/dusk/blob/1.0/src/Concerns/InteractsWithElements.php
По коду видно, что трейту нужен какой-то resolver (непонятно какой именно класс), какой-то driver и ещё используется метод waitUsing, который тоже непонятно откуда будет браться. Если не читать весь код трейта, то непонятно какие нужны объекты и методы, чтобы переиспользовать этот трейт. Подход с DI гораздо логичнее, проще, не нарушает инкапсуляцию, не порождает сильную связанность.

>>1038689
То, что ты описал - это база, которую как раз у джунов спрашивают, ведь у них мало практического опыта и нужно поспрашивать теорию. Ещё это объёмные вопросы, с которыми ты не разберёшься за неделю до собеседования, поэтому и "готовиться" смысла особого нет, разве что повторить то, что уже быть может подзабыл. В нашей конторе на мидлов+ спрашивают преимущественно о интересных завершённых проектах.

> у меня например сейчас считай пустой github, так как моей конторе это не интересно
Ей и не должно быть интересно. Но если ты идёшь на мидла без своего кода, который можно показать, то тебя засмеют.
Ответы: >>1038910 >>1040041
Аноним 2017/08/06 02:44:31  №1038858 126
>>1037758
Банковский процент считается так:
A=B(1+%)^n
A, В, % тебе известны. Осталось найти n(кол-во лет )
Аноним 2017/08/06 03:14:35  №1038863 127
Анон, в Blade можно запилить блок с форматированием и просто его всюду вставлять с нужными данными? Обычный шаблон тут не подходит, ведь блоков на странице могут быть десятки, компонент, как я понял, опциональная вещь и выводится один или ноль раз.
Ответы: >>1038868
Аноним 2017/08/06 03:33:44  №1038868 128
>>1038863
https://laravel.com/docs/5.4/blade#including-sub-views

Суть в следующем:
1. Создаёшь отдельный blade-файл
2. Подключаешь его в нужных местах с аргументами, как-то так:
@include('macros/button.blade.php', [
'isAdmin' => $isAdmin,
...
])
Ответы: >>1038869
Аноним 2017/08/06 03:38:23  №1038869 129
>>1038868
Спасибо. Сейчас так попробовал, а подшаблон три раза подключился почему-то.
Ответы: >>1038926
Аноним 2017/08/06 09:26:46  №1038910 130
>>1038841
>это база, которую как раз у джунов спрашивают,
У джунов спрашивают про принципы ООП и пузырьковую сортировку.
А не про фабрики, очереди и прочее, и уж точно не просят спроектировать модуль или проект.

Никто не поверит на слово про интересные проекты, всем нужны пруфы или в виде кода(хотя всё равно любят пихать тестовое задание на 5-6 дней работы!) или в виде решения каких то задач на собеседование, что бы посмотреть, как кандидат соображает.
В одной конторе мне дали онлайн тесты лол, там были вопросы в стиле "B наследует A, что выведет метод C". Дропнул их сразу сказав что дальше мне не интересно. И они искали именно Middle PHP программиста.

>Но если ты идёшь на мидла без своего кода, который можно показать, то тебя засмеют.
И когда ты предлагаешь мне пилить свои петпроджекты?
После работы, когда ты уже устал и особо нет сил, к тому же есть ещё и другие дела, или на выходных, когда всё же хочется отдохнуть?
Большинство гитхаб кода людей что я видел, написано ими в рабочее время, для нужд компании. Да и к тому же, как правило народ выкладывает не большие модули, мне кажется по ним сложно сделать вывод о компетентности человека.
Ответы: >>1038926 >>1040041
Аноним 2017/08/06 11:09:34  №1038926 131
>>1038869
Это не нормально, ищи ошибку. Если не установлен laravel-debugbar, то поставь, он показывает отрендереные вьюшки: https://github.com/barryvdh/laravel-debugbar

>>1038910
Спрашивали у меня в аутсорс конторах на джуна как раз про фабрики и очереди. Мне ещё сыграло на руку то, что мог назвать примеры применения тех или иных паттернов в коде Symfony и Laravel (в свободное время просто люблю почитывать исходный код фреймворков, чтобы лучше их понимать). Насчёт свободного времени - понимаю, но ты можешь посидеть недельку-две дома, запилить пару проектов на хорошо знакомых технологиях с тестами. Для толкового мидла это не сложно.
Ответы: >>1040041
Аноним 2017/08/06 13:16:28  №1038984 132
Прошу небольшой помощи:
Есть сайт на yii2, есть модель (в которой есть только tableName(), rules() и attributeLabels() ) вот я захотел расширить эту модель, дописал новые свойства, делаю во вьюхе $form->field($model, 'newProp') и получаю ошибку.
Гугл кидает на перегрузку виртуальных атрибутов (но это ведь не то?)
Ответы: >>1040041
Аноним 2017/08/06 13:29:40  №1038994 133
Ребят, почему про Bootstrap говорят, что он не нужен?
Ответы: >>1038996 >>1039019 >>1040040
Аноним 2017/08/06 13:31:26  №1038996 134
>>1038994
>Включает в себя HTML- и CSS-шаблоны оформления для типографики, веб-форм, кнопок, меток, блоков навигации и прочих компонентов веб-интерфейса, включая JavaScript-расширения.
Лол блядь, что то типа Muse?

Все тот же анон
Ответы: >>1038997
Аноним 2017/08/06 13:37:40  №1038997 135
>>1038996
Это когда кричали, что верстка таблицами не семантична и делали квадратно-гнездовым методом на дивах. Конвейер, короче.
Ответы: >>1039018
Аноним 2017/08/06 14:21:33  №1039018 136
>>1038997
Понял. Но ведь верстка таблицами это тупо, разве нет?
Ответы: >>1039034 >>1040040
Аноним 2017/08/06 14:23:33  №1039019 137
>>1038994
верстальщики выёбываются
Аноним 2017/08/06 14:29:22  №1039026 138
Котаны, стоит ли покупать пожизненный доступ https://courses.devu.com/ тут на курсы по SQL, JQuery, JS и т.д? Препод ахуительный просто, объясняет просто пизже любой книги или руководства, даже ресурсы дает. Но жаль, что у него PHP нет. Но вот я думаю, стоит ли оно того?
Аноним 2017/08/06 14:33:46  №1039034 139
>>1039018
Гораздо тупее вёрстка таблиц дивами. Видел такое не раз.
Ответы: >>1039365 >>1040040
Аноним 2017/08/06 15:31:24  №1039074 140
Как в MVC заставить пользователя абстрактного класса Controller передавать в шаблон некоторый объект (в моем случае собственный UrlHelper)? Объект используется в базовом twig шаблоне от которого наследуются остальные шаблоны (в нав баре имеются ссылки получаемые через UrlHelper). У твиг есть какой-то для этого функционал? Пока что на ум приходит только использовать декоратор для Twig где в методе Twig::render() в качестве аргумента с массивом шаблон-переменных уже будет urlHelper, а декоратор сделает array_merge() к этому массиву.
Ответы: >>1040040
Аноним 2017/08/06 16:22:21  №1039110 141
Поясните за шаблонизаторы,

они вообще ещё нужны? РНР же и сам нормальный шаблонизатор, по сути, с производительностью в 7 ветке тоже проблем нет. Нужны тогда эти твиги-хуиги?
Ответы: >>1039116 >>1040040
Аноним 2017/08/06 16:35:25  №1039116 142
>>1039110
Вкусовщина, я считаю PHP хорошо справляется.
Аноним 2017/08/06 16:56:40  №1039125 143
Анон, расскажи как правильно отлаживать php функции. Допустим, есть проект движок сайта, а в нем в недрах есть функция
[code]
function foo($variable, $array){

}
[/code]
Как можно поставить брейкопоинт на вход этой функции чтобы я мог в окне увидеть значения $variable, $array когда дело дойдет до нее? Чтобы в браузере открыть тестовый домен, а аргументы как-то увидеть не дописывая вручную дамп в файл в эту функцию. Все таки 2017 год уже
Ответы: >>1040039
Аноним 2017/08/06 19:23:24  №1039253 144
>>1038177
>В PHP вообще нет указателей, а указателей на указатели - подавно. Указатель - это переменная, содержащая информацию о том, где в памяти размещён какой-то объект.
"Reference" переводится, как "ссылка", и я о них в мануале читал, их не может не быть. Мануал я на самом деле прочитал, так что просто скажи: есть ли у ссылок более одного уровня.........

Так, стоп, в мануале же ничего не написано об этом.
Ответы: >>1040039
Аноним 2017/08/06 20:44:54  №1039365 145
>>1039034
а как ты предлагаешь делать адаптивные таблицы?
Аноним 2017/08/06 21:05:54  №1039394 146
Есть regexp-функция вида
preg_replace( '/(бла-бла)(мяу-мяу)/u', function($2), $string);
То есть, я хочу заменить текст в исходной строке $string на хуйню, которая выцеплена второй подмаской регулярки, но при этом хочу обработать эту хуйню функцией. Пхп не разрешает обрабатывать хуйню функцией, что мне не нравится. Вопрос: как добиться аналогичного эффекта законными средствами? Спасибо.
Ответы: >>1039404 >>1039614 >>1040039
Аноним 2017/08/06 21:09:46  №1039404 147
>>1039394
На самом деле не заменить в исходной строке, а создать новую с заменой в нужном месте, извините за неточность
Аноним 2017/08/06 22:56:22  №1039605 148
Сап. Приступил к задаче с циклами.
Цикл просто не запускается, хз почему.
Укажите на ошибку, пожалуйста, пробовал по-всякому вычислить ошибку:
дебагил с помощью echo, но цикл просто не запускается, видимо, ошибка где-то в условиях.
http://ideone.com/bnrFXe
Ответы: >>1039612
Аноним 2017/08/06 23:00:05  №1039612 149
Ответы: >>1039619
Аноним 2017/08/06 23:03:34  №1039614 150
>>1039394
В чём проблема перед preg_replace вызвать функцию?
Ответы: >>1039617
Аноним 2017/08/06 23:06:57  №1039617 151
>>1039614
В том, что я с помощью непосредственно регулярок указываю на то, к каким символам в строке применить функцию.
Ответы: >>1039631
Аноним 2017/08/06 23:08:50  №1039619 152
>>1039612
Блин, только что сам открыл другой источник, перечитал и осознал.
Соре за невнимательность, всё получилось!
Аноним 2017/08/06 23:20:15  №1039631 153
>>1039617
Тогда я не знаю чем тебе помочь.

Ты можешь, конечно, сначала сохранить те символы в отдельную переменную, обработать функцией, а затем заново выполнить замену.
Ответы: >>1039648
Аноним 2017/08/06 23:40:07  №1039648 154
>>1039631
Впихнул preg_replace_callback(), вопрос снят
Аноним 2017/08/07 08:15:32  №1039833 155
>>1038799
Какого блять начала

В принципе есть смысл лазить в БД лишний раз на каждой странице? Это же медленнее в несколько десятков раз.
Ответы: >>1040039
Аноним 2017/08/07 09:05:54  №1039847 156
Кто занимался подобным, можете поделиться? - Сложно ли создавать сайты типа Amazon ?
Ответы: >>1040039
Аноним 2017/08/07 16:02:28  №1040039 157
>>1039847

> Капитализация компании Amazon в ходе торгов 26 июля впервые превысила $500 млрд, передает Financial Times.

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

>>1039833

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

>>1039394

preg_replace_callback. PHP правильно делает что запрещает флаг e, так как это ведет к уязвимостям.

>>1039253

Думаю, нету. Думаю, при попытке взять ссылку на ссылку ты получишь ссылку на конечный объект (попробуй протестировать сам).

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

>>1039125

Да, нужно установить и настроить расширение xdebug (это больно), а потом настроить IDE (или другой клиент xdebug) для взаимодействия с ним. И тогда можно отлаживать код, выполнять пошагово, ставить брейкпойнты и тд.
Ответы: >>1040429
Аноним 2017/08/07 16:02:48  №1040040 158
>>1039110

Написано подробно на главной твига https://twig.symfony.com/

>>1039074

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

- переопределить render($template, $data) в базовом классе, чтобы он туда добавлял нужные переменные
- сделать отдельную функицию renderWithAdditionalVariables(..) которая добавит нужные переменные
- создать отдельный объект Twig_Environment, в него добавить переменные через addGlobal, и этот объект твига уже передать в контроллер с помощью DI (ну или можно в контроллере его и создать)
- сделать отдельный хелпер/контроллер предоставляющий данные для вывода шапки/подвала/меню

Ну и может еще какие-то варианты.

>>1039034

Таблицы надо верстать таблицами, а раскладку делать в CSS. И по моему, таблицы можно через CSS застаивть отображаться как дивы, или нельзя?

>>1039018

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

>>1038994

Я думаю, нужен или не нужен - зависит от ситуации.
Аноним 2017/08/07 16:03:06  №1040041 159
>>1038984

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

>>1038910

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

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

>>1038926

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

>>1038841

Ага, у меня иногда ощущение, что трейты просто пытаются использовать ради того, чтобы они были. Хотя может какие-то случаи для их использования и есть.
Ответы: >>1040138
Аноним 2017/08/07 16:03:24  №1040042 160
>>1038794

> доступ к файлам быстрее работает, например.
пруфы есть?

>>1038785

Их еще в редисе можно хранить.

>>1038177

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

>>1038131

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

>>1038063

Гуглить, искать статьи, примеры кода и решения

>>1037905

Решается примерно так:

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

«Платим» здесь значит уменьшаем долг и увеличиваем общую сумму выплаченного.
Аноним 2017/08/07 16:06:16  №1040045 161
>>1034527

> Без исполнения кода я смогу только фразу "Expected ($a >= $b)" вывести, а хотелось бы включить ещё и значения переменных $a и $b.

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

Потому в phpunit используют $this->assertGreaterThen($a, $b);

Ну и еще есть другие варианты (как в JS) вроде Assert($a)->isGreaterThan($b);

Аноним 2017/08/07 16:09:26  №1040050 162
>>1034527

assert($a, '>', $b) - не подходит?

> Тут преимущества, что assert'ы выглядят естественно, не нужны эти бесконечные assertCountEquals/assertGreaterThanOrEqual. Мне кажется, что такие assert'ы - изначально путь неправильный.

Ну они по крайней мере работают.

В твоем подходе проблема в том что надо получить переменные из скопа родительской функции, и я не уверен, что это вообще возможно сделать (хотя надо посмотреть функции - может что-то и есть, в текущей функции можно получить переменные через get_defined_vars)
Аноним 2017/08/07 18:18:26  №1040138 163
>>1040041
>И? Тебе всего лишь нужно ответить на них
Я не жалуюсь, я изначально спрашивал про паттерн собеседований, а потом рассказывал отличие джунских и мидловых собеседований, которые я видел.
Но тестовое задание больше чем на один вечер это перебор.
Я ведь не в одну контору в этот момент собеседуюсь, если каждый даст задание на 16 часов работы, я ни одно не успею, особенно если я не уволился ещё с текущей работы(это вроде нормально).
>Толковый мидл наверно может рассказать о своем опыте работы, о своем вкладе
Нужно поднять скилл красноречия, а то я обычно говорю мол "Чем не занимался, всё говно какое то", хотя это неверно.

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


>Почему же, если мы например миграцией добавляем таблицу стран
Если это константные значения, то не нужно их хранить в базе.
Если нет, то они могут быть не нужны в другом проекте.
Ответы: >>1040140
Аноним 2017/08/07 18:20:16  №1040140 164
>>1040138
Пиздец, как я криво всё расписал, но вроде ясно.
Аноним 2017/08/07 23:20:33  №1040356 165
Сделал задачку на перевод числительных в текстовый формат. Пришлось попердеть я новичок. Нужны ваши комментарии, где особенно плохой код и почему.
http://ideone.com/V8DrXU
Аноним 2017/08/08 03:56:04  №1040419 166
>>1038413
> youtube
А в текстовом формате не завезли?
Аноним 2017/08/08 05:25:01  №1040429 167
>>1040039
Ну впринципе логично да. Шикарно наверное быть на месте этих инженеров. Или нет?
Аноним 2017/08/08 07:37:07  №1040462 168
Лол, сегодня осознал, что 1000 строчек кода это не так круто как мне казалось раньше. Гораздо круто это когда эти строчки написаны на PHP.
Хм, да и то думаю, что местные ветераны посмеются над этим.
Ответы: >>1040488
Аноним 2017/08/08 09:00:22  №1040488 169
>>1040462
Как-то начал задрачивать phalcon и настрочил 5 тыс. строк кода поверх фреймворка, чтобы получилась CMS на phalcon+mongodb. В итоге запутался в блядских наркоманских депенденси инжекшенах, а также понял, что дебажить это соколиное говно проктически невозможно, т.к. нет php-исходников фреймворка, и не понятно, что за нахуй там в нём происходит. Так и забил.
Ответы: >>1040618
Аноним 2017/08/08 09:37:58  №1040505 170
14921157368850.jpg (978, 1946x3456)
3456x1946
Реквестирую гайд по DI для даунов.
Аноним 2017/08/08 09:54:39  №1040511 171
>>1040505
Как сделать себе такой вид из окна?
Ответы: >>1040514
Аноним 2017/08/08 10:13:03  №1040514 172
>>1040511
Переехать в Гонконг.
Ответы: >>1040525
Аноним 2017/08/08 10:20:35  №1040517 173
chetayazaebalsy.jpg (33, 720x304)
304x720
ОП, объясни как вообще со Slim'ом работать.
Я создаю свой контроллер, потом свою модель, в модели будут использоваться методы slim. В index.php я создаю объект слима $app = new Slim.
Мне этот $app в $container засунуть и тащить его через всё приложение в аргументах что бы я мог им в модели воспользоваться? FrontConroller>FileDownloadConroller>FileDownloadModel
Я явно делаю всё не так.
Я читал доки, но многое не понятно, собственно что касается DI и Middleware.
Ответы: >>1040549 >>1041459
Аноним 2017/08/08 10:53:21  №1040525 174
>>1040514
Виза нужна? Сколько стоит в месяц сычевальня с таким видом из окна?
Ответы: >>1040648
Аноним 2017/08/08 11:41:47  №1040549 175
>>1040517
>FrontConroller>FileDownloadConroller>
Что-то явно не так, зачем контроллер дёргает контроллер?

>Мне этот $app в $container засунуть и тащить его через всё приложение в аргументах что бы я мог им в модели воспользоваться?
А зачем тебе $app в твоей модели изначально?
Ответы: >>1040613 >>1040613
Аноним 2017/08/08 12:21:55  №1040588 176
Аноним 2017/08/08 13:21:37  №1040613 177
2017-08-08 (1).jpg (87, 1125x838)
838x1125
Снимок.JPG (53, 653x459)
459x653
>>1040549
>Что-то явно не так, зачем контроллер дёргает контроллер?
Эм, это паттерн вообще такой. Есть главный контроллер, который определяет какому не главному контроллеру передать запрос.

>>1040549
>А зачем тебе $app в твоей модели изначально?
Загрузка файлов осуществляется с использованием возможностей фреймворка.
Ответы: >>1040626
Аноним 2017/08/08 13:39:29  №1040618 178
>>1040488
Я так понял это обычная рутина.
Ответы: >>1040629
Аноним 2017/08/08 13:46:34  №1040626 179
>>1040613
>Эм, это паттерн вообще такой. Есть главный контроллер, который определяет какому не главному контроллеру передать запрос.
Не вижу ни единой причины тебе использовать его. В твоём случае Slim - фронт контроллер.

>Загрузка файлов осуществляется с использованием возможностей фреймворка.
https://www.slimframework.com/docs/cookbook/uploading-files.html
Документация говорит, что то делается в одну строчку
$uploadedFiles = $request->getUploadedFiles();
Т.е. тебе нужен лишь request, а никак не $app. Твои классы не должны зависиоть от $app.

Ответы: >>1041103
Аноним 2017/08/08 13:49:04  №1040629 180
Ответы: >>1040690
Аноним 2017/08/08 14:20:34  №1040646 181
Ответы: >>1040661
Аноним 2017/08/08 14:25:04  №1040648 182
>>1040525
>Виза нужна?
Две недели без визы можно
>Сколько стоит в месяц сычевальня с таким видом из окна?
Как на пике 2к$ за микростудию в месяц
Если искать не в Гонконге, а в Коулуне - то можно от 1к$.
Ответы: >>1040652
Аноним 2017/08/08 14:34:47  №1040652 183
Аноним 2017/08/08 14:50:34  №1040661 184
>>1040646
Мда, echo было внутри цикла, я понял.
Аноним 2017/08/08 15:06:46  №1040679 185
Как из контроллера получить содержимое представления в переменную?
Ну то есть обычный require сразу отобразит содержимое файла представления, а если нужно взять шаблон в строку, чтобы передать куда-то дальше (в объект Response например)?

Покопался в исходниках слима, там используют буфферизацию типа
ob_start();
include $template;
$output = ob_get_clean();
return Response($output);

Это общепринятый подход? Я имею ввиду, когда не использую фреймворк типа слима, а только библиотеку HttpFoundation.
Ответы: >>1041461
Аноним 2017/08/08 15:16:56  №1040690 186
Аноним 2017/08/08 23:32:01  №1041066 187
Посоветуйте книгу по ларавелю на русском
Ответы: >>1041609
Аноним 2017/08/09 00:49:10  №1041103 188
>>1040626
Если slim - frontcontroller, то мне делать толстый index.php, в котором описывать какому контроллеру отправлять запрос? Все getы и postы обрабатывать в нем?
Ответы: >>1041207
Аноним 2017/08/09 02:28:02  №1041133 189
>>1040505
Смотрю и ссусь, там же так высоко, и как люди работают только.
Аноним 2017/08/09 07:19:22  №1041161 190
>>1033564 (OP)
Был же сайт с уроками, куда делся?
Ответы: >>1041162
Аноним 2017/08/09 07:21:46  №1041162 191
Аноним 2017/08/09 10:41:55  №1041207 192
>>1041103
Ну да. Микрофреймворк, у тебя же не расрастется там проект до тысяч рестов. Да ещё и слой контроллеров достаточно тонкий обычно, ты же там будешь сервисы дёргать, а вся логика в них.
Ответы: >>1041381
антоны стоит ли учиться навечку в cms? или забить и вкатиться в ворпресст.п.? 2017/08/09 11:31:09  №1041228 193
антоны стоит ли учиться навечку в cms?
или забить и вкатиться в ворпресс\т.п.?
Ответы: >>1041230 >>1041232 >>1041234
Аноним 2017/08/09 11:33:27  №1041230 194
>>1041228
сережка стоит тебе учиться в книги?
или забить и вкатиться в романы\т.п.?
Аноним 2017/08/09 11:33:58  №1041232 195
>>1041228
Стоит учиться в велосипед
или вкатиться в самокат?
Аноним 2017/08/09 11:34:39  №1041234 196
>>1041228
Стоит плавать на байдарках?
Или забить и плавать в надувной уточке?
Аноним 2017/08/09 14:03:27  №1041336 197
В чем смысл паттерна Фабрика?
В интернете много примеров шаблонов проектирования, но не объясняется, в чем преимущество их использования.

$factory = new FirstFactory();
$firstProduct = $factory->getProduct(); //в getProduct просто return new FirstProduct
$factory = new SecondFactory();
$secondProduct = $factory->getProduct(); // return new SecondProduct

Что мешает написать new Product прямо, не прибегая к созданию фабрики и вызова ее методов?
Может это сделано, чтобы эта часть кода была универсальной, не требовала правок, ну то есть изменения можно было вносить внутри фабрики, не меняя основной код?
Можно реальный пример, где видны преимущества использования?

Вот еще дурацкий пример
https://habrahabr.ru/sandbox/19322/

$obj = Car_Factory::factory('Big_Car');
$obj -> buildEngine();
$obj -> attachWheels();
$obj -> testing();

Что мешает в первой строчке сделать $obj = new BigCar; ?
Аноним 2017/08/09 14:09:05  №1041337 198
>>1041336
>В чем смысл паттерна Фабрика
модно, молодежно
Аноним 2017/08/09 14:10:47  №1041339 199
>>1041336
Я использую фабрику в том случае, когда мне требуется создавать много объектов, требующих одинаковой настройки. В этом случае я могу один раз при создании фабрики задать ее параметры и она будет отдавать мне уже правильно настроенные объекты. Я не могу привести пример из мира php, но в JDK можно увидеть пример использования, например, в DocumentBuilderFactory.
>Вот еще дурацкий пример
По ссылке не ходил. Если в этом весь пример, то он действительно дурацкий.
Ответы: >>1041344
Аноним 2017/08/09 14:14:46  №1041342 200
>>1041336
Фабрики нужны для ленивого создания/получения объектов (возможно, с приватным конструктором). Например, ты обращаешься к фабрике:

$doc = Factory::getDocument();

Сам документ может не существовать до этого вызова. А после вызова существует. Повторный вызов Factory::getDocument() возвращает уже имеющийся объект. Кроме того, фабрика, например, может возвращать объект разных классов одним и тем же методом в зависимости от своих настроек. А ещё используются для IoC, которая, как и DI, ломает к хуям всю инкпасуляцию, поэтому не нужна.

Короче, фабрики не нужны.
Ответы: >>1041343 >>1041345
Аноним 2017/08/09 14:17:14  №1041343 201
>>1041342
>Повторный вызов Factory::getDocument() возвращает уже имеющийся объект
Тогда это уже Provider, а не фабрика. Фабрика подразумевает как раз создание нового экземпляра на каждый вызов, кеширование в ее обязанности не входит.
Ответы: >>1041345 >>1041347
Аноним 2017/08/09 14:21:15  №1041344 202
>>1041339
> в том случае, когда мне требуется создавать много объектов, требующих одинаковой настройки
Цикл?
Ответы: >>1041346
Аноним 2017/08/09 14:22:52  №1041345 203
>>1041342
> Повторный вызов Factory::getDocument() возвращает уже имеющийся объект
>>1041343
> Provider
Ты напутал с singleton.
Вообще, призываю новичков критически относиться к ответом ИТТ,
некоторые просто провайдят дремучие заблуждения.

По поводу фабрик, держи пример с описанием: http://ideone.com/h6Kvos
Ответы: >>1041350 >>1041357
Аноним 2017/08/09 14:23:07  №1041346 204
>>1041344
Ну и при чем тут цикл? Мне же не обязательно в одном и том же месте потребуются эти 100500 экземпляров. В одном методе один, в другом методе один, где тут цикл-то?
Аноним 2017/08/09 14:23:51  №1041347 205
>>1041343
Ну, ок. Хотя на практике такое называется фабрикой. Например, в джумле:

https://api.joomla.org/cms-3/classes/JFactory.html

Они там в ней собрали говно со всего фреймворка и пользуются этой фабрикой вместо глобалов.
Ответы: >>1041352
Аноним 2017/08/09 14:26:00  №1041350 206
>>1041345
>Ты напутал с singleton.
Я-то не напутал, это он напутал. Фабрика производит на каждый вызов новый экземпляр. Провайдер отдает необходимый результат в ответ на запрос с возможностью кеширования. Синглтон - нечто 100% в единственном экземпляре с ленивой инициализацией.
Ответы: >>1041609
Аноним 2017/08/09 14:29:12  №1041352 207
>>1041347
Ну хорошо, в джумле какой-то Раджеш Кутапали решил, что неплохо было бы назвать это фабрикой. А еще где?
Ответы: >>1041353 >>1041366
Аноним 2017/08/09 14:29:51  №1041353 208
>>1041352
Джумла - это серьёзный игрок в мире PHP так-то.
Ответы: >>1041355
Аноним 2017/08/09 14:31:35  №1041355 209
>>1041353
Ну я не пойму, здесь паттерны обсуждают или... вэйт. Я же в пхп-треде. Ладно, хуй с вами.
Ответы: >>1041356
Аноним 2017/08/09 14:32:52  №1041356 210
>>1041355
Приведи контр-пример тогда, а не требуй дополнительных подтверждений, которых тебе всегда будет мало, и для которых ты найдёшь оправдание в стиле Раджеш Кутапали.
Ответы: >>1041360
Аноним 2017/08/09 14:37:07  №1041357 211
>>1041345
По поводу твоего примера, он тоже ни о чем не говорит, зачем писать
$r = $ShapeFactory->getShape('R');
$s = $ShapeFactory->getShape('S');
$c = $ShapeFactory->getShape('C');

Если можно
$r = new RectangleShape();
$s = new SquareShape();
$c = new CircleShape();

Единственный весомый аргумент, который привели выше, это сложная инициализация объекта, ну то есть когда кроме
$obj = new Obj();
для каждого экземпляра нужна рутина типа
$obj->setProp1();
$obj->setProp2();
$obj->doSmth3();
// 100500 строк кода
Хотя почему бы не перенести эту рутину в конструктор?
Аноним 2017/08/09 14:43:01  №1041360 212
>>1041356
При чем тут контр-пример? Речь о терминологии идет. Терминология паттернов описана в книжке от gang of four, предлагаю тебе в нее заглянуть. Сам, кстати, заглянул специально чтобы ткнуть носом, но, как ни странно, не нашел там вообще такого паттерна, как просто фабрика. Тем не менее, если взять абстрактную фабрику, то в ней явно речь идет о том, что каждый вызов порождает новый объект.
>>1041357
>Хотя почему бы не перенести эту рутину в конструктор?
1. Нехуй в конструкторе делать что-то помимо создания объекта.
2. Настраивать, как правило, можно по разному, не будешь же ты 20 аргументов передавать в к-тор на все случаи жизни.
3. В стороннюю либу ты вообще залезть не сможешь.
Ответы: >>1041366
Аноним 2017/08/09 14:44:49  №1041362 213
>>1041357
> можно
> почему бы
Тебя никто не заставляет, можно так и ещё 1001 способом.

Паттерны -- это не законы, которые надо выполнять, а некоторые выработанные шаблоны.
Зачем -- затем, что иногда так удобно. Например, в другой части программы ты не знаешь и не хочешь знать типы фигур, а работаешь с одним объектом -- их фабрикой.
Аноним 2017/08/09 14:48:04  №1041365 214
>>1041357
> он тоже ни о чем не говорит
Ничего не говорит тебе, тут же не пример виноват.

> весомый аргумент
как будто тебя тут уговаривают, блять,
ну пожалуйста, используй паттерны, а то 40 лет программирования до этого уйдут в пустую
Аноним 2017/08/09 14:48:26  №1041366 215
>>1041352
https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/beans/factory/BeanFactory.html
Такой пример тебя устроит?

>>1041357
Потому что твой клиентский код может не знать о том, инстанс какого конкретного класса ему создавать и ты просто физически не можешь написать new. А фабрика знать может и вабрику тебе могут подложить извне.

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

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


Ответы: >>1041373
Аноним 2017/08/09 14:55:38  №1041373 216
>>1041366
> говножаба вместо языка программирования

К тому же твой пример работает против тебя же:
> Return an instance, which may be shared or independent
Ответы: >>1041379 >>1041444
Аноним 2017/08/09 14:57:04  №1041376 217
>>1041357
>для каждого экземпляра нужна рутина типа
>$obj->setProp1();
>$obj->setProp2();
>$obj->doSmth3();
это другой паттерн, http://ideone.com/IrT4LL

>Единственный весомый аргумент
короче, хватит высирать своё детский сад сюда, учи мат.часть, ссука, потом вякай тут про аргументы
Аноним 2017/08/09 14:58:11  №1041379 218
>>1041373
> говножаба вместо языка программирования
Пехапе тебе не язык, жаба тебе не язык. Ты из какого треда сюда повыебываться пришёл?

>К тому же твой пример работает против тебя же
Если бы ты хоть что-то написал с использованием Spring, ты бы знал, что большая часть компонентов имеет singleton scope. А так то да: ты там и своих скоупов наклепать можешь, вперёд. От этого фабрика быть фабрикой не перестанет и в банальный сборщик объекта по имени не превратится.
Ответы: >>1041383
Аноним 2017/08/09 14:58:21  №1041381 219
>>1041207
ОП, ты подтверждаешь? Idex будет выполнять роль фронт-контроллера?
Аноним 2017/08/09 15:00:50  №1041383 220
>>1041379
> isSingleton(String name)
> Is this bean a shared singleton? That is, will getBean(java.lang.String) always return the same instance?
Но эта фабрика возвращает шаред синглтоны точно так же как Джумла, ссылку на апи которой я тебе давал выше. Что ты хочешь мне доказать?
Ответы: >>1041385
Аноним 2017/08/09 15:02:37  №1041385 221
>>1041383
Так я с тобой и согласен. Я писал тому парню, которому джумловские фабрики - не фабрики.
Аноним 2017/08/09 15:25:13  №1041402 222
>>1041336

Вообще, "фабрика" - это функция или объект, создающий другие объекты.

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

class MyFActory { ... }
$myFacrtory = new MyFactory;
$otherObject = new OtherObject;
$otherObject->setFactory($myFactory);
// PROFIT

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

Главное только слишком не увлекаться этими паттернами, а то получится как в статье https://habrahabr.ru/post/153225/

Тут вот https://en.wikipedia.org/wiki/Abstract_factory_pattern приведен хороший пример: фабрика в GUI фреймворке, которая создает разные элементы GUI в зависимости от платформы. также, там в начале в Overview указано, какие проблемы решает паттерн.

Заметь, что есть еще паттерн Factory Method https://en.wikipedia.org/wiki/Factory_method_pattern

Также, можно поискать реальные случаи использования Factory, например в Симфони, таким запросом: https://www.google.ru/search?q=site%3Aapi.symfony.com+factory&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&newwindow=1&gbv=1 (понять впрочем будет довольно сложно)

ну и конечно примеры с "машинами", или с кошками, которые наследуются от Животного, они сильно оторваны от реальных примеров кода. На мой взгляд, авторам лучше использовать более реалистичные примеры классов.
Ответы: >>1041418
Аноним 2017/08/09 15:54:20  №1041418 223
>>1041402
>Тогда ты просишь автора библиотеки запилить там фабрику
ахахахахаха
Ответы: >>1041428
Аноним 2017/08/09 16:08:40  №1041428 224
>>1041418
Нервный ребёнок-даун детектед.
Что смешного он написал, по-твоему?
Ответы: >>1041431
Аноним 2017/08/09 16:11:37  №1041431 225
>>1041428
я как автор, тебя бы нахуй послал
Ответы: >>1041432
Аноним 2017/08/09 16:12:51  №1041432 226
>>1041431
ну не все ж такие ебланы
Аноним 2017/08/09 16:23:03  №1041444 227
>>1041373

Ява как раз язык, код на котором можно использовать для иллюстрации разных паттернов.

Что касается утверждения "фабрика обязана всегда создавать новый объект (а не возвращать ранее созданный)", тут я не уверен, что это должно быть строго так.

Аноним 2017/08/09 16:24:44  №1041446 228
>>1041357

Если у тебя буква не задана в коде, а приходит откуда-то, то заменить $r = $ShapeFactory->getShape('R'); на $r = new RectangleShape(); не получится.
Аноним 2017/08/09 16:33:30  №1041450 229
Эй, четырехглазые, кто за еду возьмется сайт делать? Функционал: обменник электронных валют. Есть варианты дизайна, есть четкие требования и идеи.
Обоссаные фрилансеры охуели и заряжают неадекватные ценники, поэтому обращаюсь к сосачу.
Деньги готовы платить. Пишите мне на мыло, обсудим [email protected]
Ответы: >>1041451 >>1041453 >>1041609
Аноним 2017/08/09 16:35:45  №1041451 230
>>1041450
>кто за еду возьмется сайт делать?
>Деньги готовы платить.
Чё-т взаимоисключающие параметры.
Олсо, если уж российские фрилансеры для тебя дорого, то я даже не знаю.
Ответы: >>1041460
Аноним 2017/08/09 16:40:23  №1041453 231
>>1041450
>обменник валют
>нет денег на прогера
>нет денег на российского фрилансера
Тебе что, 12 лет и мамка денег на сайт не даёт?
Ответы: >>1041460
Аноним 2017/08/09 16:46:42  №1041459 232
>>1040517

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

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

> в модели будут использоваться методы slim.
Тут что-то не так. Это точно модель, а не контроллер? Какие такие методы Слима тебе нужны в модели?

> Мне этот $app в $container засунуть и тащить его через всё приложение в аргументах что бы я мог им в модели воспользоваться?
Нет, ты должен передавать в модель только то, что ей нужно, а не весь контейнер с сервисами и настройками. Ты читал мой урок по DI?

> но многое не понятно, собственно что касается DI
читал мой урок по DI? https://github.com/codedokode/pasta/blob/master/arch/di.md

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

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

- логгирование
- отладка (например, дописать в конец страницы все выполненные во время ее генерации SQL запросы)
- кеширование страницы целиком
- сжатие страницы gzip (если клиент поддерживает это)
- фильтрация запросов/ограничение доступа (например ограничение числа запросов с 1 IP за секунду или требование решить капчу перед доступом к сайту)
- иногда для защиты от CSRF (у меня есть урок про CSRF)
- модификация ответа (например: найти все ссылки и что-нибудь к ним дописать)
- шифрование кук: перед обработкой запроса пришедшие куки расшифровываются, а после генерации ответа отправляемые куки зашифровываются, браузер видит зашифрованные куки, а код видит куки в открытом виде. То есть мы добавляем шифрование прозрачно для кода, не требуя его переписывания (правда для того, кто разбирается в коде, это может оказаться сюрпризом)

То есть они работают на уровне протокола HTTP, с запросами, ответами, заголовками. Вот например список middleware в фреймворке Джанго: https://docs.djangoproject.com/en/1.11/ref/middleware/

Попробуй например сделать middleware, которое дает доступ к сайту только после решения капчи.

> Загрузка файлов осуществляется с использованием возможностей фреймворка.
Нужно отделить модель и логику сохранения файла от самого Слима.
Ответы: >>1041764
Аноним 2017/08/09 16:48:05  №1041460 233
>>1041453
>>1041451
Поставили ценник 60к. Это адекватно за одностраничный сайт с готовым дизайном?
Аноним 2017/08/09 16:49:45  №1041461 234
>>1040679

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

Если шаблонизатор, то там обычно есть метод для получения шаблона в виде строки.
Аноним 2017/08/09 16:51:23  №1041463 235
>>1040505

За такими пейзажами ехать далеко не надо. Вид почти как в Кудрово, ну может только дома этажей на 5-6 повыше и улица чуть пошире.
Аноним 2017/08/09 16:53:48  №1041465 236
Аноним 2017/08/09 16:59:18  №1041469 237
>>1041460
>Поставили ценник всего в 1000$
>Это адекватно?
Ну конечно да.
Аноним 2017/08/09 17:03:19  №1041470 238
>>1041460
Ну так-то функция поиска яндекс/google тоже на одной странице умещается. Да и дизайна там немного, можно готовый взять.

Олсо, в цене проекта нужно учитывать не только время работы, а ещё и разбор шизы заказчика, отладку, первичные поддержку и обучение, etc. -- иначе ничего хорошего не выйдет.
Ответы: >>1041472
Аноним 2017/08/09 17:04:19  №1041471 239
>>1041460
Ответ на твой вопрос будет сильно различаться, в зависимости от того, в каком сообществе - заказчиков или фрилансеров - спрашивать.
Аноним 2017/08/09 17:10:42  №1041472 240
>>1041470
кокойнить грабер котировок, который их пиздит, схороняет в бд, потом показывает на сраничке. нехуевый такой сайтик.
Ответы: >>1041609
Аноним 2017/08/09 21:17:13  №1041597 241
Короче решил перекатиться из недоФРОНТЕНДЕРА в бекенд, так как хуево с фантазией создания анимашек на сайтах. Выбрал похапе, все правильно делаю?
Ответы: >>1041609 >>1041914
Аноним 2017/08/09 21:37:05  №1041609 242
>>1041597
Вряд ли. Сейчас работаю с проектом, который походу писался во времена PHP 4 (в коде var'ы, идентификатор сессии передаётся через GET-параметр, постоянно натыкаюсь на вот такие шедевры: https://pastebin.com/KhEix3UE ) и как-то кайфа мало.

>>1041472
Разве там просто граббер и не нужно работать с API платёжек для обмена электронных валют?

>>1041066
Доки + исходники. Книги нужно по фундаментальным вещам читать.

>>1041350
> Провайдер отдает необходимый результат в ответ на запрос с возможностью кеширования.
Бред какой-то, есть ссылка на GoF?

>>1041450
> четырехглазые, кто за еду
С таким отношением проследуй вон из треда.
Ответы: >>1041616
Аноним 2017/08/09 21:45:39  №1041616 243
>>1041609
>проектом, который походу писался во времена PHP 4 (в коде var'ы, идентификатор сессии передаётся через GET-параметр, постоянно натыкаюсь на вот такие шедевры: https://pastebin.com/KhEix3UE ) и как-то кайфа мало.

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

someApprentice 2017/08/10 03:21:19  №1041713 244
>>1040027
>То есть, тебе стоило бы для начала хотя бы немного изучить теорию про gpg
Я пытался это сделать, то есть я пробежался по википедии, затем зашел в "Введение" библиотеки, в котором нашел ссылку на проект GnuPG, и в котором была ссылка на этот мануал https://www.gnupg.org/documentation/manuals/gnupg/ , в котором ничего не понятно. Мне почему-то не пришло в голову просто загуглить "gpg manual".

Меня одновременно поражает как легко вы сломали эту библиотеку и и глубоко расстраивает что я не смог сделать это самостоятельно. Я даже не знаю почему мне это сразу не далось. Даже если бы я загуглил "gpg manual" я бы не обратил внимания на вторую ссылку т.к. посчитал бы что это мануал о том как обращаться именно с консольной версией.

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

>> Только почему-то я не вижу методов генерации ключей.
>Это можно сделать утилитой командной строки gpg. Вообще, в самой сишной библиотеке есть функция генерации ключа, но в расширении она не доступна.
Значит нужно будет сгенировать ключ с помощью командной строки... это интересно т.к. открывает простор к ещё большим возможностям. Я ещё не смотрел на php с такой стороны.

Исходя из манаула https://www.gnupg.org/gph/en/manual.html#AEN26
При выполнении команды генерации ключа, происходит диалог в котором устанавливаются опции. Чтобы передать все опции программно нужно несколько раз выполнить exec(...)?

Например:
exec("gpg --gen-key");
exec("1"); //DSA and ElGamal
exec("2048"); //keysize
exec("0"); //key does not expire
exec($id); //user ID
exec($password); //passphrase

$privateKey = exec("gpg --armor --export-secret-key {$id}");
$publicKey = exec("gpg --armor --export {$id}");

Я попытался проверить, и в ответ получил пустую строку. Думаю, это потому что нет доступа для пользователя www-data. Загуглив как дать доступ на определённые команды (linux ubuntu) получил результаты как давать разрешения на папку/файлы и как дать доступ к sudo. Загуглив "linux gpg program directory" получил результаты о том как зашифровывать директории. ??? Попробовал поискать эту директорию на диске, получить несколько папок. Для не опытного linux пользователя мне сложно что-то придумать.

Так сложно ещё никогда не было. Я делаю что-то не так?

>You must provide a user ID in addition to the key parameters. The user ID is used to associate the key being created with a real person.
>
>You need a User-ID to identify your key; the software constructs the user id
>from Real Name, Comment and Email Address in this form:
> "Heinrich Heine (Der Dichter) <[email protected]>"
>
>Real name:
Что за глупость? Может мне ещё адрес проживания указать?

К тому же, мне не дали указать "Real name" цифрами, но это ничего т.к. можно указать имейл вместо этого. Нужно ещё указать какой-то comment (зачем это нужно?).

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

Я подумал, что если сделать это через консоль так сложно, то может быть получиться найти библиотеку, которая может сгенерировать ключи. Но с этим тоже не так всё просто, единственную библиотеку которая удалось найти это http://pear.php.net/package/Crypt_GPG/ , но она заявляет что не поддерживает генерацию ключей, хотя такой класс есть:

http://pear.php.net/package/Crypt_GPG/docs/latest/Crypt_GPG/Crypt_GPG_KeyGenerator.html
http://pear.php.net/manual/en/package.encryption.crypt-gpg.generate-key.php
>Crypt_GPG does not yet support generating GnuPG keys. Generating a GnuPG key for use with Crypt_GPG is much the same as generating any other GnuPG key on a system.

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


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

>Вообще, opengpg
Я тоже путаю OpenPGP и GnuPG

OpenPGP, это стандарт не использующий запатентованные алгоритмы

А GnuPG, это его реализация под лицензией GNU General Public License

>Плюс, я тут подумал, может это позволит как-то интегрироваться с GPG, то есть, например, обмениваться сообщениями с теми, кто использует обычную почту с шифрованием через gpg.
Да, я думал что можно ещё использовать мессенджер как почтовый ящик, но это будет уже совсем другая задача. То что вы не только помогаете мне изучать программирование, но и как бы ещё курируете мои проекты, предлагая идеи которые совпадают с моими... это очень мотивирует.
Ответы: >>1042318 >>1042319
someApprentice 2017/08/10 03:28:27  №1041714 245
Я ещё нечаянно запостил в закрытый тред пару вопросов о частичной подгрузке сообщений >>1040147
Аноним 2017/08/10 05:24:43  №1041719 246
Ответы: >>1041720 >>1041786
Аноним 2017/08/10 05:35:26  №1041720 247
>>1041719
Я понимаю что происходит в коде, но я не понимаю чего ты хотел то?
Ответы: >>1041723 >>1041731 >>1041738
Аноним 2017/08/10 05:56:37  №1041723 248
>>1041720
Я хотел использовать функцию rewind в коде, но не смог. По ссылке - минимальный код с ошибкой.

Какого чёрта ревайнду нужен аргумент?
Ответы: >>1041724 >>1041738
Аноним 2017/08/10 05:58:05  №1041724 249
14907967490320.jpg (34, 427x604)
604x427
>>1041723
>Я хотел использовать функцию rewind в коде, но не смог.
Ну я даже не знаю.
Аноним 2017/08/10 05:59:39  №1041725 250
Хотел вопрос задать, когда были внедрены псевдо-классы. А потом наткнулся на строчку где об этом написано, они были всегда. Только новые добавлялись с CSS2. Я так понимаю, этой функцией занимался только JS и только потом стали добавлять новые псевдо-классы чтобы не ибаца?
Ответы: >>1042271
Аноним 2017/08/10 06:00:28  №1041727 251
>>1041724
Ещё раз, для скептиков:
>public void SplDoublyLinkedList::rewind ( void )
>PHP Warning: rewind() expects exactly 1 parameter

Ничего не смущает?
Ответы: >>1041728 >>1041729
Аноним 2017/08/10 06:03:19  №1041728 252
>>1041727
Ревайнд чего блять?
Ответы: >>1041730 >>1041731 >>1041738
Аноним 2017/08/10 06:03:58  №1041729 253
>>1041727
Давай по другому. Приведу аналогию чтобы было понятнее.
Ты создаёшь переменную, присваиваешь ей число 1. А потом пытаешься получить то, что было до 1?
Ответы: >>1041731 >>1041733 >>1041738
Аноним 2017/08/10 06:04:50  №1041730 254
>>1041728
Это какой-то толстый трлоллинг по моему. Я вот тоже не пойму что он в коде то хочет.
Ответы: >>1041731 >>1041738
Аноним 2017/08/10 06:15:31  №1041731 255
>>1041724
>>1041720
>>1041728
>>1041729
>>1041730
Вы совсем больные? Вы код на идеоне открыли? Я могу сюда запостить его, чтобы вам мышью не кликать лишний раз.
<?php

// your code goes here

$ks=new SplDoublyLinkedList();
$ks.rewind();
?>

И вывод:

PHP Warning: rewind() expects exactly 1 parameter, 0 given in /home/UNfUFN/prog.php on line 6
PHP Recoverable fatal error: Object of class SplDoublyLinkedList could not be converted to string in /home/UNfUFN/prog.php on line 6

На кой ляд ревайнду нужен аргумент, если в мануале написано, что аргументов нет?
Ответы: >>1041732 >>1041733
Аноним 2017/08/10 06:18:20  №1041732 256
14907971703000.png (763, 960x720)
720x960
>>1041731
Прекрати пожалуйста.
Ответы: >>1041738 >>1041786
Аноним 2017/08/10 06:19:24  №1041733 257
Ответы: >>1041734 >>1041738
Аноним 2017/08/10 06:23:44  №1041734 258
>>1041733
>This rewinds the iterator to the beginning.
Вот это я хочу.
Ответы: >>1041736 >>1041737
Аноним 2017/08/10 06:28:25  №1041736 259
Ответы: >>1041738
Аноним 2017/08/10 06:31:45  №1041737 260
>>1041734
У тебя ничего нет в >beginning
Ты и получаешь ничего.
Ответы: >>1041738
Аноним 2017/08/10 06:34:29  №1041738 261
Ответы: >>1041740 >>1041757 >>1042271
Аноним 2017/08/10 06:37:55  №1041740 262
>>1041738
Так ты же сам не обьяснил чего хотел то. А потом удивляешься что никто не смог помочь...
Ответы: >>1041741
Аноним 2017/08/10 06:40:05  №1041741 263
>>1041740
Я дал ссылку на код с ошибкой и дал ссылку на метод, который я хочу использовать.
Ответы: >>1041742
Аноним 2017/08/10 06:42:55  №1041742 264
>>1041741
А, ну тогда всё нормально.
Аноним 2017/08/10 08:32:41  №1041757 265
>>1041738
>вы все пидорасы от вас никако-ко-ko-го толку, я сам в итоге разобрался.
Молодец.
>По привычке написал . для обращения к методу вместо -> , а в РНР это конкатенация строк, и никто из вас это не увидел.
А я сначала прихуел, а потом смотрю что не дает фатал эрора, и подумал что это новомодная плюха в пхп7.1 или типа того, что бы заменять Pidor::ebatsaVSraku на Pidor.ebatsaVSraku
Аноним 2017/08/10 08:55:22  №1041764 266
2.jpg (11, 666x80)
80x666
Снимок.JPG (118, 1241x593)
593x1241
>>1041459
>Однако, можно реализовать и контроллеры в виде отдельных классов. Обрати внимание на этот пункт в мануале: https://www.slimframework.com/docs/objects/router.html#container-resolution
Кажется я тупой. Как путь к классу прописывать? Почему в доках ни слова про путь? Я уже все возможные пути испробовал, даже этот файл раскидал по всем папкам, может блядь нашёл хотя бы корневую директорию откуда он начинает поиск, но и тут фейл. Полез в гитхаб, стал искать проекты на слиме, нашёл пример в котором использовался данный пример вызова контроллера, но ёбаный врот, там никакой логики в указании пути к контроллеру.
Ответы: >>1041771 >>1041790
Аноним 2017/08/10 09:20:22  №1041771 267
>>1041764
А всё, он использует пространства времён.
Аноним 2017/08/10 09:50:57  №1041786 268
>>1041719

Сейчас конечно легко говорить, но тебе стоило бы обратить внимание на второе сообщение: PHP Recoverable fatal error: Object of class SplDoublyLinkedList could not be converted to string in /home/UNfUFN/prog.php on line 6

А так, rewind($fd) это функция изменения позиции чтения/записи в открытом файле.

>>1041724
>>1041732

Ваши комментарии пользы не несут и тут не нужны. Идите упражняться в остроумии в любой другой тред.
Аноним 2017/08/10 09:56:37  №1041790 269
>>1041764

Ты смешиваешь разные проблемы. Поиск и загрузка файла с классом - это не задача Слима, он этим не занимается. Этим занимается автозагрузчик, почитай урок https://github.com/codedokode/pasta/blob/master/php/autoload.md

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

Что касается синтаксиса, там в мануале описано, что можно указать в качестве контроллера:

- имя сервиса в контейнере + метод. В этом случае ты можешь задать, как именно будет создаваться объект контроллера, определить его зависимости
- имя класса + метод (Слим создаст объект сам как описано в мануале, передав экземпляр $app в конструктор)
- callable (что это такое, описано в мануале PHP http://php.net/manual/ru/language.types.callable.php)

> Как путь к классу прописывать? Почему в доках ни слова про путь?
Потому что Слим не занимается загрузкой классов и ему неинтересно, где он находится. Он просто создает объект через new.
Ответы: >>1041793
Аноним 2017/08/10 10:05:08  №1041793 270
Снимок.JPG (19, 779x154)
154x779
2.jpg (11, 464x127)
127x464
>>1041790
>
>- имя сервиса в контейнере + метод. В этом случае ты можешь задать, как именно будет создаваться объект контроллера, определить его зависимости

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

Так правильно?
Ответы: >>1041796
Аноним 2017/08/10 10:15:19  №1041796 271
>>1041793

Имя плохое для сервиса так как похоже на имя класса и создает путаницу. Назови просто file_download_controller или FileDownloadController.

В конструкторе для view надо указать тайп-хинт.
Ответы: >>1041799
Аноним 2017/08/10 10:20:19  №1041799 272
>>1041796
>Имя плохое для сервиса так как похоже на имя класса и создает путаницу.
Он взял из примера в документации, там именно так и сделали.
Аноним 2017/08/10 11:37:40  №1041840 273
посоны, а зачем приписывать -k в командной строке при установку апача? во всех гайдах это есть, но зачем - не объясняют
Ответы: >>1041851
Аноним 2017/08/10 11:58:45  №1041851 274
>>1041840

Мануал https://httpd.apache.org/docs/2.4/programs/httpd.html

> -k install|config|uninstall
> Install Apache httpd as a Windows NT service; change startup options for the Apache httpd service; and uninstall the Apache httpd service.

Дополнительно https://httpd.apache.org/docs/2.4/platform/windows.html#winsvc

Чтобы Апач добавил себя в список сервисов (сервисы в Windows - это процессы, которые работают в фоновом режиме, могут стартовать при загрузке ОС: https://ru.wikipedia.org/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B1%D1%8B_Windows )
Ответы: >>1041866
Аноним 2017/08/10 12:20:45  №1041866 275
>>1041851
вроде разобрался, спасибо
Аноним 2017/08/10 13:39:12  №1041913 276
Ответы: >>1042267
Аноним 2017/08/10 13:41:22  №1041914 277
>>1041597
Нахуя тебе бэк? Нахуя тебе пхп? Ничему новому ты не научишься, точно также будешь писать вебговнину, оторванную от сути программирования. Выбирай что-нибудь хардкорное, ту же няшечку, раст, или хотя бы го, и вперед, алгоритмы, хуитмы, интересно же.

мимо фронтендер
Ответы: >>1041917
Аноним 2017/08/10 13:46:56  №1041917 278
>>1041914
> вебговнину, оторванную от сути программирования
Ловите наркомана.
Ответы: >>1041927
Аноним 2017/08/10 13:54:09  №1041927 279
>>1041917
В вебе одна часть (фронтенд) оторвана от сути программирования, остальное нет.
Ответы: >>1041932
Аноним 2017/08/10 13:58:37  №1041932 280
>>1041927
Чем тебе фронтенд не программирование? Или ты считаешь, что крудопараша на беке - это тру, а двигающиеся картинки на фронте - не тру?
Ответы: >>1041949
Аноним 2017/08/10 14:13:59  №1041940 281
>>1041460
Я вполне допускаю, что даже одностраничный сайт может влететь в копеечку. Если сложный дизайн + мобильный дизайн + дизайн для планшетов. Плюс внутренняя логика.

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

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

вебдев
Аноним 2017/08/10 14:34:14  №1041949 282
>>1041932
В смысле крудопараша? Ты не понимаешь сути бекэнда и никогда не понимал. Нас никто не заставляет выбирать тот или иной фреймворк, также как и тебя не засталяют использовать ангуляр. На бекэнде есть куча вещей, которых никто не видит - парсинги XML файлов, всякие алгоритмы поиска, пагинации, различные абстракции и многое другое.
Ответы: >>1041959
Аноним 2017/08/10 15:03:02  №1041959 283
>>1041949
Сорян, я бекенд пишу. И всё, что ты описал, вкладывается в слово крудопараша. Парсинг xml ему программирование, а фронтенд нет, я хуею.
Ответы: >>1041967
Аноним 2017/08/10 15:15:07  №1041967 284
>>1041959
Фронтэнд вообще не нужен, через три года не будет никакого фронтэнда. Только HTML+CSS, джаваскрипт не нужен.
Ответы: >>1041970
Аноним 2017/08/10 15:20:08  №1041970 285
>>1041967
Апи из css дёргать будешь или из html?
Ответы: >>1041971 >>1042016 >>1042807
Аноним 2017/08/10 15:22:27  №1041971 286
>>1041970
Лолшто. Какой апи, куда дёргать, что ты несешь, наркоман?
Аноним 2017/08/10 16:31:25  №1042003 287
Подскажите с генератором имен пожалуйста. Как так возможно сделать чтобы рандомный индекс совпадал с рандомным значением? Или и так правильно?
http://codepad.org/g7q1F03u
Ответы: >>1042008 >>1042030 >>1042267
Аноним 2017/08/10 16:44:54  №1042008 288
>>1042003
> error_reporting(-1);
Да ты охуел.
Ответы: >>1042018
Аноним 2017/08/10 17:06:07  №1042016 289
>>1041970
Всё с тобой, с наркоманом, ясно. Пездуй!
Аноним 2017/08/10 17:16:22  №1042018 290
Аноним 2017/08/10 17:28:43  №1042028 291
>>1037758
есть проблема: ответ не совпадает с необходимым, хотя за каждый год добавляется 10% ко вкладу.
У меня выходит 72 года против 49 в учебнике ЧЯДНТ?
Ответы: >>1042055
Аноним 2017/08/10 17:31:10  №1042030 292
>>1042003
Почему \n не работает на компьютере(sublime xampp)? Приходится использовать <br>, в онлайн редакторах работает нормально.
Про генератор так и не понял, верно или нет.

Шифровка.
http://ideone.com/IEUykS
Аноним 2017/08/10 17:51:21  №1042043 293
>>1042030
> Про генератор так и не понял, верно или нет.
Не совсем понятно, что тебе нужно. Всё правильно же выводит.
Ответы: >>1042049
Аноним 2017/08/10 17:58:16  №1042049 294
>>1042043
Я не понимаю должно ли и если да, то как сделать чтобы при выводе номера соответствовали слогам по тому порядку, которому они записаны в массиве. Или там смысл просто в рандоме?
Ответы: >>1042054
Аноним 2017/08/10 18:01:41  №1042054 295
>>1042049
Но они и так соответствуют.
Ответы: >>1042059
Аноним 2017/08/10 18:02:39  №1042055 296
>>1042028
Попробуй в цикле считать возраст, вместо денег. И используй *=.
Ответы: >>1042069
Аноним 2017/08/10 18:05:16  №1042059 297
>>1042054
Как?
>Выпало число 2, слог дзу
Слог дзу никак не может быть под индексом два или где я сам себе мозги ебу?
Ответы: >>1042063
Аноним 2017/08/10 18:09:26  №1042063 298
>>1042059
> $letters = array(
> 'ко', 'и', 'дзу', 'ми',
0 => 'ко', 1 => 'и', 2=> 'дзу', 3 => 'ми'
Ответы: >>1042064
Аноним 2017/08/10 18:13:22  №1042064 299
>>1042063
Спасибо большое, запомнил теперь про 0. Значит верно.
Аноним 2017/08/10 18:25:18  №1042069 300
>>1042055
спасибо, но проблема оказалась в другом. я вместо 10 тысяч на старте прописал 1
Аноним 2017/08/10 18:36:55  №1042073 301
Как хорошо, что в пыхе нет такой хуйни как тысяча фреймворков
Ответы: >>1042074
Аноним 2017/08/10 18:39:17  №1042074 302
>>1042073
Есть, как минимум, десяток.
Аноним 2017/08/10 19:11:08  №1042090 303
>>1042030
Лев толстой, но что-то я в начале говно какое-то сделал, а потом только подсказку посмотрел, сейчас буду пытаться сделать по-человечески.
https://ideone.com/WWErg2
Ответы: >>1042168
Аноним 2017/08/10 21:26:59  №1042168 304
>>1042090
Не понимаю подсказку в уроке, совсем тугой, может кто объяснить?
>В каждый элемент массива мы кладем массив вариантов слова или строки, из которого надо сделать выбор: [$word1, $word2, $word3, ["\n"], ...]
То есть, нужно из этих трех массивов $wordi сделать один, а потом как-то, видимо через foreach пройти и взять по рандомному слову. Но не выходит! через слияние получается чушь. http://ideone.com/7QemuM
Ответы: >>1042190 >>1042246 >>1042251
Аноним 2017/08/10 22:09:12  №1042190 305
>>1042168
Извиняюсь, засрал тред. Опять Лев Толстой.
https://ideone.com/0TX8fS
Но опять, как я понимаю это не тот способ, что был в подсказке.
Ответы: >>1042240
Аноним 2017/08/10 23:54:26  №1042240 306
Ответы: >>1042243 >>1042246
Аноним 2017/08/11 00:10:58  №1042243 307
>>1042240
Спасибо. Реально круто!
Аноним 2017/08/11 00:13:35  №1042246 308
>>1042168

Идея такая: чтобы не писать руками однотипный код вида:

- выбрать случайно первое слово из первого массива
- выбрать случайно второе слово из второго массива
- ....

Мы вместо этого можем использовать цикл по массиву. То есть мы делаем массив такого вида:

$source = [
[массив вариантов первого слова],
[массив вариантов второго слова],
...
];

И обходим этот массив в цикле. На каждом шаге цикла мы берем массив вариантов N-го слова, выбираем из него одно слово и добавляем в стихотворение.

>>1042240

Давай ты свои негативные эмоции будешь где-нибудь в другом месте изливать?

Также, мне кажется не очень хорошая идея игнорировать часть ошибок с помощью error_reporting (легко убедиться, открыв мануал со списком видов ошибок). Я не понимаю, почему ты не хочешь выводить все ошибки? Не уверен в качестве кода?
Ответы: >>1042256
Аноним 2017/08/11 00:19:46  №1042251 309
>>1042168

Во-первых, операция + не совсем "склеивает" массивы, тебе нужен array_merge, посмотри мануал:

- http://php.net/manual/ru/function.array-merge.php
- http://php.net/manual/ru/language.operators.array.php

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

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

Тебе нужен массив из массивов (двухмерный массив): массив, содержащий в качестве элементов массивы из слов.

$source = [
['abc', 'def'],
['ghi', 'jkl'],
...
];

Аноним 2017/08/11 00:32:35  №1042256 310
>>1042246
Тогда последний вариант с циклом - самый подходящий и является близким к верному? Как проснусь буду пробовать через merge. Такое слияние через + увидел у котерова и стал ковырять, а до merge буквально пару страниц не дочитал.
Ответы: >>1042261
Аноним 2017/08/11 00:46:45  №1042261 311
>>1042256

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

>>1042030

\n работает, если открыть в браузере исходный код страницы (Ctrl + U) то там будет виден перенос строки. Просто по правилам языка разметки HTML перенос строки эквивалентен пробелу.

----

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

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

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

Иначе перенос строки будет в исходном коде страницы (его можно увидеть нажав Ctrl + U), но на самой странице его не будет.
Аноним 2017/08/11 00:59:31  №1042267 312
>>1042030

Расшифровка сделана неправильно: ты расшифровываешь не зашифрованный текст, а исходный. Надо расшифровывать содержимое $cipher

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

>>1042003

Все верно.

>>1041913

> ([ \-()])*
Здесь круглые скобки не нужны

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

Ответы: >>1042278 >>1042509
Аноним 2017/08/11 01:09:58  №1042271 313
>>1041738

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

>>1041725

Что значит "этой функцией занимается JS"? Какой?

Псевдоклассы нужны для применения CSS правил к элементам в определенном состоянии (:hover - при наведении мыши) или в определенном положении (:first-child - первый элемент среди соседних).

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


Аноним 2017/08/11 01:22:44  №1042278 314
>>1042267
почему {N} к [ \-()] не относится, они же в скобках?
Аноним 2017/08/11 01:51:18  №1042290 315
Foreach'ем по строкам нельзя проходиться, да?
Ответы: >>1042313 >>1042322
Аноним 2017/08/11 04:29:16  №1042313 316
>>1042290
Какой сложный вопрос, даже не знаю как долго ты гуглил перед тем как спросить в треде. Ладно уж, помогу перспективному программисту.
Ответы: >>1042983
Аноним 2017/08/11 04:48:09  №1042318 317
>>1041713

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

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

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

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

Нет. Каждый новый вызов exec запускает новый процесс. Чтобы передать что-то на вход команде, нужно передать ей данные на стандартный ввод (stdin).

Для начала, стоит разобраться, как работает ввод-вывод в linux. Когда программа хочет прочитать какие-то данные из файла или записать в файл, она открывает файл на запись или чтение (в PHP это делается функцией fopen) с помощью обращения к ядру linux. В случае успеха ядро создает "поток ввода-вывода" (абстракция, в которую можно писать или из которой можно читать данные) и возвращает файловый дескриптор этого потока ввода-вывода - целое число, которое является его идентификатором. Дескрипторы начинаются с нуля, то есть самый первый открытый процессом поток получит дескриптор 0, второй - дескрипитор 1 и так далее. Далее, программа делает чтение или запись вызовом функций fwrite/fread, передавая в них файловый дескриптор. Когда программа закончила операции с файлом, она закрывает (уничтожает) поток вызовом fclose().

В линуксе можно "открыть" на чтение/запись не только обычные файлы, но и так называемые "файлы устройств" (вроде /dev/console, /dev/sda1 или /dev/dsp). Для программы они выглядят как файлы, но чтение/запись в них приводит к передаче данных определенному драйверу устройства в ядре. Ну например, /dev/console соответствует, как следует название, консоли, и чтение/запись с этого устройства приводит к выводу текста в консоль или его вводу с клавиатуры. /dev/sda1 позволяет читать (или перезаписать) содерждимое жесткого диска посекторно, а /dev/dsp раньше позволял передавать данные драйверу звуковой карты и вопроизводить/записывать звук (сейчас это не работает). Есть еще и другие устройства, если интересно:

- https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B5%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D1%84%D0%B0%D0%B9%D0%BB_%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0
- http://rus-linux.net/lib.php?name=/MyLDP/proc/proc.htm
- http://gentoo.theserverside.ru/book/secrets_of_dev.html

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

Так вот, даже если программа не открыла ни один файл явно, предполагается, что ей при запуске родитель передаст 3 "стандартных" дескриптора: 0, 1, 2 - стандартный ввод (stdin), стандартный вывод (stdout) и поток для вывода ошибок/отладочных сообщений (stderr). Когда ты запускаешь что-то в консоли, то эти потоки соответствуют либо устройству /dev/ttyN (в случае запуска в реальной консоли) либо /dev/pts/N (эмулятору терминала в случае запуска в GUI терминале). Соответственно, программе не надо думать, откуда ей вводить и куда выводить данные по умолчанию - она использует стндартные потоки.

Ну например, echo в PHP выводит данные в поток 1 (stdout).

В Линукс при создании нового процесса он наследует список открытых файлов (дескрипторов) от родителя, потому какие-то специальные усилия прилагать для передачи этих дескрипторов не требуется. Если ты используешь GUI терминал, то при запуске программа-терминал создает виртуальную консоль (/dev/ptyN), открывает ее на чтение/запись и запускает оболочку (bash например), передавая ей полученные дескрипторы. Ну и соответственно, все, что запускается из bash, наследует эти стандартные дескрипторы, если ты только в команде не задашь перенаправление ввода-вывода.

Увидеть эти потоки можно, набрав команду ls /proc/self/fd -l . ls - это команда вывода списка файлов, однако здесь мы обращаемся к специальной файловой системе proc, которая предоставляет информацию о процессах в виде файлов, в данном случае /proc/self/fd - это псевдокаталог, который содержит "файлы", каждый из которых соответствует открытому файловому дескриптору текущего процесса (процесса ls). Вот что выводится у меня:

0 -> /dev/pts/1
1 -> /dev/pts/1
2 -> /dev/pts/1
3 -> /proc/8200/fd

Мы видим, что потоки 0-2 привязаны к псевдотерминалу, и есть еще поток 3, это видимо поток, открытый программой ls для каких-то своих целей (наверно, это поток для чтения списка файлов в каталоге - в линукс чтение списка файлов в каталоге тоже похоже по сути на чтение файла).

Соответственно, если ты хочешь, чтобы программа читала данные не с клавиатуры, ты должен перенаправить stdin, передав в качестве него дескриптор какого-то файла, например, так: command < file.txt. Тогда она будет читать данные из файла, а не с клавиатуры: http://xgu.ru/wiki/%D0%A1%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D1%8B%D0%B5_%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B8_%D0%B2%D0%B2%D0%BE%D0%B4%D0%B0/%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4%D0%B0

Вот пример команд, которые заставляют bash запустить программу ls с перенаправлением стандартных потоков:

touch /tmp/1.txt
ls /proc/self/fd -l < /tmp/1.txt 2> /tmp/2.txt

lr-x------ 0 -> /tmp/1.txt
lrwx------ 1 -> /dev/pts/1
l-wx------ 2 -> /tmp/2.txt
lr-x------ 3 -> /proc/8206/fd

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

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

- просто пайп (pipe), или "анонимный пайп", который создается в памяти
- именованный пайп (named pipe) или FIFO, который создается на диске и нам не очень интересен сейчас

Пайп при создании дает 2 дескриптора: в первый можно писать, из второго можно читать (то, что записано в первый). Родительский поток создает пайп, а затем запускает дочерний процесс, передав ему дескриптор чтения из пайпа в качестве stdin. И таким образом, дочерний процесс будет читать то, что запишет в пайп родитель. Более того, пайпы можно использовать и в обратную сторону - чтобы дочерний процесс в них писал, а родитель бы читал.

Пайп создает bash, когда ты используешь символ | . Например, команда

echo "Yes" | cat

Создаст пайп и 2 дочерних процесса (echo и cat). Она передаст один конец пайпа в качестве stdout для echo, а другой - в качестве stdin для cat.

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

- http://php.net/manual/ru/function.popen.php
- http://php.net/manual/ru/function.proc-open.php

Которые позволяют создать дочерний процесс, связанный через пайп(ы) с родителем. proc_open более гибкая - она позволяет явно указать, какие дескрипторы передать дочернему процессу. Используя ее, ты можешь создать процесс, stdin/stderr/stdout которого соединены пайпами с родителем, и ты получаешь полный контроль над вводимыми/выводимыми данными.
Ответы: >>1045400
Аноним 2017/08/11 04:48:40  №1042319 318
>>1041713

Правда, работать с этими функциями трудно. Ведь чтение/запись идет асинхронно и тебе надо следить за 3 пайпами, при любой ошибке твоя программа заблокируется, перестанет читать/писать в пайпы, и дочерний процесс так же заблокируется в ожидании готовности пайпа. Я когда-то писал такое, и там придется потратить время на отладку. Лучше использовать обертки вроде Symfony Process, которые берут эти сложности на себя и предоставляют простой интерфейс (впрочем, после опыта с ручным написанием я и в нем нашел пару косяков - например, в некоторых случаях передача данных через пайп идет медленно).

Но тут стоит остановиться и посмотреть, а нет ли блоее простого варианта? Может быть, gnupg просто позволяет указать параметры ключа в опциях командной строки? Гугление дает ответ:

- https://www.gnupg.org/documentation/manuals/gnupg/Unattended-GPG-key-generation.html
- https://gist.github.com/woods/8970150

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

Я тут конечно много букв написал, но это в любом случае важно знать, если ты хочешь запускать процессы. Советую поэксперименировать с запуском простых команд linux через Symfony Process, и перехватом их ввода/вывода.

exec() у тебя использован неудачно - ты даже не проверяешь код выхода (exit code) программы. А это надо делать, чтобы отслеживать ошибки при запуске/выполнении дочернего процесса.

В твоем примере ты не перенаправляешь ввод-вывод и процесс gpg унаследует потоки от php. При запуске в консоли он будет пытаться читать данные с консоли, при запуске внутри веб-сервера - читать из того, что сервер поставил себе как stdin.

Вторая команда exec('1') попытается запустить команду '1', это вызовет ошибку, которую ты скорее всего не увидишь, так как не отслеживаешь код выхода и поток ошибок дочернего процесса (разве что в логе ошибок ты увидишь что-то вроде sh: 1: command not found, так как PHP перенаправляет stderr программы в лог ошибок).

> Я попытался проверить, и в ответ получил пустую строку.
Тебе нужно правильно обрабатывать ошибки, чтобы видеть сообщения о них, а не гадать.

> Думаю, это потому что нет доступа для пользователя www-data.
Это вряд ли, так как gpg создает файлы в домашнем каталоге пользователя, который обычно доступен ему на запись. Хотя, кто знает, где у www-data домашний каталог (нужно посмотреть в /etc/passwd).

> Так сложно ещё никогда не было.
Это из-за не очень сильного знания линукса.

> Что за глупость? Может мне ещё адрес проживания указать?
Я думаю, что реальное имя указывать не требуется, ник или числовой id вполне сойдет. Как и email.

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

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

Вот тут вроде похожий случай описан: https://serverfault.com/questions/691120/how-to-generate-gpg-key-without-user-interaction

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

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

- https://habrahabr.ru/company/mailru/blog/273147/
- https://www.linux.org.ru/forum/talks/12608246
- https://wiki.archlinux.org/index.php/Random_number_generation
- https://www.8host.com/blog/ispolzovanie-prostogo-demona-entropii-haveged/

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

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

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

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

Я тут погуглил, нашел еще это:

- https://paragonie.com/book/pecl-libsodium
- https://github.com/jedisct1/libsodium-php

Я правда с этой библиотекой не сталкивался и ничего про нее не знаю.

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

Вот еще вопросы на SO:

- https://stackoverflow.com/questions/9262109/simplest-two-way-encryption-using-php

И вот еще, может тут есть что-то полезное: https://www.owasp.org/index.php/Guide_to_Cryptography

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

Ответы: >>1045400
Аноним 2017/08/11 04:49:15  №1042320 319
>>1040147

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

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

class Api {
// Получить последние N сообщений
function loadLastMessages(limit) { ... } // -> Promise<MessageBatch>

// Получить новые сообщения после since через API
function loadNewMessages(since) { ... } // -> Promise<MessageBatch>
}

// Контроллер - пишем код прямо в него, кто нам запретит
class SomeCtrl {
init() {
api.loadLastMessages(SOME_LIMIT).then(
function (batch) {
that.renderBatch(batch); // вывести полученные сообщения
that.queueRefresh(batch.lastUpdate)
},
this.handleLoadError(...).bind(this)
);
}

queueRefresh(lastUpdate) {
setTimeout(function () { that.loadNewMessages(lastUpdate); }, SOME_TIMEOUT);
}

loadNewMessages(lastUpdate) {
api.loadNewMessages(since).then(
function (batch) {
that.renderBatch(batch);
that.queueRefresh(batch.lastUpdate)
},
this.handleUpdateError(...).bind(this)
);
}
}

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

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

Теперь попробуем запилить то же, но с моделью. Мы перенесем получение и обновление данных в модель, и используем паттерн observer (взял первое, что пришло в голову):

class MessageListModel {

construct () {
// Событие получения новых сообщений
this.updateEvent = new EventEmitter;

// Событие изменения статуса связи (успешная/идут ошибки)
// Используется для вывода иконок и уведомлений о проблемах
// с соединением с сервером.
this.statusChangeEvent = new EventEmitter;

// Пдробная информация об ошибках со связью
this.errorEvent = new EventEmitter;

// Время последнего обновления
this.lastUpdate = null;
},
// Подписка на события обновления списка сообщений
// обновления будут приходить только после загрузки
// начальных сообщений
subscribeToUpdates(callback) { // -> eventId
this._startUpdateLoop();
return this.updateEvent.subscribe(callback);
},
// отписка
unsubscribeFromUpdates(eventId) {
this.updateEvent.unsubscribe(eventId);
this._stopUpdateLoopIfNoSubscribersExist(); // надеюсь суть понятна из названия
},
// Получить последние N сообщений
getLastMessages(limit) { // -> Promise<MessageBatch>, никогда не реджектится
var result = new Promise(function (resolve, reject) {
this._loadLastMessages(limit, resolve);
});

return result;
},

// Отправляет запрос на получение сообщений
_loadLastMessages(limit, resolver) {
api.getLastMessages(limit).then(
function (batch) {
this.setConnectionStatus(true);
this.lastUpdate = batch.updateTime;
resolve(batch);
},
function (error) {
this.errorEvent.emit(error);
this.setConnectionStatus(false);
setTimeout(function () {

that._loadLastMessages(limit, resolver);

}, RETRY_TIMEOUT);
}
);
},

// Запускает процесс обновления данных
_startUpdateLoop() {
if (loop is started) {
return;
}

this._queueUpdate();
},

_stopUpdateLoopIfNoSubscribersExist() {
...
},

_cancelUpdateTimeout() {
....
},

_queueUpdate() {
this.timeoutId = setTimeout(
function () { that._loadMoreMessages(); },
SOME_TIMEOUT
);
},

_loadMoreMessages() {
if (!this.lastUpdate) {
// Мы еще не получили начальный набор сообщений
this._queueUpdate();
return;
}

api.loadNewMessages(this.lastUpdate).then(
function (batch) {
this._setConnectionStatus(true);
this.updateEvent.emit(batch, false);
this.lastUpdate = batch.updateTime;
this._queueUpdate();
},
function (error) {
this.errorEvent.emit(error);
this._setConnectionStatus(false);
this._queueUpdate();
}
)
}
}

Тут я вижу недостаточек: мы храним время последнего обновления в поле this.lastUpdate, и это затрудняет понимание кода и проверку правильности. Так как трудно понять, в какой момент там хранится какое значение. Можно ли уже его использовать или нет? Из-за этого мы ставим костыль с проверкой его на не-пустоту в _loadMoreMessages(). То есть везде, где оно используется, мы в теории должны лепить такую проверку, иначе есть риск допустить ошибку.

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

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

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

Кода правда стало чуть больше, но хорошая архитектура не дается бесплатно.

Вот пример использования модели в контроллере. При инициализации мы просто пописываемся на интересующие нас события:

class SomeCtrl {
init() {

this.renderConnectionStatus(STATUS_LOADING);

// Обрабатывать ошибки не требуется, это делает модель
this.msgListModel.getLastMessages(SOME_LIMIT).then(function (batch) {
this.renderInitialMessages(batch);
});

this.msgListModel.onConnectionStatusChange(function (newStatus) {
this.renderConnectionStatus(newStatus);
});

this.msgListModel.subscribeToUpdates(function (batch) {
this.renderNewMessages(batch);
this.deleteOldMessages();
});
}
}

Желательно также во view предусмотреть ограничение числа сообщений и удалять старые по мере добавления новых, чтобы DOM и потребление памяти не росли неограниченно при долгой работе (чем больше узлов DOM, тем медленнее все будет работать).
Аноним 2017/08/11 04:50:13  №1042321 320
>>1040147

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

Вообще, код довольно топорный, так что тут можно подумать, как его можно улучшить. Ну например, есть такая штука как "реактивное программирование" (FRP). Не пригодится ли оно тут?

- https://gist.github.com/staltz/868e7e9bc2a7b8c1f754 (я что-то такое вроде читал когда-то, но ничего не помню)
- http://reactivex.io/intro.html
- http://reactivex.io/rxjs/

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

Более того, вроде есть библиотеки и шаблонизаторы, заточенные на работу с Observables.

Соответственно, наш список сообщений может быть смоделирован с помощью observable - первое событие в нем это начальный список сообщений, а последующие события - это обновления. Мы можем представить его как список блоков сообщений (Observable<MessageBatch>), или список отдельных сообщений (Observable<Message>). Что лучше, я не знаю.

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

// Святые угодники, вы только посмотрите на этот интерфейс
// и сравните с первой версией кода!
class MessageListModel {
getMessagesStream(initalCount) { .. } // -> Observable(Message)
getConnectionStatusStream() { ...} // -> Observable(NetworkStatus)
}

class MessageListCtrl {
init(msgListModel) {
msgListModel.getMessagesStream(INITIAL_COUNT).subscribe(function (message) {
this.appendMessage(message);
// можно this.view.appendMessage, это не принципиально
});

msgListModel.getConnectionStatusStream().subscribe(function (status) {
this.displayNetworkStatus(status);
});
}
}

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

Вот тут кстати есть интересный момент. Мы передаем initialCount, значит если мы сделаем 2 вызова:

var stream1 = model.getMessagesStream(10);
var stream2 = model.getMessagesStream(20);

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

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

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

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

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

Код наверно съедет, потому вот ссылка на нормальный отформатированный пост с подсветкой: https://gist.github.com/codedokode/6dfde1f0ec3d895bc940b67e7919cc29

Аноним 2017/08/11 04:51:37  №1042322 321
>>1042290

Можно наверно, но ты будешь получать байты, а не буквы. Так как в utf-8 буква занимает от 1 до 6 байт, а foreach про это не знает. Смысла нет.
Ответы: >>1042323
Аноним 2017/08/11 05:05:07  №1042323 322
Ответы: >>1042342
Аноним 2017/08/11 08:45:56  №1042342 323
Ответы: >>1042444 >>1042463
Аноним 2017/08/11 08:49:04  №1042343 324
<form enctype="multipart/form-data" action="__URL__" method="POST">
<!-- Поле MAX_FILE_SIZE должно быть указано до поля загрузки файла -->
<input type="hidden" name="MAX_FILE_SIZE" value="30000" />
<!-- Название элемента input определяет имя в массиве $_FILES -->
Отправить этот файл: <input name="userfile" type="file" />
<input type="submit" value="Send File" />
</form>

Поясните как отправить файл на сервер БЕЗ нажатия на кнопку "отправить", а после выбора файла на компе и нажатия кнопки "открыть".
Все примеры что гуглятся идут именно с такой допотопной системной и сабмитом "отправить".
Ответы: >>1043040
Аноним 2017/08/11 11:19:02  №1042444 325
>>1042342

Разбить строку на массив символов (точнее, unicode codepoints) еще можно так

preg_split('//u', $string, null, PREG_SPLLIT_NO_EMPTY);

// соответствует промежутками между символами и разбивает строку на символы
NO_EMPTY убирает 2 пустых элемента, получающихся в начале и конце массива
Ответы: >>1042463
Аноним 2017/08/11 12:07:54  №1042463 326
>>1042342
>>1042444

--МОЖНО ЛИ ФОРИЧЕМ ОБОЙТИ СТРОКУ
@
-НЕТ, ТОЛЬКО МАССИВ\ОБЪЕКТ, ВОТ ПРУФ:
@
--РЯЯЯ, НЕТ МОЖНО, СМОТРИ КАК Я МОГУ
@
РАЗБИВАЕТ СТРОКУ НА МАССИВ И КОРМИТ ЕГО ФОРИЧУ

Блядь как же я проорал с этой логики, но энивей молодца. В этом и есть дух программизма.
Аноним 2017/08/11 12:24:36  №1042469 327
Норот.
Помогите с проблемой.
Кароч есть скрипт для CLI. Изначально был сделан для работы в связке с AJAX. AJAX продолжал вызывать скрипт с разными параметрами, пока не было встречено определенное условие. Затем поставили задачу переделать под работу с CRON. CRON подходит в качестве инициатора, но не связующего звена, т.к. может выполняться не чаще раза в минуту, а скрипт должен вызывать сам себя, как только текущая операция завершена.
Сделал следующее:
передал register_shutdown_function коллбэк, в котором делаю дисконнект с БД и затем использую команду passthru, чтобы начать следующую итерацию.
В итоге столкнулся с проблемой "открыто слишком много файлов". Скрипт выполняет под рутом и где-то на 50-ой итерации php крашится, т.к. рут превышает ulimit использования файлов.
Подозреваю, что это вызвано тем, что изначальный скрипт никогда толком не завершается и ждет результата выполнения passthru. По сути, получается рекурсия, которая сжирает ресурсы.
Вопрос: как решить задачу связывания вызовов скрипта и при этом высвобождать ресурсы?
Ответы: >>1042486 >>1042492 >>1042596
Аноним 2017/08/11 13:00:50  №1042486 328
>>1042469
Где-нибудь вне функции:

while(true) {
myFunc();
}
Ответы: >>1042492 >>1042495
Аноним 2017/08/11 13:07:47  №1042492 329
>>1042486
>>1042469
В общем, на freenode ##php порекомендовали в passthru передавать в следующем виде
>nohup php thescript.php >/dev/null 2>&1 &
Таким образом вывод от работы скрипта уходит "в никуда", а сам скрипт запускается в фоновом режиме. инициатор получает пустой вывод от работы вызванной команды и благополучно закрывается.
Ответы: >>1042494
Аноним 2017/08/11 13:10:55  №1042494 330
>>1042492
PHP-то всё равно падать будет (только теперь ты об этом не узнаешь).
Ответы: >>1042533
Аноним 2017/08/11 13:11:27  №1042495 331
>>1042486
Не сработает это. У него скрипт тупо превысит лимит выполнения и тупо крашнется или если быть упоротым и пытаться бесконечно выполнять скрипт отключив лимиты в конфигах, то всё равно похоже дело не взлетит. Идеально конечно же дергать пхп аяксом, и получая ответ о завершении дергать опять и так до бесконечности.

Вот нагуглил тему, советую прочитать. https://php.ru/forum/threads/beskonechnyj-skript-kak-sdelat.29629/page-2 Там автор как-то замутил что бы два скрипта дергали сами себя по кругу, мб нашему товарищу это подойдет.
В итоге полагаю что проблема засерания памяти и краша из-за превышения таймаута исчезает.
Ответы: >>1042496
Аноним 2017/08/11 13:13:29  №1042496 332
Ответы: >>1042497
Аноним 2017/08/11 13:14:57  №1042497 333
>>1042496
Я хоть погуглил, а ты хуй. Иди на себя.
Ответы: >>1042501
Аноним 2017/08/11 13:21:05  №1042501 334
>>1042497
Какое-то окаменевшее говно мамонта за прошлый век нашел и сидит довольный.
Ответы: >>1042506
Аноним 2017/08/11 13:32:17  №1042506 335
>>1042501
>Думает что с каждой версией пхп кто-то будет переписывать какие-то фундаментальные вещи.

Ебать ору с дауна.
Ответы: >>1042507
Аноним 2017/08/11 13:34:53  №1042507 336
Аноним 2017/08/11 13:36:34  №1042509 337
>>1042267
Про расшифровку очень сложно, он проходит по символу например "1185" и дешифрует как "11_8_5, вместо "1_18_5". Как жить то? Логика не ясна
http://ideone.com/a74KGq
Ответы: >>1042599
Аноним 2017/08/11 14:03:23  №1042533 338
>>1042494
Тесты показали, что не падает. Благополучно работает. Вывод в файл сделал. Туда же можно отладочную инфу.
Аноним 2017/08/11 16:12:39  №1042596 339
>>1042469

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

Если тебе надо выполнять задачи в фоне, то нужен демон вроде gearman https://ruhighload.com/index.php/2010/07/09/gearman-%D0%B8-php-%D0%B0%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5-%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/

Он вроде даже позволяет отслеживать прогресс выполнения фоновой задачи.

Ну и конечно, надо проверить, что там задачи не теряются даже при ошибках, падениях скрипта и тд.
Ответы: >>1042600
Аноним 2017/08/11 16:19:04  №1042599 340
>>1042509
>Логика не ясна
Ну ты сам сделал такой шифр который можно обратно понимать двусмысленно.
у тебя are превращается в 1185 который можно дешифровать в итоге двумя способами.

Судя по твоему примеру компилятор делает замены в словах с конца, при этом ищет наиболее длинное совпадение.
То есть он видит 1185
и сначала видит что есть 5, для неё есть замена в твоем шифре - e
идет дальше, смотрит есть ли для комбинации из 5 и предудущего символа замена - для 85, такой не находит. Значит решает что 5 - это e

Ок го некст - 8 это h
Но после этого он опять идет проверять дальше, и смотрит что есть замена не просто для 8, а для 18, а вот для 118 уже нету и стало быть решено что 18 меняем на r

Ну и остается только 1, которую никуда не деть кроме как заменить на a

Вот малость подшаманил с твоим кодом, и смотри что получается: http://ideone.com/0q49n2

Всё так и работает. Ищет совпадения начиная с конца а не с начала. В общем у тебя ошибка не в коде, а в логике шифра, что ты допустил двусмысленность.
Аноним 2017/08/11 16:19:33  №1042600 341
>>1042596
Исполнение в цикле предполагает серьезное переписывание скрипта.
Gearman тоже рекомендовали. Потом гляну. Спс.
Аноним 2017/08/11 21:09:23  №1042807 342
>>1041970
>API из CSS или HTML
А че нельзя чтоле? По сути есть HTML5.2, CSS3, SVG и JS На-ху-й не-ну-жен ибо половину функций уже вхуярили в HTML (В том числе и ваше ебаное API), страшно подумать что в будущем сделают.
Ответы: >>1042810
Аноним 2017/08/11 21:11:08  №1042810 343
>>1042807
Хотя в HTML и современный CSS3 вписывают упрощенки всякие.
Аноним 2017/08/12 08:19:42  №1042966 344
А есть ли разница между установкой размера шрифта в px и em, кроме той, что em отталкивается от значения родителя?

Просто замечаю, что при вёрстке с psd-макетов, значения в пикселях из макета зачем-то переводят в em, хотя смысла в этом получается нет и только тратится время.
Ответы: >>1042968 >>1042969 >>1044560
Аноним 2017/08/12 08:35:10  №1042968 345
>>1042966

Родитель тут не при чем. Ты просто выражаешь свои намерения.

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

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

Ну например, если ты хочешь, чтобы у заголовка был отступ снизу, строго равный высоте текста заголовка, ты пишешь 1em.

А если ты например хочешь, чтобы ширина блока была равна половине ширины родителя, ты пишешь 50%.

Плюс em в том, что если завтра ты решишь увеличить размер шрифта на сайте, заданные в em размеры элементов изменятся пропорционально. Ну и при чтении видно, что размер элемента привязан к размеру символов.

То есть выбор величины определяется логикой, по которой рассчитывается размер элемента, привязан он к размеру шрифта, еще чему-то или нет. На практике по моему это довольно редко нужно (если не согласны, приведите мне примеры, где это нужно).
Аноним 2017/08/12 08:36:50  №1042969 346
>>1042966

А вообще, в верстке очень много неграмотных людей, которые ничего не понимают, а просто бездумно копируют то, что написано в какой-нибудь статье на сайте для фронтендщиков. Когда я смотрю чей-то чужой CSS/JS код, мне хочется разбить лицо рукой. Понабирали вкатывальщиков.
Ответы: >>1043059
Аноним 2017/08/12 09:31:06  №1042982 347
Очередной вкатывальщик в треде.
Сделал классическую "считалочку": http://ideone.com/RxqmIo
Чё там происходит: массив с позициями участниками перебирается циклом с двумя счётчиками - один отсчитывает количество слогов, когда они заканчиваются, маркирует позицию крестиком; второй непосредственно "проходится" по массиву и переводит отсчёт на начало строки, когда его значение превышает длину массива. (типа по кругу ёпт...)
В какой-то момент я подумал, что можно задать рекуррентное соотношение, доказать его и тупо вставлять переменные в формулу, но я слишком тупой для этого. Короче, там можно было проще сделать или нет?
Ответы: >>1043985
Аноним 2017/08/12 09:34:41  №1042983 348
>>1042313
Да я заметил, что нельзя, просто это гнойно пиздец. Всё равно строки индексируются, могли бы и сделать.
Ответы: >>1043529
Аноним 2017/08/12 11:25:45  №1043040 349
Аноним 2017/08/12 12:01:39  №1043059 350
>>1042969
Я вот думаю, это привычка с xml или просто нежелание учиться семантике? Кому тогда драфты хуеву тучу пишут на консорциуме?
Ответы: >>1043536
Аноним 2017/08/12 14:30:49  №1043125 351
буду писать нейроночку на пхп :3
Ответы: >>1043534
Аноним 2017/08/12 16:10:26  №1043190 352
бляя, я не знаю как установить Fann на винду ((
Ответы: >>1043252
Аноним 2017/08/12 18:33:19  №1043252 353
>>1043190
Через PECL, например.
Ответы: >>1043267
Аноним 2017/08/12 19:16:15  №1043267 354
>>1043252
БЛЯТЬ КАК Я НЕНАВИЖУ ВИНДУ ЭТА ЕБЛЯ С БУБНОМ ПРИ УСТАНОВКЕ КАЖДОГО ЭКСТЕНШЕНА.
НАДО БУДЕТ ФЛЕШКУ КУПИТЬ И ЗАПИСАТЬ НА НЕГО ОБРАЗ УБУНТЫ СИЛ НЕТ
Аноним 2017/08/12 20:15:56  №1043298 355
привет!
ребят, подскажите пожалуйста, а как вот на PHP cURL сделать вот такое:
curl -F [email protected]/path/to/file.txt "http://localhost:5001/ipfs/api/v0/add?recursive=false"
как вот именно -F (--form) бахнуть? Не могу понять что тут получается.
это же POST запрос вроде бы получается такой
Аноним 2017/08/13 04:35:17  №1043526 356
Няши, не знаете случайно какой нибудь крутой сайт с набором шаблонов для верстки, вместе с PSD?
Аноним 2017/08/13 04:57:36  №1043529 357
>>1042983
Индексируются там байты. Обращаться к элементу строки как к элементу массива можно только когда там однобайтная кодировка и каждый байт совпадает с 1 символом поэтому прокатывает такое:

$a = 'asdfe'
echo $a[3];
//f

На таком ты уже пролетаешь:

$a = 'йцукенг'
echo $a[3];
//нихуя
Ответы: >>1044407
Аноним 2017/08/13 07:00:41  №1043533 358
От чего зависит скорость загрузки страницы, от сервера или все же от кода? Да я рак.
Ответы: >>1043535 >>1043567
Аноним 2017/08/13 07:15:56  №1043534 359
Аноним 2017/08/13 07:17:50  №1043535 360
>>1043533
И от сервера, и от кода.
Ответы: >>1043567
Аноним 2017/08/13 07:20:00  №1043536 361
>>1043059
Лол, какая привычка для типикал вкатывальщика
Аноним 2017/08/13 10:52:06  №1043567 362
>>1043535>>1043533
Еще от того какие там запросы в базу идут и как быстро она их отдает. Там еще различают скорость выполнения запроса, и скорость доставки.
Аноним 2017/08/13 11:26:40  №1043579 363
Пару недель назад анон тут >>1029961 просил проверить задачи про опечатки, вывод числа, и тд. С запозданием, но все же проверил: >>1043577

Аноним 2017/08/13 12:24:09  №1043617 364
>>1025540

Ответ на старый вопрос про чат.

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

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

По твоему CSS - я плохо понимаю логику.

> position: absolute;
> top: 70%;
Почему именно 70%? Не проще ли просто bottom: 0?

Ты ведь вроде делал мои задачи на HTML, значит, ты наверно сможешь решить проблему. Давай начнем с простой задачи (реально простая):

- есть див известной высоты (например, 300px или 100% от высоты страницы)
- в него вложено содержимое неизвестной высоты
- если оно маленькое, оно должно прижиматься к низу контейнера
- если содержимого много, то должна появляться прокрутка

Затем задачу можно усложнить:

- имеется див-контейнер определенной высоты (например, 300px или 100% страницы)
- в нем внизу есть область фиксированной высоты (для отправки сообщений), например 200px (еще более сложная версия: область, высота которой не задана, а определяется содержимым)
- в оставшейся области должны выводиться сообщения как в предыдущей задаче

Я в том сообщении ( https://2ch.hk/pr/res/1000416.html#1007389 ) предложил возможные подходы, нужно просто их перебрать и посмотреть, реально их тут применить или нет. Если вообще никак, то придется использовать вычисление высоты через яваскрипт (с пересчетом при ресайзе окна), но конечно средствами CSS решить эту задачу было бы гораздо лучше (но в реальных задачах иногда приходится прибегать и к яваскрипту).

Также, мне не нравится вот это:
> resize: none;

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

Кстати, для прокрутки списка сообщений в конец можно еще использовать интересный метод scrollIntoView: https://developer.mozilla.org/ru/docs/Web/API/Element/scrollIntoView (там написано, что это экспериментальный метод, но это относится только к опциям, без опций код работает даже в ИЕ6. то есть реально везде).
Ответы: >>1045770
Аноним 2017/08/13 12:45:56  №1043639 365
Вот еще на один старый вопрос не ответил:

>>1025530

> В файлообменнике сущность файл должна агрегировать массив сущностей комментариев? Если да, то класс FileGateway должен агрегировать CommentGateway?

Хороший вопрос.

Логика понятна: если у файла есть комментарии, то логично бы иметь массив комментариев внутри объекта-файла. Но если попытаться воплотить это в реальности, то возникнет проблема: мы теперь должны при загрузке файла загружать все комментарии к нему, даже если они нам не нужны. Хочешь вывести 10 последних файлов - загрузи 1000 комментариев к ним. Очень неэффективно.

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

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

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

function getFileById($id) {
...
$data = $pdo->fetch();
$file = new File;
$file->id = $data['id'];
$file->name = $data['name'];
$file->size = $data['size'];
$file->comments = new CommentsCollectionProxy($file->id, $commentsGateway);
return $file;
}

При этом получение комментариев будет выглядеть так:

// метод getAll вызывает обращение к БД и загрузку комментов в прокси-объект
$comments = $file->comments->getAll();

// Возвращает ранее сохраненный масив комментариев
$comments = $file->comments->getAll();

а еще можно делать например так:

// делает запрос SELECT COUNT(...) и сохраняет результат внутри объекта
$count = $file->comments->getCount();

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

Вообще "прокси" называют объект, который подменяет другой объект, перехватывая все вызовы к нему. В нашем случае CommentsCollectionProxy является чем-то вроде прокси для массива комментариев (а не для объекта).

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

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

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

> Если да, то класс FileGateway должен агрегировать CommentGateway?
Я бы не назвал это "агрегацией", но да, FileGateway может содержать ссылку на CommentGateway. Агрегация - это отношение вида "целое - часть", но CommentGateway не является частью FileGateway, он просто содержит ссылку на этот объект.


Аноним 2017/08/13 13:16:20  №1043660 366
И еще, ответил в старом треде на старый вопрос про форму комментариев в файлообменнике: >>1043657
Аноним 2017/08/13 15:55:18  №1043769 367
Задания по верстке с гитхаба ОПа проверить можно? Кинуть на почту или здесь ссылки оставить?
Ответы: >>1043773
Аноним 2017/08/13 15:57:06  №1043773 368
>>1043769

Здесь оставить ссылки.
Аноним 2017/08/13 18:04:01  №1043881 369
Что происходит в этой функции?

echo random_int(0, 1) ? -1 : 1;

Почему тернарный оператор возвращает -1 или 1 независимо от того, выпал 0 или 1??
Ответы: >>1043912 >>1044012
Аноним 2017/08/13 18:29:49  №1043912 370
Аноним 2017/08/13 19:39:32  №1043985 371
>>1042982
Это задача Иосифа Флавия.
Ответы: >>1044403
Аноним 2017/08/13 20:08:20  №1044012 372
>>1043881
это что-то из учебника, чтобы ты понял приведение типов:
0 == false
1 == true

1 и -1 возвращает не новое слово, которое ты только что выучил, а echo.
Ответы: >>1044014
Аноним 2017/08/13 20:08:47  №1044014 373
>>1044012
и не возвращает, а выводит, но не суть
Аноним 2017/08/13 20:28:41  №1044028 374
Ответы: >>1044030
Аноним 2017/08/13 20:31:18  №1044030 375
>>1044028
Осталось дело за малым - PHP в браузере запустить.
Ответы: >>1044043
Аноним 2017/08/13 20:50:53  №1044043 376
>>1044030
Скоро можно будет, было бы зачем
Ответы: >>1044048 >>1044099
Аноним 2017/08/13 20:53:12  №1044048 377
>>1044043
Я имею ввиду грядущую WebAssembly;
Кто-нибудь из гуру, скомпилируйте PHP под выполнение там, когда время будет?
Ответы: >>1045018
Аноним 2017/08/13 21:06:05  №1044063 378
Привет, аноны.
Хочу сделать следующее:
Чтобы было меню статичное и чтобы в этом меню я мог выбрать, например, калькулятор или что-нибудь проще, типа перевода из одной системы единиц в другую, ну вы понели.
Как это делать? Ajax, фреймы?
Ответы: >>1044065
Аноним 2017/08/13 21:08:45  №1044065 379
>>1044063
фреймы уже не модно (но можно),

без них -- ajax, либо, если у тебя немного инфы, можешь прямо на одной странице по клику на пункт меню показывать с помощью js+css нужный блок и скрывать ненужные остальные.
Ответы: >>1044131
Аноним 2017/08/13 21:50:21  №1044099 380
>>1044043
Должен остаться только один ©
Аноним 2017/08/13 22:19:45  №1044131 381
>>1044065
Если блоки будут hidden, то они не будут налазить друг на друга?
Ответы: >>1044147
Аноним 2017/08/13 23:30:12  №1044147 382
>>1044131
Если правильно сделаешь, то не будут.
Ответы: >>1044155
Аноним 2017/08/13 23:39:11  №1044155 383
>>1044147
я имею ввиду, правильно спозиционируешь в css

олсо, при использовании display:none такие блоки вообще не влияют на остальные
Ответы: >>1044157
Аноним 2017/08/13 23:56:30  №1044157 384
>>1044155
Во, спасибо.
display: none;
Аноним 2017/08/14 01:57:20  №1044204 385
Ребят, пытаюсь файл загрузить через форму и переместить его в отдельную папку. Когда делаю это через move_uploaded_file, то при попытке этот файл открыть/изменить мне пишет, что у меня нету доступа. Когда делаю все через copy, то все открывается. Почему ?
Ответы: >>1044210
Аноним 2017/08/14 02:15:16  №1044210 386
>>1044204
Помогла смена дефолтной директории временного хранения файлов на свою (upload_tmp_dir в php.ini)
Аноним 2017/08/14 03:24:38  №1044216 387
Сап, не знаю куда писать, напишу сюда, сильно не пинайте.

Проработал в одной компании 10 лет, разрабатывал мимоходом для них всякое ПО на PHP+Mysql особо навороченные системы которые (одну из которых) ВНЕЗАПНО сейчас стали использовать по всему миру (В 2016 внедрили в Индии, США, Нидерландах, Малайзии ну и в России) Потому что то, что писал я опять же ВНЕЗАПНО, не падает и тупит процентов на 90 меньше всего остального (я у мамы байтоёб). Соответственно сейчас настало время воровать трактор и уплывать на нём в Канаду и я заблаговременно готовлю резюме. А посему вопрос.
Как можно в Резюме упомянуть это ПО, не в даваясь в подробности, вообще можно о таком упоминать? И можно ли рассказывать о функционале ПО? Можно говорить какие технологии использовались? Я просто никогда до этого не прыгал по вакансиям, почти всю жизнь на одном месте и хотелось бы у более опытных людей узнать что к чему. Или лучше написать что так мол и так, разработал такую штуку, но коммерческая тайна не позволяет рассказывать подробности.
Ответы: >>1044243
Аноним 2017/08/14 07:15:55  №1044243 388
>>1044216
непонятно, жалуешься ты или хвастаешься, но вопрос скорее к юристам. Если всё так, чому не переведёшься в канадский офис своей конторы?
Ответы: >>1044246
Аноним 2017/08/14 07:23:35  №1044245 389
За что все так ненавидят php? И насколько он сейчас востребован?
И с чего лучше начать - пхп или жс?
Ответы: >>1044247 >>1044248
Аноним 2017/08/14 07:28:13  №1044246 390
>>1044243
Могут трансфернуть через полтора года в Техас или ОАЭ, но я хочу именно в Канаду. А там у нас 1 проект и полтора айтишника.
Относительно проекта, я подписывал документы о неразглашении, но не знаю относится ли это именно к проекту. Ну и могу я тогда в резюме просто рассказать мол разработал такой вот проект но подробностей не скажу ибо коммерческая тайна. Это ведь не будет выглядеть странно?
Ответы: >>1044250
Аноним 2017/08/14 07:30:48  №1044247 391
>>1044245
>насколько он сейчас востребован?
Веб стек на 90% состоит из PHP.
>За что все так ненавидят php?
Рашкинский менталитет. Никто не хочет конкуренции. Не стоит слушать хейт. PHP - это всего-лишь инструмент. Если этим инструментом удобно работать - работай. Если бы PHP был бы хоть на 10% настолько плох как про него говорят, никто-бы его не использовал.
>И с чего лучше начать - пхп или жс?
Это разные как-бы вещи. Если ты во фронтенд, то жс, если бэкэнд, то PHP. Решать тебе.
Ответы: >>1044253
Аноним 2017/08/14 07:31:15  №1044248 392
>>1044245
В первую очередь за его долю в 80% рынка

Вкатывальщики уже в принципе не нужны,
а начинать надо не с языка, а с теории и общих основ. Ну может быть в PHP более понятное ООП и в последних версиях type hinting а-ля Java. Если JavaScript -- то хотя бы с TypeScript.
Ответы: >>1044253 >>1044255
Аноним 2017/08/14 07:33:06  №1044250 393
>>1044246
Ну и попроси трансфер в канадский офис, будешь сидеть с этими полуторами айтишниками?

Изучи, что ты там наподписывал, и проконсультируйся с юристом.
Ответы: >>1044251
Аноним 2017/08/14 07:33:45  №1044251 394
Аноним 2017/08/14 07:43:56  №1044252 395
Принес задачу желающим немного размяться. Если есть вопросы то спрашивайте.
Аноним 2017/08/14 07:52:15  №1044253 396
>>1044248
>Вкатывальщики уже в принципе не нужны
Хочешь сказать, что вкатиться в профессию уже нельзя?
>а начинать надо не с языка, а с теории и общих основ.
О чем ты конкретно? Теория и основы рассказываются в учебниках по любому языку.
>>1044247
>Это разные как-бы вещи.
Я понимаю. Под "лучше" я имел в виду "больше вакансий, выше з/п, интереснее работать".
Нет, я не хочу "и рыбку съесть..", просто хочу представлять реальную картину.
Ответы: >>1044255 >>1044256 >>1044316
Аноним 2017/08/14 08:01:35  №1044255 397
Ответы: >>1044268
Аноним 2017/08/14 08:18:30  №1044256 398
>>1044253
Вакансии в основном идут сразу и на то и на то, редко кому-то нужны чисто JS или PHP.
Аноним 2017/08/14 08:57:24  №1044268 399
>>1044255
потому что ты решил повыёбываться, очевидно %)
Аноним 2017/08/14 10:15:57  №1044316 400
>>1044253
можно, конечно, но будет примерно как в начале нулевых, когда до плебса дошло, что выгодно быть юристом-экономистом, кекус
Аноним 2017/08/14 10:45:42  №1044351 401
Господа, почти доделал задачу по ООП "Вектор", но вот что то последняя функция не хочет работать, когда без класса и функции делал, все считало и выводило, хотел оптимизировать все, сделать через класс, с автоматическим созданием объектов, но чет накосячил, сейчас не могу разобраться что надо сделать, помогите, сам код: https://ideone.com/jd5aXv
Осталось совсем чуток блин, все считает идеально правильно, как же я намучился с этой задачей
Аноним 2017/08/14 11:37:58  №1044374 402
Объясните пожалуйста. Если ширина меню слева 200px, почему тогда она такая узкая?
Ответы: >>1044376 >>1044378 >>1044379
Аноним 2017/08/14 11:41:07  №1044376 403
Ответы: >>1044377
Аноним 2017/08/14 11:43:31  №1044377 404
>>1044376
стрелка/меню/боковая панель
Аноним 2017/08/14 11:44:20  №1044378 405
>>1044374

Картинка нарисована не в масштабе 1:1 и не соблюдает пропорции.
Ответы: >>1044380
Аноним 2017/08/14 11:44:51  №1044379 406
Аноним 2017/08/14 11:48:51  №1044380 407
>>1044378
ок, тогда что означает "100% - 230px"
Ответы: >>1044389
Аноним 2017/08/14 11:58:44  №1044389 408
>>1044380

Это значит "сколько останется". Смысл в том, что левая колонка всегда имеет ширину 200px, а правая - сколько останется места за вычетом левой колонки и отступов. Получается 100% ширины окна - 230px.
Ответы: >>1044392
Аноним 2017/08/14 12:07:00  №1044392 409
>>1044389
ладно, спасибо. вроде бы разобрался..
Аноним 2017/08/14 12:43:56  №1044403 410
>>1043985
Ага. В "Конкретной математике" приводилась в начале самом.
Аноним 2017/08/14 12:51:52  №1044407 411
>>1043529
А в божественном третьем питоне все строки по умолчанию в юникоде...
Ответы: >>1044409
Аноним 2017/08/14 12:53:01  №1044409 412
>>1044407
>индексируются
Фихс
Аноним 2017/08/14 17:58:07  №1044543 413
>>1044351
Бамп вопросу, где он?!
Аноним 2017/08/14 18:29:47  №1044553 414
Насколько php чуствителен к версиям? Книги из шапки нюфаг-треда давно протухли. Как выбрать что-то хорошее и свежее?
Ответы: >>1044760 >>1044862
Аноним 2017/08/14 19:01:17  №1044560 415
>>1042966
Смысл есть.

Пиксели - абсолютная величина. Что бы ты не делал, 16 пикселей так и останутся 16 пикселями. Задумал сделать шрифт покрупнее - придется вручную менять везде.

Em - относительная величина. Хочешь сделать шрифт покрупнее, просто ставишь допустим body { font-size: 17px; } и у тебя весь сайт преображается. Очень удобно.
Ответы: >>1044570
Аноним 2017/08/14 19:38:30  №1044570 416
>>1044560

> Задумал сделать шрифт покрупнее - придется вручную менять везде.

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

> Хочешь сделать шрифт покрупнее, просто ставишь допустим body { font-size: 17px; } и у тебя весь сайт преображается. Очень удобно.
А возможно, все разъедется и будет выглядеть неаккуратно.

Если ты хочешь призвать делать все в em, то это выглядит как нездоровый фанатизм. Вообще, я плохо себе представляю дизайн, в котором можно просто взять и поменять размер шрифта. Такое редко бывает.
Ответы: >>1044578
Аноним 2017/08/14 19:56:45  №1044578 417
>>1044570
>Почему мы должны менять размеры всех элементов пропорционально

Ну потому что.

Шрифт 19px с междустрочным интервалом 30px смотрится хорошо.

При увеличении шрифта до 32px междустрочный интервал нужно увеличивать до 45px (согласно golden ratio https://pearsonified.com/typography/). Иначе параграфы будут выглядеть "сплюснуто".

С em'ами нужно лишь изменить базовый размер. А с пикселями нужно менять в двух местах (font-size и line-height).

>А возможно, все разъедется и будет выглядеть неаккуратно.
У профессионального девелопера ничего не разъезжается. Он умно сочетает различные техники (пиксели, vw, проценты и em'ы). "Разъезжание" элементов типичная ошибка фронтэнд-нубов.
Ответы: >>1044583 >>1044586
Аноним 2017/08/14 20:08:57  №1044583 418
>>1044578

line-height можно (и обычно принято) указывать относительным, вроде 1.4. Я имел в виду другие вещи: отступы, поля, ширину колонок, размеры картинок.

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

> У профессионального девелопера ничего не разъезжается. Он умно сочетает различные техники (пиксели, vw, проценты и em'ы). "Разъезжание" элементов типичная ошибка фронтэнд-нубов.

Это теоретические рассуждения или практический опыт? Разъедется, я не уверен, что я вообще когда-то видел сайт , который бы выдержал заметное изменение размера шрифта без ущерба. Если у тебя картинка размером 200px, она сама по себе до 220px не увеличится например. Наверно, в теории можно было бы продумать такую верстку, которая бы выдерживала изменение размера шрифта, но этим, я думаю, никто не занимается, включая профессионалов, из принципа YAGNI.
Ответы: >>1044604 >>1044608
Аноним 2017/08/14 20:10:39  №1044586 419
>>1044578

Также, если мне не изменяет память, ситуацию усложняет тот факт, что не для всех элементов HTML размер шрифта наследуется (я не уверен, возможно что это исправляется через font-size: inherit). Это относится к элементам форм, таблицам.
Аноним 2017/08/14 21:07:00  №1044604 420
>>1044583
Бля, какой ты душный зануда, пиздос. Уже объяснил тебе концепт абсолютных и относительных значений. Em'ы повсюду используют в основном адепты сеток, чтобы добиться равномерности и пропорциональности столбцов/контента, такой контент лучше зумится на различных девайсах, лучше оптимизирован под ретину и проч.

Нельзя однозначно сказать, плохо это или хорошо, это просто такая техника. Как есть объектно-ориентированное программирование, а есть функциональное.
Ответы: >>1044758
Аноним 2017/08/14 21:20:45  №1044608 421
>>1044583
>не уверен, что я вообще когда-то видел сайт , который бы выдержал заметное изменение размера шрифта без ущерба
Так увидь. Ситуации когда нужно плясать от 18px базового на больших экранах, от 16px на средних и от 14px на планшетах не редки. Соответственно, нужно и размер контент менять.
Ответы: >>1044758
Аноним 2017/08/15 01:04:44  №1044719 422
Сейчас взялся за задачу с тестхабом и уже пожалел и охренел от сложности. Такого сайта хватит на вакансию джуна?
Ответы: >>1044761
Аноним 2017/08/15 05:18:18  №1044743 423
>>1044351
Я не ОП, но у тебя же код обрывается на последней 294 строчке. Программа вообще не запускается из-за синтаксиса.

И я еще не понял, ideone внезапно перестал поддерживать функции вида mb_strlen()? Я так-то в phpstorm сейчас делаю, хотел свой вариант этой задачи выложить, а он ругается на отсутствие функции.
Вот вроде здесь нормально работает
http://sandbox.onlinephpfunctions.com/code/31702a84a5de8daae8b982621e907d9681bfd666
Как я сделал - класс для компании, класс для департамента, создал четыре объекта для каждого департамента, потом отдельно классы для каждой профессии. В каждом объекте департамента я сделал массив с аналогом штатного расписания, в котором перечислены ставки, а потом уже на основании этого массива я заполнил ставки, код получился довольно коротким, если не считать описания классов. Есть идея вообще отказаться от создания отдельных объектов департаментов, а сделать одну большую таблицу примерно как в условии задачи изображено.

А можно махнуть рукой и двинуться дальше :-)
Ответы: >>1044750 >>1044761 >>1044770
Аноним 2017/08/15 07:47:19  №1044750 424
>>1044743
Зачем ты ему отвечаешь? Там какой-то блядь кек а не код. Я глянул, нашел эрор за 5 сек, понял что там долбоеб, который даже не хочет ошибку прочитать и закрыл нахуй. Если бы там реальная какая-то проблема была в решении, то конечно же стоит отвечать и пытаться помочь, а так нахуй таких.
Аноним 2017/08/15 07:58:04  №1044753 425
>>1044750
Да ладно тебе, не ругайся с утра.

Лучше объясните по хардкору, какие-то есть отличия в коде при отправке формы по get и post. В случае с get у меня все работает, массив $_GET нормально заполняется, меняю все на метод post и массив возвращается пустой. В мануале сказано мельком про Content-Type application/x-www-form-urlencoded или multipart/form-data. Или вообще не в этом дело?
Вот мой HTML, генерируется редактором, ничего не менял, добавил только форму из мануала:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Title</title>
</head>
<body>
<form action="_tmp.php" method="get">
Имя: <input type="text" name="username" /><br />
Email: <input type="text" name="email" /><br />
<input type="submit" name="submit" value="Отправь меня!" />
</form>
</body>
</html>

Вот скрипт:
<?php
var_dump($_GET);
?>

При замене на post массив пуст.
Ответы: >>1044757 >>1044761
Аноним 2017/08/15 08:29:50  №1044756 426
>>1044750
ахаха, может он в инглиш не может. не догадался прочитать ошибку.
Ответы: >>1044758
Аноним 2017/08/15 08:31:50  №1044757 427
504880486.jpg (43, 612x437)
437x612
>>1044753
надеюсь ты method = "get" и $_GET оба на post меняешь?
Аноним 2017/08/15 08:32:46  №1044758 428
>>1044604

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

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

>>1044608

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

>>1044756

Такие комментарии тут не нужны. Не засоряй тред.

>>1044750

И такие наверно тоже.
Аноним 2017/08/15 08:35:34  №1044760 429
>>1044553
Бамп, все ещё в поисках хорошей литературы. Пока что прохожу курс из шапки и читаю мануал на php.net.
Ответы: >>1045051
Аноним 2017/08/15 08:38:21  №1044761 430
>>1044753

Данные, из POST формы передаются в теле HTTP запроса и помещаются в $_POST: http://php.net/manual/ru/language.variables.external.php

>>1044743

На ideone при обновлении php забыли mbstring. Я им писал несколько месяцев назад, можешь, если хочешь, тоже написать.

>>1044719

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

Ответы: >>1044766 >>1044771 >>1044819
Аноним 2017/08/15 08:59:49  №1044766 431
>>1044761
Работу за типовую задачку? Вы чо?
Ответы: >>1044819
Аноним 2017/08/15 09:09:59  №1044770 432
>>1044743

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

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

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

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

Далее, поля пишутся до методов, а не после. Рекомендуемый порядок (для удобства чтения кода) такой:

- константы
- публичные поля
- непубличные поля
- конструктор(ы)
- публичные методы
- непубличные методы

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

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

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

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

Я бы советовал в классе Департамента сделать конструктор с аргументом $name, чтобы показать, что нельзя создать департамент без названия. Аналогично, в классе работника с помощью конструктора можно указать обязательные для его создания данные.

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

Также, надо закрыть поля $employees/$departments. Сейчас они открыты и с ними можно делать что угодно, потому лучше их закрыть и сделать методы вроде addEmployee(Employee $e), которые позволяют добавлять в поле только объекты определенного класса.

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

-----

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

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

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

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

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

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

-----

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

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

Чтобы сделать код еще более понятным, около полей с объектами можно подписать их типы, используя синтаксис phpDoc:

/** @var Employee[] Список работников */
private $employees;

Ждем также версию с антикризисными мерами.
Ответы: >>1045050 >>1046119
Аноним 2017/08/15 09:32:50  №1044771 433
>>1044761
Вопрос с GET и POST снят, на апаче все корректно работает, проблема, видимо, во встроенном веб-сервере phpstorm, не работает метод post, да и ладно, на данном этапе это не принципиально, буду делать все через get. Может так и задумано.

Написал на ideone, посмотрим, подождем.
Ответы: >>1044774
Аноним 2017/08/15 09:37:12  №1044774 434
>>1044771
facepalm.
среду разработки на локалке разверни.
Ответы: >>1044781 >>1044783
Аноним 2017/08/15 10:03:42  №1044779 435
>>1044351

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

Судя по тексту: PHP Parse error: syntax error, unexpected end of file, expecting '{' in /home/Mzm5qE/prog.php on line 294 причина в том, что у тебя в конце идет определение функции и оно обрывается на полуслове.

По коду:

> public $endStavka; // окончательная ставка, вычисляется через функцию EndStavka

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

Код плохо отформатирован, используй phpformatter.com

> $endStavkaB
Название непонятное, что значит буква B непонятно.

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

Еще, я думаю, что эти поля нужно убрать:

> public $engeenerA; //1 rang
> public $engeenerB; //2 rang
> public $engeenerC; //3 rang

Они используются для заполнения департамента в начале, но почему этот код заполнения должен быть в самом департаменте? Эти поля не нужны для его работы, он может легко работать без них, значит, их надо убрать. Вместо них в департаменте лучше сделать метод addWorker(Worker $w) и добавлять работников через него. Также, кроме метода приема на работу, можно сделать метод увольнения работника, он понадобится в антикризичных мерах.

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

Соответственно, классы вроде MarketDivision тогда вообще не понадобятся. Департаменты все одинаковы, они ничем не различаются и нет смысла для них делать разные классы. Тут можно спросить: а как же работники? В принципе, их тоже можно сделать одним классом, если хочется, но наверно с наследованием просто проще задавать им параметры.

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

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

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

----

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

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

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

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

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

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

----

Ответы: >>1047030
Аноним 2017/08/15 10:05:14  №1044781 436
>>1044774

Ты уверен, что у тебя в коде нет ошибки? Что-то не верится, что в phpstorm так все плохо.

>>1044351

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

abstract class Worker
- $rang;
- $dicrementcoffe;
- $stavka;
- $mainingDocument;
- $endStavka;
- $boss = false;
- __construct()
- getendStavka()

Что мы тут видим? Во-первых, неаккуратно написанные названия (stavka -> salary/rate, getendStavka -> getEndStavka). Если ты пишешь код прямо на ideone, то советую обзавестись редактором кода вроде Notepad++, Sublime, Eclipse PDT, Netbeans, PHPStorm (платный).

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

Далее, видна избыточность. Для получения конечной ставки есть поле endStavka и метод getendStavka - что мы должны использовать?

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

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

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

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

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


// бронь
// При создании указываем диапазон дат и число гостей
class Reservation
- construct(DateTime $startDate, DateTime $endDate, $guestCount)
- getLength() // считает длительность в днях
- getGuestCount()
- getStartDate()
- getEndDate()

// номер
class Room
// указываем номер, вместимость, цену за сутки
- construct($number, $capacity, $pricePerNight)
- getNumber()
- getCapacity()
- getPricePerNight()
// забронировать номер, не позволяет забронировать номер на те дни,
// на которые уже есть бронь
- addReservation(Reservation $r)
- getReservations() // получить список броней
// подходит ли номер под условия брони, свободен ли он
// в указанные дни?
- canReserve(Reservation $r)
// сколько будет стоить проживание за весь период
- getPriceForReservation(Reservation $r)
// Занят ли номер в этот день?
- isOccupied(DateTime $date)


class Hotel
- construct()
- addRoom(Room $room) // добавить новый номер в отель
- getAllRooms()
- getRoomCount()
- getRoomByNumber($number) // найти номер
// найти все свободные номера, в которые можно
// поселить гостей
// с указанными параметрами
- findVacantRooms(Reservation $r)
// Посчитать число занятых номеров на данную дату
- getOccupiedCount(DateTime $date)
// Посчитать доходы за период времени
- getProfit(DateTime $fromDate, DateTime $endDate)

Класс DateTime - это встроенный в PHP класс для описания дат: http://php.net/manual/ru/class.datetime.php

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

Постарайся и свою структуру классов сделать такой же логичной. Если ты чувствуешь, что у тебя пока плохо с проектированием классов, можешь попросить дополнительное задание что-нибудь спроектировать.
Ответы: >>1044790
Аноним 2017/08/15 10:06:23  №1044783 437
>>1044774
Да ладно, я бы не был столь категоричен, для отладки именно php-кода, а я до сегодняшнего дня этим и занимался, встроенная в phpstorm среда выполнения очень удобна и быстра, не надо никуда переключаться в браузер. Как настроить автодеплой на веб-сервер я пока не знаю, буквально не до этого, да и невозможно же все одновременно изучать. На локалке развернут php, в апаче не было необходимости, развернуть - дело нехитрое, сам же понимаешь.
А по поводу метода post в phpstorm - реальный баг, гуглится на раз. Только в силу небольшого опыта я подумал, что это у меня руки кривые, а оно вон оно как, причем люди пишут об этом еще с 10 версии, а сейчас у меня стоит версия 2017, но проблема не устранена, видимо. Да и не проблема это, так-то.
Ответы: >>1044792
Аноним 2017/08/15 10:17:29  №1044790 438
>>1044781
Насчет отсутствия ошибки не уверен, но у других тоже такая ошибка возникает, правда большинство жалующихся отмечают, что они новички, может действительно, что-то надо еще сделать. С другой стороны, все в один голос утверждают, что на обычном сервере - апач, или xamp, например, все работает нормально.
Я не думаю, что в phpstorm все плохо, думаю, что наоборот.
Аноним 2017/08/15 10:21:16  №1044792 439
Аноним 2017/08/15 12:07:54  №1044819 440
>>1044761
>хотя бы студентов сначала надо сделать
Я уже делал студентов месяца 4 назад.
>>1044766
А что же тогда там требуется? Эта задача вроде как покрывает все требования к джунам или я заблуждаюсь? Я даже знаю людей, которые с фреймворками и ооп не были знакомы, но их принимали на работу.
Аноним 2017/08/15 14:04:01  №1044862 441
>>1044553
Мало чувствителен, на всех php >= 5.2 работает нормально. Исключение 7-ка, там некоторые вещи выпилили, но её редко встретишь.
Ответы: >>1044989
Аноним 2017/08/15 14:17:57  №1044869 442
4939021.jpg (43, 589x472)
472x589
>>1044750
Бокал шабли этому джентльмену!
Аноним 2017/08/15 17:40:48  №1044989 443
>>1044862
То есть учиться сейчас лучше на 5-ой версии? А я сдури понаставил седьмой версии. Кстати, вопрос, связана ли как-то разрядность версии php и apache? То есть если сборка php 5 версии 32-разрядная, то апач тоже только 32-разрядный надо ставить, или 64-разрядный тоже можно? А то у меня при установке какие-то танцы с бубном получились как-то раз, не сразу подружил апач и php, но сейчас уже думаю, что не были установлены последние VC рантаймы.
Аноним 2017/08/15 18:04:05  №1044997 444
>>1044989
А тебе не похуй? Рили, зачем тебе знать про версии, ты же все равно и десятой части возможностей даже допотопной четверки не осилишь. Будто бы если я скажу, что лучше учить семерку и ты такой, "о спасибо дружище, мне как раз анонимных классов не хватало, а уж биндинги в замыканиях как надоели! Хорошо, что теперь есть метод call()!".
Аноним 2017/08/15 18:17:16  №1045003 445
>>1044989

Если ты хочешь использовать PHP как модуль Апача (mod_php), то они должны быть:

- однаковой архитектуры (битности)
- с одинаковым параметром TS/NTS (thread safe)
- желательно собраны одинаковым комилятором

Что касается VC Runtime, они скачиваются с сайта майкрософт. Проверить, есть ли у тебя нужные библиотеки или нет, можно программой вроде dependency walker. Она показывает наличие или отстутвие нужных программе dll. Этой программой надо проверить исполняемые файлы Апача (httpd.exe) и php.exe. Если там не хватает библиотеки вроде MSVCR90.dll то нужен соответствующий рантайм. Вообще, обычно об этом написано на странице скачивания Апача или PHP, надо внимательно читать ее.

Аноним 2017/08/15 18:18:01  №1045005 446
>>1044989

Ой, в смысле "php должен быть с поддержкой thread safe, то есть TS, а не NTS".
Аноним 2017/08/15 18:46:00  №1045018 447
>>1044048
> компилировать из пхп
Зачем? Если так хочется анальных наслаждений, то проще+удобнее+лучше из того же питона компилять.
Ответы: >>1045486
Аноним 2017/08/15 19:57:16  №1045047 448
Подскажите идею для сайта. Это должно быть что то вроде портфолио на примере которого я показываю свои скилы. Но при этом нахуя на моём личном сайте какая то регистрация и прочая хуйня?
Или лучше запилить на гитхабе самую простую страничку портфолио и в ней накидать ссылок (с описанием) на несколько говносайтов, но при этом со всеми плюшками?
Второй вариант вроде как лучше.
Аноним 2017/08/15 19:57:45  №1045048 449
У меня тут проблема. Как сохранить данные переменной между вызовами разных функций одного скрипта? Просто я тяну данные по API и потом юзер должен их выбрать с помощью AJAX, соответственно данные из переменной вымываются и мне придется заного делать API запрос, а там уже хуй поймешь пришло ли тебе тоже самое.
Ответы: >>1056197
Аноним 2017/08/15 20:00:27  №1045050 450
>>1044770
Промежуточный вариант с учетом замечаний, но не всех, так как возникли вопросы
http://sandbox.onlinephpfunctions.com/code/eba580db69d1172fe803b119dbb4c5c19b084ca1
В компании и департаментах закрыл доступ к переменным, добавил методы add() и get(), реализовано не полностью, не обращай внимания, по сути заглушки, чтобы код не сломать, завтра попробую переписать нормально.

Больше вопрос по классам с работниками и по таблице штатного расписания.
По работникам - может вообще тогда отказаться от отдельных классов - базового Employee и наследников-профессий типа Manager. А сделать один класс, в котором будет содержаться полная информация:
class Employee
{
public $profession;
public $rate;
public $rank;
public $isBoss = false;
public $cofee;
public $reports;
}
И уже при добавлении объекта заносить все данные на основании штатного расписания. В уроке сказано, что кофе и отчеты можно вычислять, но не проще ли их сразу в объекте хранить, а не бегать куда-то в справочник?
И второй вопрос по поводу списка должностей. Есть идея запихнуть все в один большой массив типа
employeesTable = array(
["Департамент закупок", "Manager", 9, 1, 0],
["Департамент закупок", "Manager", 3, 2, 0],
.............
["Департамент продаж", "Manager", 3, 2, 0],
["Департамент рекламы", "Manager", 1, 2, 1],
);
Ну и конечно же хранить это в совершенно отдельной переменной, вынести из класса департамента. И одной функцией заполнять всю структуру, одновременно создавая объекты для сотрудников и для департаментов.
Аноним 2017/08/15 20:02:18  №1045051 451
>>1044760
> Бамп, все ещё в поисках хорошей литературы. Пока что прохожу курс из шапки и читаю мануал на php.net.
В шапке устаревшая хуйня дял анимедаунов. Если нужны основы, то на ютубе найди канал ntschool и там видосы по php за июль.
Книги по php тоже устаревшая дрисня. Такой популярный язык, а с книгами беда. Парадокс.
Ответы: >>1045092 >>1048561 >>1048605
Аноним 2017/08/15 21:33:32  №1045092 452
>>1045051
В изучении пхп проблемы не в книгах.

Всё что тебе надо знать о языке есть и в книгах за 2013-15 год. Если ты реально дотошный то можешь всегда актуальные изменения тут читать: http://php.net/manual/ru/migration71.php а не ждать пока тебе книгу напишут.

Другое дело это научиться строить архитектуру и классы правильно в приложении, это уже блядь другая история.
Чет полагаю за познанием грамотного ооп и паттернов вообще придется еще глубже нырять в еще более дальнюю классику. Зандстра в своей книге рекомендует вообще прочитать https://ru.wikipedia.org/wiki/Design_Patterns


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


http://ideone.com/YdFkQ0
Аноним 2017/08/15 21:40:48  №1045097 453
>>1045092
Ты акромя пхп ничего не знаешь?
Аноним 2017/08/15 23:09:57  №1045133 454
>>1045092
> В изучении пхп проблемы не в книгах.
Ну бля как у такого популярного языка может быть книг меньше (а 99% ещё и старое говно) чем у ...не знаю..у питона, например.
Ответы: >>1045162
Аноним 2017/08/16 00:36:00  №1045161 455
>>1045092

Вот например функция:

function findRoomByNumber(int $number) : Room { }

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

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

Плюс, IDE тоже может читать эти типы и когда ты напишешь

$room = findRoom(1);
$room->

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

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

Статическая типизация - это хорошо. Если ты пишешь большой проект без типизации, например, на JS, ты будешь просто время тратить на понимание, что вернет та или иная функция, а потом на отладку, когда она вернет что-то не то. Поэтому для JS придумали надъязыки TypeScript и Flow, добавляющие в JS статическую типизацию.

Ответы: >>1045492
Аноним 2017/08/16 00:38:13  №1045162 456
>>1045092

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

>>1045133

Мануал есть официальный, если ты знаком с программированием в общем, то его достаточно. Ну и плюс познакомиться с популярными фреймворками и библиотеками.
Аноним 2017/08/16 07:23:45  №1045206 457
Привет, помогите с настройкой Apache на VPS с debian, (apache 2.4).

Как сделать, чтобы по адресу ххх.ххх.ххх.ххх/project запускался проект (index.php), который лежит в /var/www/project/src/server/public/ ?

прописал в /etc/apache2/sites-available/000-default.conf
<VirtualHost :80>
DocumentRoot /var/www/project/src/server/public/
<Directory /var/www/project/src/server/public/>
...
RewriteRule ^(.
)$ index.php [QSA,L]
...

по адресу сервера ххх.ххх.ххх.ххх загружается Apache2 Debian Default Page, по адресу ххх.ххх.ххх.ххх/project или ххх.ххх.ххх.ххх/project/src/server/public/ выдает ошибку с кодом 500
Ответы: >>1045273
Аноним 2017/08/16 07:29:10  №1045208 458
Урок про методы в классах на страницеЩсновы ООП и другие пасты

>Допиши код, используя конструкторы, напиши недостающие функции padLeft/padRight, сделай вывод колонки «Всего». Не переусложняй код, там достаточно использовать 2 функции mb_strlen и str_repeat.

>Допиши код, используя конструкторы

Это как, научите?
Ответы: >>1045216 >>1045277
Аноним 2017/08/16 07:56:08  №1045216 459
>>1045208
Про конструкторы, в примере при создании сотрудника добавляется только имя и ставка, часы добавляются отдельной строкой, надо чтобы строка тоже передавалась как параметр в функцию, я оказывается забыл в своем варианте это сделать. А ты сделай :-)
То есть создание сотрудника должно быть в виде
$ivan = new Employee("Иванов Иван", ставка, часов в неделю);

Функции padleft и padright нужны для форматирования таблицы, они должны дополнить строку пробелами до нужной длины, тогда будет формироваться табличка.

То есть было:
test1
test123

а должно быть
.........test1
......test123
примерно так

Подскажите, пожалуйста, есть массив с объектами, у объектов свойство - имя, к примеру. Мне нужно сохранить уникальность этого свойства, то есть при добавлении нового объекта я должен сделать проверку на наличие. Как это правильно делается? У меня пока только идея бежать по всему массиву и в каждом объекте сравнивать это свойство.
Ответы: >>1045219 >>1045223
Аноним 2017/08/16 08:04:38  №1045219 460
>>1045216
Да вопрос в другом был, а именно про конструкторы в множественном числе. Как с ними взаимодействовать если их больше чем 1 в классе?
Аноним 2017/08/16 08:17:30  №1045223 461
>>1045216
Так чтоли?

public function __construct($name, $rate, $hours)
{
// задаем имя и часовую ставку
$this->name = $name;
$this->rate = $rate;
$this->hours = $hours;
}



}
$ivan = new Employee("Иванов Иван", 10, $a = array (40, 10, 40, 50));
Ответы: >>1045228 >>1045277
Аноним 2017/08/16 08:51:09  №1045228 462
>>1045223
Ну да, конструктор один и должен быть.
Ответы: >>1045229
Аноним 2017/08/16 08:56:40  №1045229 463
1.jpg (26, 333x318)
318x333
>>1045228
>ы
Изза этой блядской буквы я уже 4 часа прокрастинирую, спасибо.
Ответы: >>1045257
Аноним 2017/08/16 10:32:00  №1045257 464
14636240677430.jpg (16, 700x380)
380x700
>>1045229
А я только сейчас понял, почему буква ы выделена, лол.
Аноним 2017/08/16 11:11:25  №1045273 465
>>1045206

Посмотри лог ошибок Апача (/var/log/apache2/error.log или как-то так) и там причину ошибки.

Также, почему у тебя Rewriet Rule внутри блока Directory?
Аноним 2017/08/16 11:23:45  №1045277 466
>>1045208

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

>>1045223

Вместо $a = array(....) правильно писать просто array(...). Ты создаешь лишнюю переменную, которая никак не используется.

Аноним 2017/08/16 13:44:30  №1045341 467
перед array_rand() всегда приходится сначала юзать array_flip(), чтобы получить не порядковый номер элемента ?, а сам элемент
это ок?
Ответы: >>1045398
Аноним 2017/08/16 15:19:13  №1045398 468
>>1045341

Нет, это приведет к ошибкам, если в массиве есть повторяющиеся элементы. Надо брать ключ (который вернет array_rand) и по ключу находить элемент, если ты не знаешь как, то посмотри заново урок про массивы.
someApprentice 2017/08/16 15:20:18  №1045400 469
>>1042318
>В Линукс при создании нового процесса он наследует список открытых файлов (дескрипторов) от родителя
На примере апача и php

Апач наследует дескрипторы от какого-то "файла устройств" (или ещё какого-нибудь абстрактного родителя, неважно на самом деле интересно, но пусть это останется на самостоятельное изучение)
А php наследует дескрипторы Апача

Соответственно, если php-скрипт выполняется через консоль, то php наследует дескрипторы от неё

Я правильно понимаю?

>>1042319
>> Я попытался проверить, и в ответ получил пустую строку.
>Тебе нужно правильно обрабатывать ошибки, чтобы видеть сообщения о них, а не гадать.
При тестировании функции proc_open, я получил в stderr такую ошибку:

gpg: fatal: can't create directory `/var/www/.gnupg': Permission denied
secmem usage: 0/0 bytes in 0/0 blocks of pool 0/65536

Затем я поменял домашний каталог у www-data в /etc/passwd на каталог сервера (на который я вроде давал неограниченный доступ chmod -R 777) и всё заработало - ключ успешно сгенерировался.

Наверно следовало давать доступ на чтение/запись только для php.

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

...+++++
.+++++
............+++++
+++++
gpg: key 447224CD marked as ultimately trusted
gpg: done
gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0 valid: 5 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 5u

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


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


>Symfony Process
Для генерации ключей, очевидно, нужно запускать процесс асинхронно, потому что, у меня на виртуальной машине, уходит на это несколько секунд используя кстати демон haveged для энтропии. А что насчет получения ключей? На это не должно уходить много времени. Стоит ли здесь выполнять процесс асинхронно?
Ответы: >>1047031
Аноним 2017/08/16 16:27:26  №1045428 470
Подскажите, как подружиться с урл в fetch или в XMLHttpRequest в javaScript в проекте. У меня получилось, что на локальной машине ссылки для API запросов отличаются от ссылок которые будут в финальном проекте. Как делать так, чтобы при переносе проекта на хостинг не пришлось вручную менять все ссылки?
Ответы: >>1045489 >>1047031
Аноним 2017/08/16 18:31:27  №1045485 471
>>1044989
> 5
Нет! Привыкай сразу к хорошему, считай что тебе повезло.
Аноним 2017/08/16 18:32:09  №1045486 472
Аноним 2017/08/16 18:35:08  №1045489 473
>>1045428
Введи константу а-ля BASE_URL и храни там путь
Аноним 2017/08/16 18:37:43  №1045492 474
>>1045161
Это не просто документация, а проверка типа на выходе прямо в рантайме, очень удобно.
Аноним 2017/08/16 20:30:30  №1045537 475
Фриланс для бэкендера не существует? Или нужно иметь овер9000 скилла? Мне нравится программировать. Писать именно код. Решать какие-то сложные задачи. Но нужен хлеб, поэтому я решил попытаться совместить приятное с полезным - кодить и получать деньги. Начал учить php, т.к. в инете только и пишут, что он сейчас очень востребованный. Так вот если знать php на достаточном хорошем уровне, реально ли заработать деньги фрилансом, при этом зная HTML, CSS и JS только на базовом уровне? Ну или не фрилансом? Я не люблю верстать. Мне по душе копаться во внутренней части сайта, заниматься логикой. А на биржах фриланса я чет не нашел работы для пхпшника. Или может я не так или не там ищу? В общем, хелп, добрый анон. Спасибо.
Аноним 2017/08/16 20:43:55  №1045542 476
>>1045537
Я бы хотел услышать ответ на твой вопрос, но тут, к сожалению, никто скорее всего тебе не ответит. Вот бы конфу какую-нибудь, где можно за жизнь поговорить и совета спросить.
Аноним 2017/08/16 20:49:26  №1045546 477
Мой начальник ебанулся и заставляет писать ВСЕ парсеры на пыхе. Сегодня написал парсер, разбивающий изображение попиксельно и выводящий массив пикселей с координатами и цветом. Ебануться. В жс для этого либа есть.
А как ваши дела?
Ответы: >>1045612
Аноним 2017/08/16 20:49:36  №1045547 478
Аноны, выручайте, пожалуйста! Что это такое? Почему не импортируется база? Мне что, руками заполнять лол?
Ответы: >>1045552
Аноним 2017/08/16 20:49:58  №1045548 479
db.png (25, 888x389)
389x888
Пик отклеился
Ответы: >>1045615
Аноним 2017/08/16 20:53:27  №1045551 480
>>1045537

Изучи вёрстку и жс на среднем уровне. Это сейчас легко. Bootstrap, AMP, Vue.js
И ебашь сайты васянам. По пыхе работа в основном на вордпрессе, но там тоже уметь верстать надо.
Ответы: >>1045740
Аноним 2017/08/16 20:54:02  №1045552 481
>>1045547
Права выдай юзеру чтоб с базами работать, дурак.
Ответы: >>1045553
Аноним 2017/08/16 20:59:30  №1045553 482
Аноним 2017/08/16 21:08:34  №1045559 483
db.png (59, 922x637)
637x922
Все, погуглил, но он все равно ругается. Не ввел пароль? А куда его вводить? Хелп!
Ответы: >>1045570
Аноним 2017/08/16 21:33:37  №1045570 484
>>1045559
ты пытаешься не приведенного ванным юзером дать самому себе права. Зайди под рутом.
Ответы: >>1045573
Аноним 2017/08/16 21:37:16  №1045573 485
>>1045570
База на фри хостинге и они дали мне только мой логин. Может быть я что то не понимаю, не кидайся говном плс
Ответы: >>1045587 >>1045596
Аноним 2017/08/16 21:42:40  №1045578 486
>>1045537
А что тебе мешает JS выучить?
Ответы: >>1045740
Аноним 2017/08/16 21:51:42  №1045587 487
>>1045573
Изучи их тарифные планы, на бесплатном тарифе скорее всего доступна только одна база.

Для учебы лучше развернуть сервер на локальной машине, или на виртуальной, гайды в оп-посте.
Ответы: >>1047031
Аноним 2017/08/16 22:09:40  №1045596 488
>>1045573

На бесплатных хостингах тебе никто не даст права администратора в БД. И создать дополнительную базу можно разве что через админку, если они это позволяют.
Аноним 2017/08/16 22:52:18  №1045608 489
>>1045537
Для начинающего "бекендера" -- практически не существует
Ответы: >>1045610 >>1045614 >>1045740
Аноним 2017/08/16 22:54:49  №1045610 490
>>1045608
И куда тогда податься начинающему бекендеру?
Ответы: >>1045616
Аноним 2017/08/16 22:57:23  №1045612 491
Ответы: >>1045672
Аноним 2017/08/16 22:58:34  №1045614 492
>>1045608
Ага, а нахуя я учу php, разрешите спросить?
Ответы: >>1045617
Аноним 2017/08/16 22:58:54  №1045615 493
>>1045548
У тебя есть глаза? Как ты работаешь, если не в состоянии прочитать одну строку? Давай, что написано на красной плашке?
Аноним 2017/08/16 23:01:28  №1045616 494
>>1045610
В идеале - примерно в 2000-й. Будешь крутым челом, все захотят с тобой работать на удалёнке.
Аноним 2017/08/16 23:02:11  №1045617 495
>>1045614
Чтобы пройти длинный путь с начала до конца
Ответы: >>1045624
Аноним 2017/08/16 23:11:00  №1045622 496
То есть начинающий бекендер должен сначала работать на постоянной работе в офисе?
Ответы: >>1045623 >>1045642
Аноним 2017/08/16 23:17:03  №1045623 497
>>1045622
>Тебе повезло - ты не такой как все
Ответы: >>1045625
Аноним 2017/08/16 23:18:36  №1045624 498
>>1045617
И пройду!
хотя сейчас задумываюсь, мб прогать микроконтроллеры прикольней?
Аноним 2017/08/16 23:18:54  №1045625 499
Ответы: >>1045626
Аноним 2017/08/16 23:19:36  №1045626 500
>>1045625
>ты работаешь в офисеееее
Аноним 2017/08/16 23:21:25  №1045627 501
>>1045537
Работы дофига, больше чем ты сможешь проглотить. Особенно на апворках и проч, но нужно просто любить бекэнд. Алгоритмов хватает - самых разных, начиная от парсинга XML/JSON, создание всяких бэкгранд тасков, работа с базой, API-интерфейсы, админки, работа с фронтэндом (типа общение с мордой посредством server-sent events) и так далее.

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

Насчёт нужно ли знать JS? Конечно нужно. Если ты кодишь на php как бог, но при этом на js пишешь будто второклассник, то и дело вылетают функции TypeError: functionName is not a function, то это лютый фейл.

фриланс-бекэндер
Ответы: >>1045628 >>1045641 >>1045740
Аноним 2017/08/16 23:25:06  №1045628 502
>>1045627
Поведай нам свою историю успеха. Когда начинал? Как взял свой первый заказ? Работал ли ирл? Сколько уже кодишь?
Ответы: >>1045642
Аноним 2017/08/16 23:38:36  №1045641 503
>>1045627
> Начинающий
> профессионализм
Лол
Аноним 2017/08/16 23:40:20  №1045642 504
>>1045622
Можешь форкнуть любую либу или плагин и допилить его. Наберешься опыта, потом во фриланс. На самом деле похуй, что там пугают мол начинающему нельзя и проч... Можно! В сети куча работодателей-долбоебов, которым просто нужен сайт. Любых индусов нанимают, потом смотришь в код, там ужоснах, вообще удивительно как это всё работает. После индусов я думаю даже у российских школьников есть шанс.

>>1045628
Лет 5 назад, когда твиттер бутстрап ещё только появился. Заказ взял просто, буквально наверно с 5ой попытки, написал американцу и буквально за 2 дня срубил сотню баксов. Просек эту фишку, с тех я ни одного дня в офисе не проработал, ибо нах надо. Пару часиков в день поработал и нормик, в остальное время хочу по кафешкам, слушаю лекции, развиваюсь, читаю. Денюжки тем временем на банковский счет капают. Делаю в основном темы для вордпресса, до этого года 2 был безработным, пытался пилить тему. До этого работал на днищеработе в своем мухосранске, c++ кодер, писал прошивки для роутеров за 12 тысяч в месяц.

тот-же-фрилансер
Ответы: >>1045651 >>1045658 >>1045660
Аноним 2017/08/16 23:53:24  №1045651 505
>>1045642
За копейки -- может быть
Аноним 2017/08/17 00:01:35  №1045658 506
>>1045642
>c++ кодер, писал прошивки для роутеров за 12 тысяч в месяц
Страна возможностей, блин
Ответы: >>1047031
Аноним 2017/08/17 00:03:11  №1045660 507
>>1045642
>написал американцу и буквально за 2 дня срубил сотню баксов
А сейчас уже такой трюк не пройдёт? И где искать таких заказчиков (если не секрет)?
>c++ кодер
Нихуя себе, туда вкатиться раз в десять сложнее, чем в веб.
Ответы: >>1045728
Аноним 2017/08/17 00:18:00  №1045672 508
>>1045612

Просто на пыхе это не удобно, например. Там можно получить массив пикселей одной строкой, а тут писать 20. А ещё потом переводить формат MSAccess в хекс.
Аноним 2017/08/17 01:09:06  №1045685 509
Как называется хуйня которая накатывает вычищая вилкой абсолютно все мысли и не дает соображать. Хочется просто сидеть и тупо пялить в монитор пуская слюньку.
Я заебался уже, хочется учить, но не получается - приходится подстраиваться под эту дичь пропуская дни, недели.
Ответы: >>1045688
Аноним 2017/08/17 01:10:12  №1045686 510
Может курить бросить, черт
Ответы: >>1045690
Аноним 2017/08/17 01:12:27  №1045688 511
>>1045685
>вычищая вилкой абсолютно все мысли и не дает соображать
Галоперидол.
Ответы: >>1045689
Аноним 2017/08/17 01:15:33  №1045689 512
>>1045688
Коварная мамка, чего она добивается?
Ответы: >>1045690
Аноним 2017/08/17 01:23:42  №1045690 513
>>1045689
Пойди прогуляйся. Подыши воздухом. Мне при затыках помогает.
>>1045686
Не стоило и начинать. Такое ощущение что при курении интеллект сразу -20 минимум становится. Да и усидчивость теряется как таковая.
Ответы: >>1045708
Аноним 2017/08/17 02:29:41  №1045708 514
>>1045690
То чувство, когда у тебя и без курения интеллект -20 и нет усидчивости.
Ответы: >>1045806
Аноним 2017/08/17 04:52:35  №1045728 515
>>1045660
>А сейчас уже такой трюк не пройдёт? И где искать таких заказчиков (если не секрет)?
Да и сейчас свободно пройдет, 50 баксов в день это в принципе небольшие деньги для зарубежного фриланса.

>Нихуя себе, туда вкатиться раз в десять сложнее, чем в веб.
Да везде можно легко вкатиться, потому что тратить время экспертов на какую-нибудь софтину для ООО Вектор нерационально, да и сам профессионал не станет из-за копеек, а вот для джуиниора как подработка норм.
Аноним 2017/08/17 08:22:13  №1045740 516
>>1045551
Спасибо, возьму на заметку.

>>1045578
Я просто думаю, что это мне не нужно. Считаю, что лучше время направить не на изучение JS, а на улучшение навыков программирования в целом, читая книги Стива Макконнелли, Кормена, всякие статьи про php, sql, построение баз данных, паттерны и т.д.

>>1045608
А не "начинающий" бэкендер это кто? Какие у него должны быть навыки? Можешь хотя бы вкратце описать?

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

Можешь посоветовать какие-нибудь книги? Не для чайников, а уже более продвинутого уровня? Или ты их не читаешь? Можно на английском.
Ответы: >>1046604
Аноним 2017/08/17 10:50:29  №1045767 517
Сделал задачу Опа по вектору, решил сделать таблицу в HTML но я вот не понял, как вставить в HTML, PHPкод/
Вот кусочек моего кода: https://ideone.com/pph7Xm
Ответы: >>1047031
someApprentice 2017/08/17 10:56:50  №1045770 518
>>1043617
> position: absolute;
>> top: 70%;
>Почему именно 70%? Не проще ли просто bottom: 0?
Если поставить bottom: 0, то почему-то не появляется прокрутка.

>Ты ведь вроде делал мои задачи на HTML, значит, ты наверно сможешь решить проблему. Давай начнем с простой задачи (реально простая):
>
>- есть див известной высоты (например, 300px или 100% от высоты страницы)
>- в него вложено содержимое неизвестной высоты
>- если оно маленькое, оно должно прижиматься к низу контейнера
>- если содержимого много, то должна появляться прокрутка
Стыдно признавать, но у меня даже не появляется идей как это сделать обычными средствами. Это нужно сделать с помощью flex?

>Я в том сообщении ( https://2ch.hk/pr/res/1000416.html#1007389 ) предложил возможные подходы, нужно просто их перебрать и посмотреть, реально их тут применить или нет. Если вообще никак, то придется использовать вычисление высоты через яваскрипт (с пересчетом при ресайзе окна), но конечно средствами CSS решить эту задачу было бы гораздо лучше (но в реальных задачах иногда приходится прибегать и к яваскрипту).
Меня немного смущает прибегать к флексу, потому что он не рассчитан на старые браузеры. Хотя в старых браузерах только слегка поломается отображение, это не так критично.

Вариант с табличным отображением я не рассматриваю, потому что, как вы писали, всё равно придётся прибегнуть к js.


У меня ещё есть вопрос по js. Опять про обработчики...

Установка обработчика, это часть контроллера или отображения?

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

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

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

В таком ключе становиться не важно кто устанавливает обработчик контроллер или отображение.

Я в правильном направление мыслю насчет роутера?
Ответы: >>1045785 >>1047030
Аноним 2017/08/17 11:22:37  №1045785 519
>>1045770

Первая задача решается просто. У нас есть блок сообщений, и мы хотим прокрутку при превышении размера. Значит, нужно поставить max-height: 100% и overflow: auto;. По условиям задачи, высота контейнера у нас жестко задана (а не вычисляется из содержимого), потому мы можем использовать 100% здесь.

Получаем блок, который по высоте будет равен или меньше родителя. Остается только прижать его к низу контейнера за счет pos: absolute, width 100% (для АП элементов ширина по умолчанию определяется содержимым, а мы этого не хотим), bottom: 0;

У тебя не появлялась прокрутка из-за того, что ты наверно пытался ставить overflow на контейнер. То есть у тебя была ситуация:

- контейнер с overflow
- ребенок с position absolute, по высоте превышающий контейнер, с контентом, вываливающимся выше верхней границы контейнера

Тут есть один момент: прокрутка работает только для контента, который "вываливается" (overflows) из родителя вправо или вниз. Контент, который уходит влево или вверх, просто обрезается: https://jsfiddle.net/uusLtkku/

Я попытался найти документацию по этому поведению в описании свойства overflow в CSS2.1, а также в дополнениях из CSS3 и CSS4:

- https://www.w3.org/TR/CSS2/visufx.html#q11.0
- https://www.w3.org/TR/css-overflow-3/#scrolling-direction
- https://www.w3.org/TR/css-overflow-4/

Объяснение нашлось тут:

https://www.w3.org/TR/css-overflow-3/#scrolling-direction

> Due to Web-compatibility constraints (caused by authors exploiting legacy bugs to surreptitiously hide content from visual readers but not search engines and/or speech output), UAs must clip the scrollable overflow region of scroll containers on the block-start and inline-start sides of the box (thereby behaving as if they had no scrollable overflow on that side).

Block-start - это верхний край и inline-start это левый край для языков, где пишут справа налево и сверху вниз.
Ответы: >>1046153
Аноним 2017/08/17 12:14:06  №1045795 520
Наконец-то смог запустить свою поделку на VPS!
http://195.181.244.246/
Исходники https://github.com/enotocode/birthday_reminder

Доделал реал-тайм валидацию на стороне клиента и на сервере. Вынес запросы к АПИ в отдельный слой.

Потратил пару дней на поиск и исправление ошибок. Зато теперь я уверен, что мои исходники можно запустить еще где-то кроме моего ноута. Сейчас я понимаю, почему ОП четыре раза говорил отказаться от компиляции кода в дев версии. Пересобирать скрипт после каждого чиха заметно увеличивает время на разработку.
Ответы: >>1048196 >>1048197
Аноним 2017/08/17 12:45:05  №1045806 521
>>1045708
А чего сумбит неработает?
Аноним 2017/08/17 13:05:26  №1045813 522
Стоит ли учить фалькон?
Я знаю только чистый пхп.
Если да, то киньте гайдиков хороших, или книгу сразу, пожалуйста.
читаю на английском вполне хорошо, но информация лучше усваивается на родном все же
Аноним 2017/08/17 13:30:48  №1045824 523
Про основы Yii2 можно тут спросить?

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

Таблица clients, страница view\site\clients, контроллер \controllers\SiteController
public function actionClients()
{
if(Yii::$app->request->isAjax){
$idRow = Yii::$app->request->post('id');//принимаем id записи из js скрипта
$model = new Clients();
$model = Clients::find()->where(['id' => $idRow])->one();
$model->delete();
}
$listClients = Clients::find()->all();
return $this->render('clients', compact('listClients'));
}
Ответы: >>1045906 >>1045968 >>1045970
Аноним 2017/08/17 16:39:59  №1045906 524
>>1045824
И ещё вопрос про логику контроллера. Я правильно понимаю, что если на странице есть несколько кнопок, которые делают разное (передают через пост/гет/аякс данные), то все действия с ними надо писать в контроллере этой страницы, т.е. для страницы clients всё пишется в actionClients?

Получается, внутри нужно ставить проверки "пришло ли чего в аякс/гет/пост?", а если кнопок, оправляющих, к примеру, постом, несколько, то внутри ещё и проверки "пришло ли post('id'), или пришло post(name')?"

Или я опять не понял?
Ответы: >>1045967 >>1045970
Аноним 2017/08/17 17:23:29  №1045919 525
Есть вообше сервисы, предоставляюшие MySQL базу данных в аренду, для удаленного подключения? Мне нужна только база, без хостинга и прочего.
Ответы: >>1045970
Аноним 2017/08/17 20:25:08  №1045967 526
>>1045906

Насчет нескольких форм на странице (вообще, такое не очень часто требуется), есть 2 варианта.

Первый - обрабатывать все в одном контроллере.

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

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

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

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

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

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

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

Ответы: >>1045968 >>1046174
Аноним 2017/08/17 20:33:38  №1045968 527
>>1045967

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

Что касается твоего кода тут >>1045824 то там много странностей.

Например:

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

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

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

- если ты работаешь с аяксом, прочти мой урок про правильное использование аякса https://github.com/codedokode/pasta/blob/master/js/ajax.md

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

Также, ты не привел тут JS код.
Ответы: >>1046174
Аноним 2017/08/17 20:33:52  №1045970 528
Ты смешал в один экшн отображение всех клиентов и удаление какого-то кокретного, это неправильно. Создай actionDelete и туда отсылай аякс-запросы на удаление.

>>1045824
> $model = new Clients();
Строка лишняя.

>$model = Clients::find()->where(['id' => $idRow])->one();
> $model->delete();
Тут 2 SQL-запроса, а хватило бы одного.

И тебе нужно JSON-ответ возвращать, а не HMTL: https://github.com/samdark/yii2-cookbook/blob/master/book/response-formats.md#json-response
Ты с HTTP знаком? У ОПа на гитхабе есть пасты.

Алгоритм примерно такой:
1) Шлёшь аякс-запрос на удаление сущности
2) На стороне PHP удаляешь из базы сущность, возвращаешь JSON-ответ success: true, если неудачно то success: false
3) На стороне JS разбираешь этот JSON-ответ - если успешно - удаляешь нужный элемент из DOM-дерева.

>>1045906
На каждое действие (удаление, обновление и т.д) отдельный action, ты же сам понимаешь, что городишь неподдерживаемый код.

>>1045919
Бесплатно и быстро у хероку, но там постгрес. Платно у амазон.
Ответы: >>1046174
Аноним 2017/08/18 01:59:42  №1046089 529
ОП, короче сделал твою задачу, немного допилить нужно, но уже завтра, проверяй за щекойhttps://ideone.com/2Ozdw1
Многие обсирали мой код, но он работает.
Ответы: >>1047030
Аноним 2017/08/18 05:03:36  №1046105 530
Всем привет!

Имеется сайт на выделенном сервере с Ubuntu, PHP, nginx, Laravel. Сайт смотрит в обычный интернет, любой желающий может на него попасть через свой браузер.

Вопрос: возможно ли средствами PHP запилить get-запрос на другой сайт, но уже расположенный в зоне .onion, Т.е. Tor.

И если возможно, то как?
Ответы: >>1046425 >>1047030
Аноним 2017/08/18 06:34:40  №1046119 531
>>1044770

ОП, посмотри мой код, пожалуйста, это про компанию Вектор. Убрал из паблика все свойства. Переписал полностью классы департаментов и сотрудников. Начальные данные о составе департаментов и данные о ставках вынес в отдельные массивы, правда не очень логичным кажется постоянная передача этих данных в методы объектов ($manningTable и $staffList). Может имеет смысл их глобальными сделать.
В общем жду замечаний, а сам дальше буду пилить вторую часть задачи про антикризисные меры.

https://github.com/telepok/php-test/blob/master/oop4.php

В учебнике http://archive-ipq-co.narod.ru/ почему-то в хроме не работают ссылки в меню в левом столбце, приходится в другом браузере открывать, это только у меня так?
Ответы: >>1046130 >>1046695 >>1047024
Аноним 2017/08/18 07:33:34  №1046124 532
re.png (18, 1053x168)
168x1053
vcqg0bbcjk.png (249, 512x512)
512x512
Заебался чет, хули я такой тупой
Ответы: >>1046426
Аноним 2017/08/18 07:37:45  №1046125 533
Выравнивание колонок должо пилиться в функции или в методе? Наверное хватит думать будто оп хочет решение именно то которое и задумал автор мурзилки?
Ответы: >>1047030
Аноним 2017/08/18 07:52:12  №1046127 534
sooqa.png (4, 361x87)
87x361
debil.png (40, 503x585)
585x503
Мдааааааа
Ответы: >>1046128 >>1047030
Аноним 2017/08/18 07:52:59  №1046128 535
1.png (68, 800x832)
832x800
>>1046127
Падлефт не допилена, не обоссывай
Ответы: >>1046129
Аноним 2017/08/18 07:53:27  №1046129 536
Аноним 2017/08/18 08:10:45  №1046130 537
>>1046119
Лучше приступай к списку студентов, ООП ты уже знаешь
Ответы: >>1046135 >>1046138
Аноним 2017/08/18 08:47:32  №1046135 538
200s.gif (40, 418x200)
200x418
>>1046130
Никогда не думал, что ебучий список студентов может быть таким трудным.

мимоСинуб
Ответы: >>1046139 >>1046268 >>1047029
Аноним 2017/08/18 08:52:52  №1046138 539
>>1046130
Ну, так-то да, склоняюсь к этому, ну хотелось чтобы еще раз глянули код. Но за совет спасибо, пойдем дальше.
Кстати, по поводу списка студентов хотел спросить, точнее про шаблонизацию, стоит ли сразу пробовать какой-нибудь шаблонизатор, типа смарти, например? Или пока можно руками шаблоны делать? Впервые просто с этим сталкиваюсь.
Отписались разрабы с Идеона:
thanks for the report. The Multibyte String library is now not available on Ideone, but we keep these reports. When the number of the similar suggestions is big we add the requested library. We will tell you when we decide to do it.

Просто странно, никому не нужны мультибайт строки, или их поддержку так сложно добавить.
Ответы: >>1046139 >>1047029
Аноним 2017/08/18 08:58:10  №1046139 540
>>1046135
Че в пыху то перекатился?
>>1046138
Я сам говнокодер похуже тебя, чуть выше свое решение по вектору кинул, у меня там таблица в хтмл, просто знаю людей которые забили вообще на эту задачу и пошли дальше. Вот вам в помощь https://www.youtube.com/watch?v=ba3M3_Myrqg&t=1s
Ответы: >>1046140 >>1046164
Аноним 2017/08/18 09:04:11  №1046140 541
>>1046139
Да как-то я скептически к учебным роликам отношусь, мне комфортнее текст воспринимать с картинками. Хотя справедливости ради скажу, что Интенсивы от HTML Академии мне хорошо зашли, но там в придачу к видеокурсу были и рабочие материалы, макеты в PSD те же.
Ответы: >>1046164
someApprentice 2017/08/18 09:38:54  №1046153 542
>>1045785
Тогда во второй задаче, если высота формы не определяется содержимым, то нужно так же на неё поставить pos:absolute, bottom: 0, height: x;
А для блока с сообщениями задать bottom: x; и высчитать max-height: calc(100% - x);
Не уверен что функция calc имеет здесь место, но мне приходит в голову только такое решение.

https://jsfiddle.net/55khok9f/2/

Если высота формы определяется содержимым, то здесь у меня тоже возникают трудности. Можно ещё подсказку?
Ответы: >>1047029
Аноним 2017/08/18 10:00:39  №1046164 543
Ребят, собираюсь вкатываться в Пыху, алсо вообще в веб-разработку, на стороне Си подучиваю. (Да я тот самый что спрашивал, стоит ли параллельно с ПхП учить Си, сказали ток лучше будет) И думаю вкатиться с этой книжкой. Любая же литература подойдет?
Да и книжка тоже параллельно с http://php.net/ читаться будет. Хотел ваше мнение об книжке спросить просто. Покупать не хочу, 30$ стоит.
>>1046139
Веб разработка как мне кажется приятней и проще рабочее место найти.
>>1046140
Я даже к книжкам с картинками скептически отношусь, как мне кажется там больше воды. Т.е хорошая книжка как правило дорого стоит. Я вообще CSS и HTML5 по этим ресурсам изучаю:
https://www.w3.org/TR/html51/
https://drafts.csswg.org/
Ибо там все до атомов разбирается, как работает синтаксис, даже примеры ввели. А там же еще и ответвления, типа вот
https://www.w3.org/TR/2011/REC-CSS2-20110607/#minitoc
И представь как я еще не заебался это все скроллить? Поэтому полюбил книжки, ибо там все кратко. Но тем не менее, захожу на спецификаций дабы подробнее изучить некоторые вещи. В книжках алсо дают эту информацию но в аспекте который обязательно нужно знать, а все детали типа white_space_separate_tokens опускаются.
Ответы: >>1046186 >>1046604 >>1047029
Аноним 2017/08/18 10:42:28  №1046174 544
>>1045967
Я пытаюсь разобраться в Yii2. Нашёл видеоуроки https://www.youtube.com/channel/UCo8uH16xQsZCJL5VqZ-g9QA прошёл их, и теперь пытаюсь повторить что-то такое уже самостоятельно, поэтому в основном копипащу оттуда. Разобраться, конечно, нужно, но пока нереально. То есть, по ходу дела разбираюсь в чём-то, просто повторяя то, что работает. Ну не могу я окинуть всё взглядом и полностью разобраться во всём сразу.

>Первый - обрабатывать все в одном контроллере.
То есть, в контроллере нужно делать проверку, какая именно форма сработала, так?
>если кнопок, оправляющих, к примеру, постом, несколько, то внутри ещё и проверки "пришло ли post('id'), или пришло post(name')?"

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

>Второй вариант - сделать для каждой формы свою отдельную страницу
Это тоже понятно.

>Если это обработчик аякс-запроса, то так делать смысла нет. Для него нужен отдельный контроллер.
Насколько я понял, для каждой страницы может быть только один контроллер. И это прибито гвоздями (должны совпадать их имена). То есть, для страницы view\site\clients.php есть один и только один контроллер с именем controllers\SiteController.php

>>1045968
>почему ты используешь isAjax вместо какого-то явного признака, что это аякс запрос?
Так было в примере. И какие могут быть другие признаки аякса, кроме isAjax? Это вроде логично выглядит.
>соответственно удаление логичнее делать в другом действии, не в том же, что и вывод списка
Да. Но я не знаю, как их разделить. При отправке из view\site\clients.php, срабатывает контроллер SiteController, а в нём public function actionClients(). Как я уже писал, в уроках было написано, что это всё жёстко определено. Сам вижу, что пихать разные действия в одну фнкцию как-то неправильно, но как разделить не знаю.
>при аякс-запросе результат обычно отдают в виде JSON, у тебя же почему-то в ответ на запрос рендерится и отдается HTML страница. Зачем?
Логика такая:
Во вью написано: <button type='button' onclick='deleteRow(<?=$id?>, <?=$table?>);'>Удалить</button>
В JS-скрипте deleteRow(id, table) собирает со страницы id записи и имя таблицы, а затем передаёт аяксом на url:"index.php?r=site/clients". Хм. Получается, можно и не туда передавать, а в отдельный метод? Например, site/delete, и в контроллере прописать для него этот метод public function actionDelete(). Я правильно понял?
Но возвращаюсь к текущей логике. Данные аяксом уходят в контроллер, в actionClients(). Контроллер удаляет выбранную строку из таблицы, и мне нужно, чтобы он обновил вью страницы, показав таблицу без удалённой строки. Ага, получается, вместо обновления страницы, рендер уходит, как ответ success аяксу JS-скрипта? Получается, что обновлением должен заниматься JS-скрипт? Блин, у меня мозги в трубочку от этой хрени заворачиваются.
>Ну так написано в твоем коде.
У меня проблемы с пониманием, что движок делает за меня, а что нет.
>>1045970
>Создай actionDelete и туда отсылай аякс-запросы на удаление.
Попробую.
>Тут 2 SQL-запроса, а хватило бы одного.
Такого?
$model = Clients::find()->where(['id' => $idRow])->one()->delete();
>И тебе нужно JSON-ответ возвращать
Да, уже понял, что обновление должен делать JS, а ему для этого нужно что-то дать. В уроках этот момент не был освещён, там после принятия данных через аякс, контроллер сам обновлял вью.

В общем, спасибо, буду мучать Yii дальше.
Ответы: >>1046182 >>1047028
Аноним 2017/08/18 11:18:27  №1046181 545
Предложили мне тут работенку жуниор разработчика на Magento. Опыта у меня на уровне задачки про студентов и недоделанного файлообменника, сказали обучат меня всему что нужно. Кто-то с этой самой мажентой работал? Судя по описанию это какой-то монстр прямо, оно вообще нормально для жуниора? Расскажите про подводные камни.
Ответы: >>1046197
Аноним 2017/08/18 11:18:43  №1046182 546
>>1046174

> И какие могут быть другие признаки аякса, кроме isAjax?
Как по твоему Yii определяет значение этого поля? Как он догадывается, что запрос отправлен аяксом?
Ответы: >>1046188
Аноним 2017/08/18 11:26:10  №1046186 547
>>1046164
Я конечно извиняюсь, но с атомами ты загнул, имхо, это же не наука, а прикладная область. В реальной практике пригодятся ли тебе такие тонкости?

И еще по поводу книги. Если ты про 4 издание на английском, то оно в первой ссылке гугла даром скачивается. Зачем покупать-то. Я вообще считаю, что не стоит покупать то, что не обернется материальной выгодой. Но это уже лирика. В общем именно книжка с картинки скачивается на раз, 800 страниц, могу почтой выслать, лол.
Ответы: >>1046214 >>1047028 >>1047029
Аноним 2017/08/18 11:31:08  №1046188 548
>>1046182
>Как по твоему Yii определяет значение этого поля? Как он догадывается, что запрос отправлен аяксом?
ВААААХ! ХАЙТАН-МАШИН АЯКС ПРИШЙОЛ!
Пока что это для меня чёрный ящик
Ответы: >>1047028
Аноним 2017/08/18 11:49:42  №1046194 549
somnambula.jpg (32, 300x212)
212x300
Нужна помощь - реализуемо ли, по каким названиям функций гуглить.
На моём сайте в странице условный код JS:
<script>
readFile("http://МОЙСАЙТ/data.php");
</script>
data.php возвращает текстовый файл.
Итак, вопрос, можно ли сделать, если ссылку http://МОЙСАЙТ/data.php скопировать в адресную строку, браузер покажет мою заглу