«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/16 17:25:44  №1296411 2
>>1296391
Попробовать нормальный язык?
Ответы: >>1296528
Аноним 2018/11/16 18:33:22  №1296437 3
>>1296391

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

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

Ты по моему переусложняешь все.

Ну и другой вариант - если ты знаешь JS, ты можешь установить Node.js и запустить JS-скрипт в консоли, без браузера и HTML. И он там тоже может работать хоть годами.

А, еще третий вариант. Ты можешь отключить в браузере проверку этих заголовков - это делается по-разному для разных браузеров. И тогда твой код сможет слать запросы куда угодно.
Аноним 2018/11/16 22:37:01  №1296524 4
>>1296437
не учи долбоебов, еще не хватало чтобы появились на виндах какие пхп скрипты запускающиеся из консоли. брр

>>1296453
девочка моя, мне временами попадаются переходные варианты кода работающего на продакшне и там ацкая смесь 4 и 5й версии. проекты более чем успешные и работают, а если работают - не трогай. допиши че просят и оставь. ебланов которые хотят сразу переписать все на 7ку ( 5.4, 5.5, 5.6 ) обычно шлют нахуй, это показатель отсутствия скила
Ответы: >>1296575 >>1296688
Аноним 2018/11/16 22:58:38  №1296528 5
>>1296411
>>1296437
Такая ситуация, нужно именно из браузера находясь на любом сайте с помощью JavaScript парсить содержимое json на другом сайте и добавлять его в нужные места на том сайте на котором я нахожусь в данный момент, от сюда и пришло в голову из-за ограничений
в браузерах создать PHP скрипт который бы проксировал все эти запросы и пропуская через себя отдавал с локалхоста в браузер, а благодаря строчке <?php header('Access-Control-Allow-Origin: *'); ?> браузер уже не будет возникать, так понятно? Просто я хуй знает что писать в этом php файле для подобной задачи
Ответы: >>1297085
Аноним 2018/11/17 07:29:34  №1296575 6
>>1296524
> ебланов которые хотят сразу переписать все на 7ку ( 5.4, 5.5, 5.6 ) обычно шлют нахуй, это показатель отсутствия скила

Что за ерунду ты несёшь? Желание обновится с 5-го PHP на 7-й абсолютно логично как минимум потому, что для PHP 5 скоро перестанут даже security fix'ы выпускать, молчу про улучшение производительности. Если у вас настолько хрупкая система без CI и тестов, где каждый боится лишний раз код поправить, руководствуясь принципом "работает - не трогай", говорит лишь о вашем непрофессионализме. Либо у вас настолько простая система, где не нужны ни тесты, ни зависимости с composer, ведь они тоже обновляются и редкий пакет будет работать с PHP 5.4<. А если не обновлять - опять дыры в безопасности.
Ответы: >>1296727
Аноним 2018/11/17 11:24:23  №1296688 7
>>1296524
>девочка моя, мне временами попадаются переходные варианты кода работающего на продакшне и там ацкая смесь 4 и 5й версии.
А кто виноват, что ты работаешь в веб студии/на индусском фрилансе/битриксе? У нас обновление версии - это не событие, а стандартная процедура. На легаси 5.6 сейчас осталось очень мало кода, который активно апдейтится.

>ебланов которые хотят сразу переписать все на 7ку ( 5.4, 5.5, 5.6 ) обычно шлют нахуй, это показатель отсутствия скила
Ну да. Лучше остаться на полностью abandoned версии без security fix'ов, без поддержки с хуем во рту. Чем спокойно и без проблем обновиться на более позднюю. Мы сейчас не в 2004, обновление происходит максимально просто и безболезненно, если ты изначально не писал быдлокод.
Ответы: >>1296878
Аноним 2018/11/17 12:21:29  №1296727 8
>>1296575
это твое желание - обновится. кода может быть много ( 2-3 мб).

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

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

я посмотрю как ты клиенту скажешь: вай дарагой, давай все все перепишем, а то мне лень разбираться в этом вот говне.
а это его хлеб, который кормит средней руки конторку, и на хую он вертел всяких вась с предложениями ценою в десятки тыс баксов
Ответы: >>1297035
Аноним 2018/11/17 18:18:28  №1296878 9
>>1296728

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

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

