
Andrew
09.09.2018
21:01:26
@ExileeD https://paste.ofcode.org/4y8bD9VLpAJZDpKrHrkhLE
и так по кругу
не влезло все
раз 15 прошло одно и тоже что по ссылке

Google

Dmitriy
09.09.2018
21:02:26
комплируется же

Andrew
09.09.2018
21:03:57
по кругу?)
ltkfk rcnfnb bp ja ljrjd
https://confluence.atlassian.com/bitbucket/laravel-with-bitbucket-pipelines-913473967.html

ivan
10.09.2018
04:58:53
Hello. Почему в __toString() нельзя бросать Excception ?

Andrew
10.09.2018
05:37:44

ivan
10.09.2018
05:39:51
"there is no way to ensure that an exception thrown during a cast to string would be handled correctly by the Zend Engine" блин. (

Andrew
10.09.2018
05:47:46
Вот только зачем?

ivan
10.09.2018
05:48:56
Мне не нужен обходной путь. Просто хочу видеть весь трейс когда возникает ошибка.

Andrew
10.09.2018
05:53:00

ivan
10.09.2018
06:29:59

Maksim
10.09.2018
06:31:37
Если в toString есть логика, которая может выбросить эксепшен, то чет код воняет

Google

ivan
10.09.2018
06:39:31
Если в toString есть логика, которая может выбросить эксепшен, то чет код воняет
why? К примеру:
class TipOfTheDay(\DateTime $time) {
public function __toString(){
return \to_camel_case(
$this->db->fetchOne('
Select tip from tips where day = ? ',
$this->time->format('y-m-d'))
);
}
}почему код плохой? Метод toString получается вообще костыль, так как мы должны думать о реализации методов которые мы вызываем.

Maksim
10.09.2018
06:40:35
Я б за такую херню тупо уволил.
И, да, toString - своего рода костыль. Но это не значит, что надо такой мрак в нём творить

Alexander
10.09.2018
06:44:07

Maksim
10.09.2018
06:44:44

Alexander
10.09.2018
06:45:53

ivan
10.09.2018
06:47:16
Поэтому я и не пишу ничего в методе __toString и вообще его не юзаю. Хотя он должен привнести более удобное написания кода. Я хочу описать класс Tip и он будет представлять собой string. Как он будет ее генерировать - это не проблема представления. Кароче toString надо делать deprecated)

Alexander
10.09.2018
06:49:48
Должен быть отдельный класс, который порождает объекты Tip а Tip.__toString будет простым return $this->text;

ivan
10.09.2018
06:50:25

Alexander
10.09.2018
06:51:19
зачем и почему?
Затем, что не стоит в одном классе мешать логику получения данных и логику представления
А toString это уровень представления

Борис
10.09.2018
06:53:20
__toString это рабочий метод, для представления объекта в одну строку для какого-нибудь debugger. Вообще его спиздили с Джава, и как все что спижжено с Джава, не до конца проработано. Его просто не нужно использовать в своем бизнесс коде. Максимум, в каких-то дебаг либах, быть может.
А то что ты в toString лезешь в БД - тут да, только уволить

ivan
10.09.2018
06:53:35

Alexander
10.09.2018
06:54:31

ivan
10.09.2018
06:54:49
Да, это представление в виде строки
все методы которые возвращают ленту это "представление" ?
можно ссылку чтобы где-то прочитать о "представление" или это вы сами придумали такую штуку ;)

Maksim
10.09.2018
06:59:40

Артур Евгеньевич
10.09.2018
07:06:31
debugInfo имеешь ввиду, или что то новенькое?

Alexander
10.09.2018
07:09:39

Maksim
10.09.2018
07:12:03

ivan
10.09.2018
07:12:14
ну да. v - view) srp - в курсе. не понятно почему TipOfTheDay - представление.
Получается мне всегда надо юзать dto - для представления данных и юзать factory для создания этих объектов. Все верно?

Google

Alexander
10.09.2018
07:14:13

ivan
10.09.2018
07:18:00
чем лучше дата провайдер и dto чем держать логику в объекте? Объект это и есть поведение, или я не прав?

Alexander
10.09.2018
07:27:38
Он у тебя знает и как получить данные, и как работать с ними, и даже как представить их пользователю. Не многовато ли?

ivan
10.09.2018
07:30:26

Alexander
10.09.2018
07:31:16
Пока вроде ничего лишнего

ivan
10.09.2018
07:33:24
class RandomJoke{
public function getJoke(){
return array_rand($this->db->fetchAll('select text from jokes limit 3 order by time'));
}
}Так норм?. Правильно ли я понимаю - вас напрягает форматирования текста (то есть представления)?

Alexander
10.09.2018
07:34:12

Sergey
10.09.2018
07:34:36
мало ли тебе понадобится не рандомный
ну и в целом как коллекцию проще это воспринимать
или тебе понадобится 5 рандомных

ivan
10.09.2018
07:35:48

Sergey
10.09.2018
07:36:27
но это от задачи зависит и от того как методы юзаются

ivan
10.09.2018
07:36:41

