«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Аноним 2018/11/16 16:34:38  №1296391 1
Анончики, нужда для облегчения работы цикличных действий приспичила и решил я по изучать работу с API с помощью JavaScript, и сразу же проглотил немытого хуя.

Как оказалось, работать с ним без серверного языка можно только с того же домена, на котором ты и исполняешь скрипт, то есть чтобы JS получил данные с внешнего домена, нужно чтобы на этом домене было прописано разрешение в заголовке для таких работ, но хуй там. Все костыли что я опробовал не работают, все выдают No 'Access-Control-Allow-Origin' header is present on the requested resource.

И тут меня осенило, я же могу не ебаться с серверами и их арендой, а запустить сервер прямо у себя на пекарне и с помощью животворящего PHP сделать проксирование всего этого дерьма, отсюда вопрос, как это сделать?

Знаю что для начала мне нужно будет прописать в самом коде <?php header('Access-Control-Allow-Origin: *'); ?> чтобы таки разрешить к нему доступ из вне, теперь я не пойму как организовать проксирование.

Например ссылка на API http://site.ru/api.json?token=224&user=1488 я создаю на локальном сервере файл proxy.php и обращаюсь к нему с нужного мне сайта из JavaScript с помощью XMLHttpRequest() например так http://localhost/proxy.php?token=224&user=1488 и он возвращает мне JSON с выше указанного API, подскажите пожалуйста как такой костыль реализовать, это у меня будет как-бы такой локальный JavaScript помощник для парсинга APIда благословит вас аллах

Ну или подскажите как таки наебать ограничение Cross-Origin Read Blocking (CORB) в браузере
Ответы: >>1296411 >>1296437 >>1297084
Аноним 2018/11/18 08:38:20  №1297084 2
>>1296391
>И тут меня осенило, я же могу не ебаться с серверами и их арендой, а запустить сервер прямо у себя на пекарне
Поехавший. Если в кратце - затея хуйня.
Купи себе вдс за 3 доллара и не еби мозги
Ответы: >>1297146
Аноним 2018/11/18 10:19:52  №1297146 3
>>1297084
Нахуя что-то покупать и ебаться с его настройкой, если можно запустить трёхстрочный код проксирования локально?
Ответы: >>1297487
Аноним 2018/11/18 23:50:59  №1297487 4
>>1297146

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

>>1297089

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

Потому ArrayObject надо оборачивать:

class MessagesList implements ArrayAccess, ...
{
private $list;

...
$list = new ArrayObject(...);
...
}

Твоя задача решается дженериками, которых в PHP нету. Как безвыходный вариант, можно использовать идею с абстрактным методом (можно сделать не getType(), а supports(object $x)), но тогда придется отказаться от тайп-хинтов.

> То есть, вопрос чисто про подсветку в IDE.

Используй doc-комментарий @var: https://intellij-support.jetbrains.com/hc/en-us/community/posts/207025175-Using-to-phpdoc-to-specify-that-a-variable-represents-an-object-class

>>1297070

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

> [а-яё0-9a-z,.?!:;]+
Ты хотел написать "любой символ, кроме пробела"? Тогда надо использовать \\S

> $hui = preg_replace($regexp,"$1$3$5",$hui);
> $hui = preg_replace($regexp,"$1$3$5",$hui);
Почему повторяется 2 раза? Нужен как минимум комментарий.