>>1296690

RFC есть: https://wiki.php.net/rfc/generics

>>1296688

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

>>1296682

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

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

Аноним 2018/11/17 22:47:39  №1296993 10
Аноним 2018/11/18 03:52:56  №1297035 11
>>1296727
Что там такого изменилось с 5.4 на 7.2, что стоить будет десятки тыщ баксов? Депрекейтов было не так уж много, если не единицы. В основном изменения коснулись только PDO и работами с БД.
Ответы: >>1297138
Аноним 2018/11/18 08:23:10  №1297080 12
>>1296437
>написать программу на нем и запустить ее из командной строки
Это я и хочу сделать, запустить на фоне скрипт на php который проксировал бы мои запросы к внешнему серверу, но не знаю что туда писать.

>>1296437
>установить Node.js и запустить JS-скрипт в консоли
Не могу в Node.js.

>>1296437
>отключить в браузере проверку этих заголовков
Опасно, любой пиздюк сможет со своего говносайта получать доступ к моим например кукам.
Аноним 2018/11/18 08:38:20  №1297084 13
>>1296391
>И тут меня осенило, я же могу не ебаться с серверами и их арендой, а запустить сервер прямо у себя на пекарне
Поехавший. Если в кратце - затея хуйня.
Купи себе вдс за 3 доллара и не еби мозги
Ответы: >>1297146
Аноним 2018/11/18 08:39:52  №1297085 14
>>1296528
Расширение для браузера. Можно даже тупо скрипт для Greasemonkey и подобной хуйни.
Из расширения ты можешь вырубить cross-origin контроль.
Ответы: >>1297093 >>1297150
Аноним 2018/11/18 08:57:29  №1297093 15
>>1297085
Точнее, ты можешь задать в настройках расширения область его действия. В том числе /, то бишь, на всех сайтах.
Аноним 2018/11/18 10:12:27  №1297138 16
инженер.jpg (18, 604x378)
378x604
>>1297035
ну вообще достаточно много изменилось, взять тот же strict mode.
когда говорят что пхп стал в хуй раз быстрее, подразумевают именно строгий режим. старый говнокод будет работать примерно так же.
и если мы говорим переписать с 5 в 7. то вероятно речь идет о перепиливании под ООП, с классами там, как сейчас модно

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

>>1297066
обоже обоже обоже, не вспоминай это говно, даже не произноси в слух. может оно сдохнет само по себе если нубам не рассказывать, а то переодически появляются умники с восклицанием "посмотрите что я нашел, это гениально и решает все проблемы"
Ответы: >>1297140 >>1297147 >>1297151
Аноним 2018/11/18 10:14:56  №1297140 17
>>1297138
>же защита от копирования
Так объекты сами собой не копируются
Ответы: >>1297149
Аноним 2018/11/18 10:19:52  №1297146 18
>>1297084
Нахуя что-то покупать и ебаться с его настройкой, если можно запустить трёхстрочный код проксирования локально?
Ответы: >>1297487
Аноним 2018/11/18 10:20:41  №1297147 19
>>1297143
Скорее всего тупо потому, что тут и там народу больше. Ебанутые - величина статистическая.

>>1297138
>без статика ты не получишь сингтон
Шизик, выкатись.
Ответы: >>1297153
Аноним 2018/11/18 10:21:06  №1297149 20
>>1297140

ну это, как же...

$a = $b = new myobj();
$a->a = 1; $b->a = 2;

