
Aleh
13.12.2016
14:26:13
возможно, ну епта

Sergey
13.12.2016
14:26:38

Viktor
13.12.2016
14:26:53
ну ок :) я ретируюсь :)

Sergey
13.12.2016
14:27:04
да, это пересекается, ибо ты не знаешь тип переменной в которую ты инстанцируешь что-то

Google

Artem
13.12.2016
14:27:05
буря в стакане)

Sergey
13.12.2016
14:27:20
но тайп хинтинг тебе тут не поможет никак вообще
и потому тебе надо проверить "а то ли мы получили"
assert($foo instanceof Type);
а ассерты можно будет в продакшене отключить, но ты получишь информацию о типах и все проверки которые надо

Viktor
13.12.2016
14:29:18
именно в пхп тайпхинтинг предотвратит вызов чего-то с аргументом неправильного типа. что позволит избежать какого-то сайдэффекта который мог бы быть без него. но если есть тайпхинты которые уже выполняют проверку - нахрена избавляться от них и навешивать что-то сверху?

Sergey
13.12.2016
14:31:09

Viktor
13.12.2016
14:31:35
либо ты напишешь
if (!$foo instanceof Type) throw new Exception(...)
либо ты навесишь глобальный обработчик ошибок, который будет все превращать в исключения и будешь просто писать
bar($foo)
и отлавливать исключение без обвешиваня вызова каждого метода с тайпхинтом дополнительной проверкой типа

Sergey
13.12.2016
14:31:59
ну опять же
я предлагаю возможность опционально отключить тайп хинтинг
ты же можешь отключить ассерты например)

Artem
13.12.2016
14:32:59

Sergey
13.12.2016
14:33:06
в смысле?

Google

Viktor
13.12.2016
14:33:10
ну, лично я считаю это очень рискованным, т.к. нельзя протестировать 146% кода со всеми возможными и невозможными параметрами.

Sergey
13.12.2016
14:33:14
у меня на проде врядли будет такая ошибка

Viktor
13.12.2016
14:33:23
лучше исключение чем сайдэффект

Sergey
13.12.2016
14:33:31
исключение и есть сайд эффект

Aleh
13.12.2016
14:34:47
а вы серьезно try-catch делаете по ошибкам тайпхинта?)

Viktor
13.12.2016
14:34:51
нет, исключение - это исключение. а сайдэффект - это сайдэффект. в исключении у тебя код свалится в место обработки исключений, а в ином случае у тебя к 1 прибавится 1.2, когда требуется int, но он внезапно отключен

Artem
13.12.2016
14:35:10
исключение - это не сайд эффект

Viktor
13.12.2016
14:35:13
отключена проверка типов, я имею ввиду

Sergey
13.12.2016
14:35:40
http://stackoverflow.com/questions/10703232/why-is-the-raising-of-an-exception-a-side-effect
мне лень писать потому ссылочка

Artem
13.12.2016
14:36:52
ок

Yaroslav
13.12.2016
14:37:14
простите, я в этот чат писал что WP это норма?

Sergey
13.12.2016
14:37:27

Artem
13.12.2016
14:37:28
почитал. всегда думал, что сайд эффект (из фп) - это когда изменяешь состояние - пишешь в бд, на экран и т.д.

Viktor
13.12.2016
14:37:40
то что всё должно быть покрыто (и покрыто уже) тестами - это понятно. но к примеру есть какойнить метод вида getRandomInt(int $from, int $to), который должен возвращать int. вы его протестили, всё отлично, но... в рантайме туда может прилететь какойнить float или boolean :)
не думаю что все возможные кейсы покрыты тестами :)

Sergey
13.12.2016
14:38:28

Google

Sergey
13.12.2016
14:39:09
причем когда у тебя отработает тайп хинт - не факт что оно проигралось радяшком
скорее всего контроль за типами был потерян где-то далеко в цепочке вызовов

Viktor
13.12.2016
14:39:33

Sergey
13.12.2016
14:42:16
и?
потеря данных произошла - нет

Viktor
13.12.2016
14:42:43
и в итоге у нас остается три варианта:
1) не трогать тайпхинт и пусть пшп сам проверяет параметры
2) оборачивать все в instancof/is_integer/is_object/is_something
3) забить хер на всё и надеяться на авось
первый вариант отличный, второй добавит кучу лишнего кода, третий вообще говно