> $l++;
> if (($letter==".")|($letter=="?")|($letter=="!")) {
> $letters[$l]=mb_strtoupper($letters[$l]);
Здесь есть риск, что элемента $l + 1 может не существовать. Лучше сделать переменную "предыдущий символ", и проверять ее.

А еще лучше - использовать preg_replace_callback.

Расстановку пробелов - нельзя ли было сделать там же, где и удаление пробелов?
Ответы: >>1297532 >>1297540 >>1298000
Аноним 2018/11/19 05:55:30  №1297532 5
>>1297487
>Проблема с ArrayObject в том, что данные в него можно передать не только через конструктор, но и через методы.
Фигасе, о том, что туда данные можно и через методы передать я и забыл.
Таким образом может существовать объект, в котором будут данные другого типа.
>А ставя в них ограничения, ты нарушаешь принцип Лисков.
Это да. Даже не думал об этом. Код, работающий с ArrayObject, будет ожидать, что сможет нормально работать и с его потомком, а это не так.
Короче не нужно в потомке ломать обратную совместимость с базовым классом.
>Потому ArrayObject надо оборачивать:
То бишь, самому реализовать все нужные интерфейсы?
Ответы: >>1308856
Аноним 2018/11/19 06:41:19  №1297540 6
Screenshot118.png (11, 686x286)
286x686
>>1297487
Так по идее тогда любые доп-проверки аргументов метода нарушают принцип Лисков?

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

Но это все же слишком идеальный манямир, так не получится писать.
Ответы: >>1298037
Аноним 2018/11/20 03:04:27  №1298000 7
>>1297487
https://repl.it/@underbottom/povtorenie1 - (исправление пробелов и заглавные буквы) было тяжело, но я разобрался, как работает preg_replace_callback. Видимо на первых порах тяжело вычленять и усваивать инфу из мануала(либо я тупой). Я очень перемудрил с регуляркой и поэтому приходилось 2 раза прогонять, что бы успловия подошли. Сейчас вроде лаконично. Подтянул знания по регулярке и теперь понимаю более-менее, что к чему.
https://repl.it/@underbottom/repeat4 - поправил недочёты.
https://repl.it/@underbottom/repeat3 - Исправил. Я перемудрил.
https://repl.it/@underbottom/value-credit - долго думал, как реализовать вычисления наименьшей цены. Оказалось min сравнивая массивы берёт только валью нулевой строки.(пытался ставить миллион дней результат не поменялся).
https://repl.it/@underbottom/ExcitingUnimportantExperiments - переделал регулярку, уверен, что нужно не так. Но вроде работает.
https://repl.it/@underbottom/repeat1 - переделал регулярку и способ решения.
https://repl.it/@underbottom/exam-after-chapter - опять перемудрил. Исправил.

https://repl.it/@underbottom/yodashuffler




Ответы: >>1308852
Аноним 2018/11/20 06:29:04  №1298037 8
>>1297540
>любые доп-проверки аргументов метода нарушают принцип Лисков?
Бам вопросу!
Ответы: >>1298052
Аноним 2018/11/20 07:29:11  №1298052 9
>>1298037

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

Но здесь другая ситуация. У нас нет кода, заточенного на работу с базовым классом и потому не требуется совместимости. У нас задача - создавать контейнеры для разных типов данных (имитировать generic types). И потому мы можем от принципа Лисков отступить.
Ответы: >>1298129
Аноним 2018/11/20 09:59:37  №1298129 10
>>1298052
>У нас нет кода, заточенного на работу с базовым классом
Так любой код, работающий с ArrayObject, будет ожидать, что сможет работать и с его потомком. Даже если сейчас такого нет, может появится в будущем. И вовсе не факт, что это я его напишу.
Может у кого-то будет годная библиотека для работы с ArrayObject, а тут этот чел смотрит: "Опа, что это тут у нас? Да это же потомок ArrayObject! Я смогу с ним работать с помощью той либы, что работаю с обычным ArrayObject'ами."
Передает объект, а ему: "Соси хуй, быдло".
Нехорошо так делать, теперь я это понял.

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

Теоретически тут может помочь закрытое наследование. Типа когда класс фактически наследуется от базового, но все его унаследованные методы становятся закрытыми, вне зависимости от настроек в базовом.
Тогда внешний код не будет знать, что класс является потомком какого-то другого.
Вроде в плюсах есть что-то такое.
Но звучит как-то бредово, не даром такой хуйни нигде почти нет.
>и потому не требуется совместимости. У нас задача - создавать контейнеры для разных типов данных (имитировать generic types).
Очень рад, что ты понимаешь, что я пытаюсь сделать, не то что здешние школьники.
>И потому мы можем от принципа Лисков отступить.
Ну вот хуй знает, ты меня прям с этим принципом озадачил.
Ответы: >>1298548
Аноним 2018/11/20 21:53:51  №1298548 11
>>1298120

PDO это встроенный в PHP класс (точнее, не в PHP, а в расширение pdo). Его описывать не требуется,он уже есть.

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

>>1298129

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

> Так любой код, работающий с ArrayObject, будет ожидать, что сможет работать и с его потомком.

Тем не менее, мы намеренно отказываемся от соблюдения принципа Лисков тут, чтобы реализовать имитацию generic types. А если мы не используем наследование от ArrayObject, то такой проблемы вообще нет.

> Лучше самому реализовать нужные интерфейсы.

Можно и так.

>>1298131

1) почитайте мой урок по MVC
2) решите задачки про ООП-гостиницу или ООП-будильник
3) почитайте мой урок по DI, паттернам работы с БД
4) решите задачку про студентов
5) поизучайте фреймворки и подумайте, зачем там использованы такие-то классы и применен такой-то подход

Вот так примерно у вас и появится представление (может быть).
Аноним 2018/12/10 00:45:08  №1308852 12
>>1298054

> Квантификаторы - условия задаваемые выражению внутри скобок.
нет, квантификаторы - это символы, которые задают число повторов идущего перед ними символа или выражения. Например: ?, +, *, {...}

> 2) Фигурные скобки. Внутри них задаётся число повторений от n до m.
Верно.

> 3) Круглые скобки - объединяют набор символов и квантификаторов в один элемент(тупая формулировка наверное).
Верно.

> задачка. Число находим вот так [\d]+. Найти число с запятой [\d]+(\,\s).
> >[\d]+(\,\s)*

Нет, неверно. У тебя написано:

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

То есть твое выражение это:

число (запятая пробел)*

Но нам надо искать число, за которым может идти сколько угодно других чисел через запятую:

число (пробелы запятая пробелы число)*

Попробуй записать это на языке регулярок.


>>1298000