а в сингтоне так не прокатит.
myobj::$a = 1 и как ты его не копируй там всегда будет 1. в этом смысл
Ответы: >>1297154
Аноним 2018/11/18 10:21:09  №1297150 21
>>1297085
Извини братишка, но я правда не ебу как писать расширения для браузера, а те что есть в магазине расширений, отключают эту проверку на всех сайтах, что я думаю не есть хорошо.
Ответы: >>1297155
Аноним 2018/11/18 10:21:29  №1297151 22
>>1297138
Ну хз. Вообще весь мой код который я писал в 2010 работает на 7 версии. Я даже не подозреваю что там можно переписать.
> вероятно речь идет о перепиливании под ООП, с классами там, как сейчас модно
Как-то притянуто за уши. Тем более что это вообще не несёт никаких профитов клиенту. Разьве что местные эстеты будут на код фапать.
Аноним 2018/11/18 10:22:12  №1297153 23
Ответы: >>1297161
Аноним 2018/11/18 10:22:19  №1297154 24
>>1297149
>$a = $b = new myobj();
>$a->a = 1; $b->a = 2;
Ну и в чем проблема, ты скопировал ссылку на объект. Объект у тебя 1.
Ответы: >>1297163
Аноним 2018/11/18 10:22:58  №1297155 25
>>1297150
Скрипт для гризманки напишет любой долбоеб. Достаточно знания жс и все. Там все очень просто.
Ответы: >>1297167
Аноним 2018/11/18 10:26:17  №1297161 26
>>1297153
Нихуя ты ответочки кидаешь. В предыдущих постах тыкал, тут на "Вы". Сноб с раздвоением личности?
Ответы: >>1297162
Аноним 2018/11/18 10:27:16  №1297162 27
Ответы: >>1297165
Аноним 2018/11/18 10:28:12  №1297163 28
>>1297154
вот этого непонял, поясни плс.

после манипуляций обьекта стало два ( ну да, он имеет одно имя )
а два их потому что у каждого свой набор атрибутов, они не идентичны.
по канону это не синглтон, синглтон всегда существует в одном варианте
Ответы: >>1297169 >>1297486
Аноним 2018/11/18 10:28:36  №1297165 29
>>1297162
Проиграл на всю комнату
Аноним 2018/11/18 10:29:47  №1297167 30
>>1297155
Хорошо, что же за такая волшебная команда есть в JS, которая заставит браузер игнорировать Access-Control-Allow-Origin?
Ответы: >>1297486
Аноним 2018/11/18 10:33:19  №1297169 31
>>1297163
>после манипуляций обьекта стало два
Да нихуя, просто ссылки на один и тот же объект стало две.
>ну да, он имеет одно имя
На один объект 2 ссылки
>а два их потому что у каждого свой набор атрибутов, они не идентичны.
С чего ты это взял? Объект 1, объекты сами собой не копируются, если ты не описал для них метод __clone().

Чтобы создать копию объекта, надо вызвать clone.
$copy_of_object = clone $object;
По-дефолту clone копирует свойства объекта по своей маня-схеме, короче это хуйня. Поэтому сделали переопределяемый магический метод __clone(), в котором ты можешь задать, как корректно скопировать объект.

Если просто вызвать $obj1 = $obj2, создастся просто еще одна ссылка на один и тот же объект.

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

В яве то же самое.
Аноним 2018/11/18 10:38:11  №1297173 32
>>1297169
Хорошо пояснил.

мимонуб
Ответы: >>1297177
Аноним 2018/11/18 10:40:22  №1297174 33
>>1297169
>В яве то же самое.
все встало на свои места :D спс за внимание

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

обьект не передается по ссылке, каждый раз делая $a = $myobj; ты копируешь обьект.
clone работает весьма криво.
есть вариант с $a = &$myobj; чтобы передать ссылку, но так типа некрасиво.
$a->a = 1;
$b = $a;
$b->a = 2;
echo $a->a выведет 1, что немного необычно для жаберов
даже сделав $b = $a->clone();
b будет содержать копию класса, но не ссылку на a





Ответы: >>1297177 >>1297178 >>1297486
Аноним 2018/11/18 10:42:23  №1297177 34
Screenshot114.png (10, 390x543)
543x390
Ответы: >>1297181 >>1297182
Аноним 2018/11/18 10:43:50  №1297178 35
клиенты.jpg (18, 440x225)
225x440
>>1297174