Alexander
10.09.2018
07:38:20
class RandomJokes implements JokeProvider
{
public function getJoke(): Joke
{
return array_rand([new Joke('foo'), new Joke('bar')]);
}
}
class DailyJokes implements JokeProvider
{
public function __construct(\DateTimeInterface $today)
{
$this->today = $today;
}
public function getJoke(): Joke
{
return new Joke($this->db->fetchFromJokesTableByDate($this->today));
}
}
Если хочешь пользоваться методом __toString
class Joke
{
public function __constuct(string $text)
{
$this->text = $text;
}
public function __toString()
{
return $this->text;
}
}

ivan
10.09.2018
07:39:14

Alexander
10.09.2018
07:45:00

ivan
10.09.2018
07:45:46

Google

ivan
10.09.2018
07:45:53
Логика объекта должна быть скрытая - а мы забираем с объекта логику и забрасывают ее в дата провадеры. Мы начинаем гонять данные между объектами.

Alexander
10.09.2018
07:50:39
JokesList — вполне может содержать логику получения данных, это получается вполне себе такой репозиторий

Sergey
10.09.2018
08:06:54

ivan
10.09.2018
08:11:20
foreach(new TodayJokes() as $joke){...}
TodayJokes:getIterator() )

Sergey
10.09.2018
08:15:31

Maksim
10.09.2018
08:16:23
от того, что псалм могёт, жизнь, к сожалению, лучше не становится :(

Admin
ERROR: S client not available

Alexander
10.09.2018
08:16:52

Sergey
10.09.2018
08:18:04
странно почему шторм до сих пор не умеет
1. psalm юзает php-parser, который четкий и понятный. шторм юзает свой парсер (потому что это IDE и 80% времени ему надо разбирать невалидный код), что сильно усложняет дела.
2. в phpstorm свой парсер докблоков
3. нет никаких стандартов определяющих как задавать типы для array shapes. Может быть в phpdocumentator добавят и тогда уже будут дела идти.
это как с дженериками. Сейчас в дженерики более-менее умеет только psalm и phan. Шторм все еще оперирует своими Foo[]|ArrayCollection
пока нет RFC в php с описанием как оно должно работать, пока нет стандарта который описывает как это все регламентируется в докблоках у всех будут свои реализации просто.
p.s. интересно чем закончилась дискуссия на тему "а давайте мы просто синтаксис добавим что бы статический анализ можно было делать но на рантайм бы он не влиял"


Maksim
10.09.2018
08:22:11
ну здесь и сейчас про псалм знают единицы. Следуют его советам и того меньше.
пока такая ситуация остаётся, толку от него не особо много

Sergey
10.09.2018
08:23:53
давай так, псалм пилит 1-2 человека, это типа не сурьезно. Но хоть что-то
p.s. если хочешь поблевать - посмотри исходники typescript-а

Maksim
10.09.2018
08:24:47
да понятно, что лучше, чем ничего и жрать надо, что дают, но всё же хочется светлого будущего на сколько это возможно)

Sergey
10.09.2018
08:25:05
а ты готов перейти на имутабельность?

Google

ivan
10.09.2018
08:25:07
Например мне надо объект "Шутка" Я хочу увидеть все возможные способы его конструирования и выбрать для себя оптимальный - или написать новый. Если мы юзает всегда датапровйдер - ок. Ищем кто конструирует объекты и нет проблем. Но если в некоторых случаях мы напрямую в DTO забрасываем данные (например в контроллере) тогда уже трудно разобраться среди большого количества строк - как реально создать объект. и сложно выбрать подходящий. Поэтому и подумал что создавать объект который будет содержать алгоритм работы - норм.

Maksim
10.09.2018
08:25:15

Sergey
10.09.2018
08:25:53
$joke = Joke::builder()
->withAuthor($someAuthor)
->withText($someText)
->withSomeOtherStuff($stuff)
->build();

ivan
10.09.2018
08:28:06
пробовал - не катит. Вы же не всегда будете писать билдеры. И получается что когда вам нужно объект определенного типа вам приходится искать реалзации этого типа + использование конструкторов.
Спасибо всем. Некоторые моменты для себя прояснил;)

Sergey
10.09.2018
08:28:49

Alexander
10.09.2018
08:29:37
изначальный вопрос был "почему в __toString нельзя эксепшн кидать"
и пример кода, где в __toString было $this->db->fetchOne

ivan
10.09.2018
08:32:03
Основной вопрос - почему объект не может скрывать логику создания данных.

Alexander
10.09.2018
08:33:10

Sergey
10.09.2018
08:33:20

ivan
10.09.2018
08:33:25

Alexander
10.09.2018
08:34:06
$joke = $joker->getJoke();
echo $joke;
$joker = new RandomJokeProvider();
если лишняя строчка кода мешает, то напиши так
echo (new RandomJokeProvider())->getJoke();
я бы не сказал, что это прям такое сильное ограничение. оно просто дает меньше возможностей насрать в коде

Dmitry
10.09.2018
08:39:52
(new RandomJokeProvider())() =)

Alexander
10.09.2018
08:41:06

F01134H
10.09.2018
10:42:04