> https://repl.it/@underbottom/povtorenie1 - (исправление пробелов и заглавные буквы)

Здесь можно было обойтись одним preg_replace:

> $regexp = "/(\S+)(\s)([,.!?:;]+)(\s)/ui";
> $text = preg_replace($regexp,"$1$3",$text);
> $regexp = "/([,.?!:;]+)([a-zа-яё0-9]+)/ui";
> $text = preg_replace($regexp,"$1 $2",$text);

В первом выражении [,.!?:;]+ квантификатор плюс "жадный" ( http://php.net/manual/ru/regexp.reference.repetition.php ) и захватит максимально возможное число символов в тексте. То есть, если там будет многоточие, то эта конструкция захватит все точки в нем. И потому можно одним preg_replace и убрать лишние пробелы, и добавить один пробел после знака.

> function makeLetterUp ($match) {
Эта функция сделана не очень логично, что она принимает массив, а не строку с буквой. Для использования с preg_replace_callback выгоднее было бы использовать анонимную функцию:

$upcaseLetter = function ($match) { ... };
...preg_replace_callback(..., $upcaseLetter);

Или вообще, убрав переменную:

...preg_replace_callback(..., function ($match) {
...
});

Почитать: http://php.net/manual/ru/functions.anonymous.php

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

А так, решено верно.

> https://repl.it/@underbottom/repeat4 - поправил недочёты.

> [^\\s]
Можно просто \\S

> $changedText=str_replace("здел","сдел",$changedText);
Слово "раздел" будет заменено на "расдел".

> [^,а-я0-9a-z]
ё не входит в диапазон а-я и его надо указывать отдельно.

> (а|но\s)

Здесь \s относится только к "но", но не к "а". Также, здесь проще использовать \b, чтобы указать, что там должна быть граница слова.

В общем, пока тут есть проблемы.

> https://repl.it/@underbottom/repeat3 - Исправил. Я перемудрил.

Ок, верно.

> https://repl.it/@underbottom/value-credit - долго думал, как реализовать вычисления наименьшей цены. Оказалось min сравнивая массивы берёт только валью нулевой строки.(пытался ставить миллион дней результат не поменялся).

Если 3 банка, то можно просто поставить 2 if. Также, можно сделать цикл по массиву, сравнивая каждый элемент с ранее найденным мин. значением. Также, можно отсортировать массив и взять первый элемент.

> $result [0] = 0;
> $result [1] = $i;

Это не очень понятный код, так как непонятно, что хранится в элементах массива. Что значит $result[0]? Лучше использовать переменные, а в конце функции написать:

return [$price, $bankName, ..];

Так виден формат результат и что в нем. Дополнительно можно описать это в комментарии перед функцией.

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

Решено верно, но код мог бы быть понятнее.

> https://repl.it/@underbottom/ExcitingUnimportantExperiments - переделал регулярку, уверен, что нужно не так. Но вроде работает.

Ошибка 404 при попытке открыть ссылку.

> https://repl.it/@underbottom/repeat1 - переделал регулярку и способ решения.

> $phone = preg_replace ("/\+7/","8",$phone);
тут стоило добавить привязку к началу строки, а то +7 может быть и в середине. В остальном верно.


> https://repl.it/@underbottom/exam-after-chapter - опять перемудрил. Исправил.

Твоя программа считает одиночную латинскую букву вроде x или z ошибкой: https://repl.it/repls/ForsakenUnitedFreesoftware

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

> https://repl.it/@underbottom/yodashuffler

> $word = [];
> $phrases = [];
Эти глобальные переменные никак не используются.

> function makeYodaStyleText($text) {
> $phrases = [];
> $i = 0;
Это можно было не писать.

> ([.|!|?|;])
В квадратных скобках верт. черта не является спецсимволом и не имеет специального значения. Надо писать либо [.!?;] либо \.|!|\?|; . И круглые скобки не нужны тут. Что они делают тут?

> foreach ($word as $idinahooi) {
$words as $word. Как читать твою программу?

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

В общем, сильно переусложнено.
Ответы: >>1308853
Аноним 2018/12/10 00:47:03  №1308853 13
Аноним 2018/12/10 00:48:01  №1308856 14
>>1297952

> Анончики, требуется помощь с задачей ОПа.
> Что я накрутил - ([\s\-()]\+7|8)([\s\-()][0-9]){10}$. Не ищет номер с пробелом между + и 7. Очевидным решение будет написать \s* между ними и тогда всё заработает, но сомневаюсь, что это правильное решение

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

>>1297532

>>Потому ArrayObject надо оборачивать:
> То бишь, самому реализовать все нужные интерфейсы?
Да. Ты создаешь свой класс, не унаследованный от ArrayObject, и не обязан сохранять совместимость с ним.

>>1293491

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

Если ты хочешь критику, ты можешь в этот тред выкладывать, может кто-то прокомментирует, или поискать, может есть какие-то форумы, где можно обсудить код. На SO есть https://codereview.stackexchange.com/ , но он на английском - может есть русская версия?