обьясни это симфони блядям, и за одно почему их говно жрет по 50-100 метров памяти на запрос. мимокрокодил
Аноним 2018/11/18 10:48:37  №1297181 36
Аноним 2018/11/18 10:49:34  №1297182 37
Screenshot115.png (13, 407x579)
579x407
>>1297177
http://sandbox.onlinephpfunctions.com/code/3dbe830008b471ece986092e6b5e3cd09e8c1f67
Вот короче полный пример.
По-дефолту clone создат объект по своим ебанутым правилам, как ему виднее.
Чтобы определить, как корректно скопировать объект - нужно переопределить функцию __clone(). Все как и в яве.
Ответы: >>1297230
Аноним 2018/11/18 13:00:20  №1297230 38
>>1297182
это потому что ты хеловордишь, даже в доке по обьектам на оф сайте можно найти что-то типа

class A { public $foo = 1;}
function go($obj) { $obj->foo = 2;}
function bo($obj) {$obj=new A;}

$e = new A;
go($e);
bo($e);
echo $e->foo - 2, хотя ожидается 1

проблема решается есть сделать так
function bo(&$obj) {$obj=new A;}
это называется - передача обьекта по ссылке.

http://sandbox.onlinephpfunctions.com/code/7b312b4f1167a027f14fd4f218c70e28f9f3dcc9
вот пример если угодно, мы имеем в реале 3 копирования обьекта, 2 раза на new и один раз на передаче в функцию, но эту передачу реализует пхпшчка немного специфично

Ответы: >>1297235
Аноним 2018/11/18 13:16:37  №1297235 39
1388412261493.gif (2043, 430x330)
330x430
>>1297230
В смысле блять.
public function bar(A $bar)
{
$bar = new A;
}

Что блять на этом этапе происходит? Какого хуя значения различаются? Откуда еще один объект взялся?
Или тип в метод можно передать объект, по ссылки, взаимодействовать там с ним (и он будет изменен снаружи), но записать в эту ссылку новое значение нельзя?
И тип ссылка внутри метода доступна ридонли?
Ответы: >>1297483
Аноним 2018/11/18 23:49:39  №1297483 40
>>1297240

Вообще, если ты интересуешься наследованием в ООП, то тебе стоит почитать про принцип Лисков (там, где это описано простыми словами), а заодно можешь глянуть ковариантность/контрвариантность: https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%B2%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D0%B8_%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%B0%D0%B2%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5) - но там может оказаться сложновато разобраться. Английская версия статьи поподробнее.

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

Потому:

- типы аргументов можно расширять, но не сужать (=они контрвариантны)
- типы возвращаемых значений можно сужать, но не расширять (=они ковариантны)

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

- https://bugs.php.net/bug.php?id=72442

Увы, нужен RFC, голосование и желающий исправить проблему.

>>1297298

Добавление аргумента нарушает совместимость и принцип Лисков.

>>1297235

Создается новый объект и указатель на него записывается в локальную переменную $bar внутри функции. На переменные снаружи функции это не влияет.

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

У тебя нет передачи по ссылке. Она обозначается символом &. Переменная $bar в функцию передается по значению (копируется). Мануал про ссылки: http://php.net/manual/ru/language.references.php

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

Для простоты представь, что объект создается где-то в памяти, а в переменную сохраняется его уникальный номер (указатель). Новые объекты создаются только операторами new/clone, а остальные операторы (знак равенства) просто копируют номер объекта:

$a = new A; // Создали объект #1
$b = $a; // В $b скопировался указатель на объект #1, она указывает на тот же объект
$b = new A; // Cоздали объект #2 и записали указатель в $b
$c = clone $b; // создали объект #3 и записали указатель в $c

func($a); // Передали в функцию номер объекта из $a (#1)

У тебя при вызове функции в $bar передается номер какого-то объекта, и в копии переменной внутри функции он заменяется на другой номер.
Ответы: >>1297521 >>1297524
Аноним 2018/11/18 23:50:33  №1297486 41
>>1297174

> обьект не передается по ссылке, каждый раз делая $a = $myobj; ты копируешь обьект.
Неверно. Ты копируешь "указатель" (можно считать, порядковый номер)

> clone работает весьма криво
Нормально он работает.

>>1297169

> В любой метод передается объект не по значению, а по ссылке.
Это неточно. Передача по ссылке явно указывается символом &. Если его нет - переменная передается по значению, но для объекта это будет не сам объект, а его "номер" или "указатель".