Sergey
13.12.2016
14:42:55
блин

Viktor
13.12.2016
14:42:57

Sergey
13.12.2016
14:43:00
ты не понял видимо мотивацию "отключения"
тайп хинтинг всего и вся существенно влияет на рантайм
и его производительность

Viktor
13.12.2016
14:43:12
я понял мотивацию

Sergey
13.12.2016
14:43:19
причем если у тебя все покрыто информацией о типах
то тебе в целом не нужен этот самый тайп хинтинг в рантайме

Viktor
13.12.2016
14:43:29
но пшп - это пшп! там в рантайме может случиться любое говно

Sergey
13.12.2016
14:43:36
можно отключить автоматический каст типов в рантайме
о
идея
для кода который под strict_types

Google

Sergey
13.12.2016
14:43:57
отключать касты и рантайм проверки типов
и тогда все вроде счастливы, нет?
в переменной инт а ты пытаешься к нему строку приложений - касты запрещены - все проигрывает

Viktor
13.12.2016
14:44:34
неа, т.к. оно все равно в рантайме проверяет соответствие типов

Sergey
13.12.2016
14:44:35
а вот код который с weak type
там оставить как есть

Viktor
13.12.2016
14:45:52
ладно, пойду спать, а то уже внезапно глубокая ночь... а вот был бы тайпхинт на это - было бы исключение)))

Artem
13.12.2016
14:52:12
спасибо за идея отключать тайп хинтинг в проде

Admin
ERROR: S client not available

Sergey
13.12.2016
14:52:23

Artem
13.12.2016
14:53:09
после сфинкса эластика кажется медленной (индексация)
но удобной из-за нормальных дельта индексов
т.е. можно даже не знать что такое дельта индексы

Sergey
13.12.2016
14:54:18
поиск шустрый, а это главное
ну и индексация ж не нужна полная постоянно

Alex
13.12.2016
14:58:26
Индексация не полная, а при импорте данных. Из-за чего распределение нагрузки не равномерное.
Читал что сорл плох в во время конкурентного обновления индексов.
http://blog.socialcast.com/realtime-search-solr-vs-elasticsearch/

Sergey
13.12.2016
15:05:19
solr ведь поверх lucene, как и эластик

Google

Alex
13.12.2016
15:08:17
И статейка то 5-ти летней давности...

Artem
13.12.2016
15:19:05
а вот код который с weak type
не все обсуждение выше читал, но интересен личный опыт. вы не испоользуете тайп хинтинг и все чекаете через assert и отключаете это в проде?

Aleh
13.12.2016
15:22:05
не, все пользуются тайпхинтами)

Artem
13.12.2016
15:22:36
ок, а то выглядит как 80lvl оптимизации)

Sergey
13.12.2016
15:22:41
я предлагал дать возможность выключать его влияние на рантайм
опциональную
с кучей красных предупржденией "сначала 10 раз подумай сынок"
что бы можно было написать
class Foo
{
public string $email;
public string $password;
public string $name;
public \DateTime $birthDay;
public ?string $aboutMe;
}
и статический анализатор бы проверил что мэппинги эти правила осблюдают
и те оверхэды которые налагает реализация тайпхинтинга для пропертей невилировались на продакшене

Artem
13.12.2016
15:27:12
статический анализатор - это что-то вроде phan'а?

Sergey
13.12.2016
15:28:05
да

Artem
13.12.2016
15:28:30
ок! спасибо за подробное объяснение ?

Alexander
13.12.2016
16:10:03
$items = $this->repository->findAll();
foreach ($items as $item) {
$item->setFoo('foo');
}
$items = $this->repository->findAll();
foreach ($items as $item) {
$item->setBar('bar');
}
$this->objectManager->flush();
А подскажите, в доктрине отработают оба цикла? Или второй перезапишет значения первого?

Sergey
13.12.2016
16:11:38
странный вопрос) они оба отработают
после того как они попали в доктрину, они становятся managed by UoW

Alexander
13.12.2016
16:12:15
в плане, второй findAll() вернет объекты, у которых значение foo будет изменено первым циклом?

Sergey
13.12.2016
16:12:28
и даже если заново запросишь с базы, все равно будет юзаться версия из UoW

Alexander
13.12.2016
16:12:36
ага, спасибо