Объекты в PHP передаются точно так же, как в Java, C#, JS.

> Объект 1, объекты сами собой не копируются, если ты не описал для них метод __clone().
Оператор clone работает, даже если этого метода нет.

>>1297167

В расширении можно запрашивать любые URL в обход CORS, как я помню. Описание: https://developer.chrome.com/extensions/xhr

>>1297163

Объекты создаются только через new/clone, потому там один объект, просто указатель на него записан в две переменных.
Аноним 2018/11/18 23:50:59  №1297487 42
>>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:08:46  №1297521 43
>>1297483
О, спасибо за подробный ответ!
Аноним 2018/11/19 05:28:26  №1297524 44
>>1297483
>типы возвращаемых значений можно сужать, но не расширять (=они ковариантны)
Вот тут не понел. Как это - сужать типы возвращаемых значений?
Ответы: >>1297548 >>1297574
Аноним 2018/11/19 05:55:30  №1297532 45
>>1297487
>Проблема с ArrayObject в том, что данные в него можно передать не только через конструктор, но и через методы.
Фигасе, о том, что туда данные можно и через методы передать я и забыл.
Таким образом может существовать объект, в котором будут данные другого типа.
>А ставя в них ограничения, ты нарушаешь принцип Лисков.
Это да. Даже не думал об этом. Код, работающий с ArrayObject, будет ожидать, что сможет нормально работать и с его потомком, а это не так.
Короче не нужно в потомке ломать обратную совместимость с базовым классом.
>Потому ArrayObject надо оборачивать:
То бишь, самому реализовать все нужные интерфейсы?
Ответы: >>1308856
Аноним 2018/11/19 06:41:19  №1297540 46
Screenshot118.png (11, 686x286)
286x686
>>1297487
Так по идее тогда любые доп-проверки аргументов метода нарушают принцип Лисков?

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

Но это все же слишком идеальный манямир, так не получится писать.
Ответы: >>1298037
Аноним 2018/11/19 07:10:43  №1297548 47
>>1297524
>Как это - сужать типы возвращаемых значений?
Если функция работает с какими-то свойствами объекта, то и в потомке этого объекта эти свойства будут присутствовать - их не выкинешь из класса.
Думаю, он это имел ввиду.
Ответы: >>1297677
Аноним 2018/11/19 08:23:55  №1297574 48
>>1297524

Здесь сужать - значит указывать наследника типа. Если метод в классе-родителе возвращает A, то метод в наследнике в теории может возвращать B (B extends A). Но по факту в PHP это пока не работает.
Ответы: >>1297828
Аноним 2018/11/19 12:08:22  №1297677 49
>>1297548
Да при чем тут члены класса и тип возвращаемого значения функции?
Это совсем разные вещи
Аноним 2018/11/19 17:45:05  №1297828 50
Аноним 2018/11/20 03:04:27  №1298000 51
>>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 52
>>1297540
>любые доп-проверки аргументов метода нарушают принцип Лисков?
Бам вопросу!
Ответы: >>1298052
Аноним 2018/11/20 07:29:11  №1298052 53
>>1298037

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

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

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

Теоретически тут может помочь закрытое наследование. Типа когда класс фактически наследуется от базового, но все его унаследованные методы становятся закрытыми, вне зависимости от настроек в базовом.
Тогда внешний код не будет знать, что класс является потомком какого-то другого.
Вроде в плюсах есть что-то такое.
Но звучит как-то бредово, не даром такой хуйни нигде почти нет.
>и потому не требуется совместимости. У нас задача - создавать контейнеры для разных типов данных (имитировать generic types).
Очень рад, что ты понимаешь, что я пытаюсь сделать, не то что здешние школьники.
>И потому мы можем от принципа Лисков отступить.
Ну вот хуй знает, ты меня прям с этим принципом озадачил.
Ответы: >>1298548
Аноним 2018/11/20 21:53:51  №1298548 55
>>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 56
>>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 57
Аноним 2018/12/10 00:48:01  №1308856 58
>>1297952

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

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

>>1297532

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

>>1293491

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

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