• Типобезопасная работа с массивами PHP
    +1
    Посмотрим в код:
    D:\project>php -a
    Interactive shell
    
    php > echo empty(0) ? 'true' : 'false';
    true
    php > echo empty('') ? 'true' : 'false';
    true
    php > echo empty(true) ? 'true' : 'false';
    false
    php > echo empty(false) ? 'true' : 'false';
    true
    php > exit
    

    0, '' (пустая строка) — значения которые надо заменить на значения по умолчанию, в моём понимании, и null само собой, и пустой массив. Я когда использую empty() я знаю что я делаю.
    В самой библиотеки вообще смотрим не на результат от empty($value), а смотрим на ValueHandler::has(), если мы берём с помощью ArrayHandler::get() из массива элемент с несуществующим индексом, то перед приведением типа мы используем значение по умолчанию.
    Код
    !empty(value)
    , был приведён в качестве примера.
  • Типобезопасная работа с массивами PHP
    0
    Спасибо, про DTO знаю. Сама библиотека родилась из задачи формирования DTO для фабрики классов.
  • Comment from a drafted post.
  • Объекты против структур данных
    +1
    у меня крыша поехала от этого чтения
  • От «Производства-Под-Зарплату» к «Производству-Под-Заказ». Последовательность шагов и пример практической реализации
    0
    речь о работе ради работы, вот такую работу оплачивать не надо, зачем ты делал, то что не надо? материал только потратил. Другой вопрос что был приказ бригадира / мастера, с этим надо по месту разбираться.
    Работа под зарплату в том и состоит, что вроде что то делал, а толку ноль, при этом то в чём предприятие нуждается. так и не сделал :)
  • Бег — идеальный спорт для удаленщика. Часть 2: физика и матчасть
    0
    Почитал первую часть. Автор не любит скучать, автор молодец. На велик автор забил потому что не было мотивации для покатушек, для бега мотивация нашлась потому, что сообщество.
    Я в своё время не мало бегал, без фанатизма, примерно 5 км за примерно 20 минут. Лет с 16 до 22, потом началась семейная жизнь и был перерыв от каких либо тренировок, в 28 сел на велик, начались покатушки / ПВД, и я себе сейчас представить не могу что я вместо велика побегу ногами, это же медленно! и устаёшь на порядок сильней.
    Бег это тяжёлый физический труд, а велик это приятное развлечение. Захотел втопил спринт что бы из «зелёной волны» не выпасть перекрёстков пять подряд, захотел уехал на трассу и ни каких светофоров, ни каких перекрёстков, только педали крути и медитируй.
    Зимой конечно не так кайфово, зато летом по грунтовкам в лесу приятно катать можно.
    Кому как, а для меня велик forever.
  • Бег — идеальный спорт для удаленщика. Часть 2: физика и матчасть
    0

    Откуда бы вероятность дтп стала большой? Если бы это было так то на проезжей части велосипедистов были единицы, но я у нас в Екатеринбурге год от года наблюдаю устойчивый рост.
    Если вам велик что бы ездить, а не что бы с кем то мериться, то 10к рублей хватит. Это конкчно не карбоновый и конечно не шоссейник с кассетой на 12 скоростейно нам же не перед девочками красоваться? Нам просто нони размять, для этого обычноно городского велосипеда хватит.
    Я велик храню дома, висит на стенке, занимает свои полметра в прихожей, было бы желание.
    -20 это разве беда? Встречный ветер беда, а температура на велике, в годной спорт одежде не ощущается.
    Да всё это стоит денег, но вложения вполне себе по карману, мы программисты или где?
    От дождя помогают крылья и правильная одежда.
    В общем дело вкуса. Я люблю активный отдых, мне нравиться смотреть по сторонам, кому то нравиться смотреть фильмы на смартфоне, о вкучах не спорят

  • Бег — идеальный спорт для удаленщика. Часть 2: физика и матчасть
    0

    Я не за полярным кругом конечно живу, но в минус 20 прогуляться это для меня не вопрос.
    Я одеваюсь по погоде когда идёт снег могу спокойно одеть лыжную маску что бы снег не бил по глазам и вообще так теплей. Если совсем жесть и сильный ветер в лиуо, то я не обламаюсь балаклаву одеть.
    Вообщем конечно каждый выбирает по себе. Каждый выбирает для себя.
    Мне очень важно ощущение свободы и движения. Эти чувства мне даёт только открытый воздух. В помещении этого не чувствуется

  • Бег — идеальный спорт для удаленщика. Часть 2: физика и матчасть
    +3
    зачем бегать если можно с тем же эффектом на велике гоняться?
    не понимаю людей которые хотят именно на тренажёре заниматься, вы и так весь день за клавиатурой пишите код, не хочется после этого на улицу выйти?
    Я после работы специально пешком домой иду, что бы хотя бы сколько то времени побыть на свежем воздухе.
  • Типобезопасная работа с массивами PHP
    0
    да классная мощная вещь, мой вариант сильно попроще.
  • Типобезопасная работа с массивами PHP
    0
    на мой вкус мой вариант более связный.
    Сегодня мой коллега полез в мой код, что бы внести необходимые правки, и сказал что этот мой парсер лажовая фигня.
    На что я ему сказал, что да конечно, в простейших случаях можно и без этих украшательств обойтись, но вот если тебе надо из массива взять другой массив, что бы взять другой массив, что бы сравнить значение элемента с таким то индексом со значением элемента из другого массива, то либа вполне себя оправдывает:
    $isDiffer = false;
    if ($was->has($key) || $after->has($code)) {
        $isDiffer = $after->get($code)->str()
            !== $was->pull($key)->pull()->get('VALUE')->str();
    }
    
    /* нативно это примерно так будет :*/
    $isDiffer = false;
    if (key_exists($key,$was) || key_exists($code,$after)) {
        $isDiffer = (string)($after[$code] ?? "")
            !== (string)(current($was[$key])['VALUE'] ?? "");
    }
    

    Вам какой вариант читабельней? Мне первый там всё «по „русски“ написано, можно не знать магию квадратных скобочек и нативных функций, достаточно читать „по русски“.

    Почему надо так вышкорябывать данные? потому что это Битрикс и там так своеобразно в обработчик событий подаются „значения до“ и „значения после“. А ты милый разработчик сиди и голову ломай как тебе их сравнить, и не удивляйся что „значения до“ это строки, а соответствующие „значения после“ почему то уже числа.
  • Типобезопасная работа с массивами PHP
    0
    Получить с фронта JSON, распарсить и положить в базу в причёсанном виде.
    Передать в класс-фабрику значения правильных типов.
    Вот это две моих боли которые привели к оформлению кода в библиотеку.

    Сначала класс назвался ArrayParser и всё что мог это выдавать значения по индексу.
    Меня утомляло выписывать однообразные проверки, тут в коментах уже приводил примеры, вообще использование однообразного кода раздражает, если что то делается одинаково оно должно быть упаковано в метод.

    Потом мне надо было получать в API данные и тупо фигачить их в базу, но не в плоскую структуру а в иерархическую, перед тем как значение положить в базу его надо было привести из строки в какой то тип, потом я стал формировать записи БД через методы классов и уже в методы класса-фабрики надо было передавать те же самые значения, и когда ты в аргумент с типом инт отдаёшь переменную с типом стринг, интерпритатор почему то падает.
    И вот как то так пришёл к приведению типов.
    При чём вся эта крутоверть была не на одном проекте а на четырёх разных за полгода, с разными стеками, общее было только в PHP, даже базы были разные, SQLite Postgres MySql, полный привет, особенно что касается работ с датами, везде свой методы.

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

    Вышёл в свет с этой библиотечкой, получил массу советов.
    Всем спасибо, попробую использовать ваши советы в своей повседневной работе.
  • Типобезопасная работа с массивами PHP
    0
    Я нашёл два метода:
    1. CIBlockElement::GetPropertyValues
    2. CIBlockElement::GetPropertyValuesArray

    Первый возвращает значения с ключом — идентификатором, по которому нельзя понять что внутри, предварительно по ИД надо найти код свойства, то есть предварительно надо словарик свойств получить.
    Второй метод возвращает свойства элемента с ключом — кодом, это годный для меня вариант.

    Как получить объект?
  • Типобезопасная работа с массивами PHP
    0
    имелось в виду бесконечные:
    key_exists('key',$array);
    !empty(value) ? value : $default_val;
    
  • Типобезопасная работа с массивами PHP
    0
    вы, зачем-то, прогоняете альтернативное значение через объект, делая его интерфейс крайне нетривиальным

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

    А кто код пишет? если вы ссылку на экземпляр отдадите наружу, то с её помощью экземпляром можно будет воспользоваться. Библиотека почему должна этому препятствовать?
    Мне вообще не понятно почему библиотека должна как то ограничивать своего пользователя? можно создать экземпляр с каким то значением и получить его приведённым к чему угодно и сколько угодно раз, и каждый раз перед получением значения можно устанавливать разные значения по умолчанию, почему нет?
    Если хочется, то с помощью метода type() можно получить исходный тип.
    Библиотека предназначена для парсинга, экземпляр класса живёт одну итерацию цикла, в одной ветке условного оператора, но если вам хочется использовать этот класс глобально или гонять по коду туда сюда, то это ваше дело.
  • Типобезопасная работа с массивами PHP
    0
    ValueHandler это хранилище, которое может отдать значение приведённое к нужному типу, может выдать тип этого значения, может показать флаг было ли значение задано.
    Конструктор объекта в ValueHandler отсутствует, это не фабрика.
    У меня не было цели сделать 100500 классов, мне по функционалу хватило двух классов (на самом деле четырёх).
    Разделять на классы имеет смысл если планируется активно менять функционал. У меня таких планов нет.
    Ради искусства я только прикрутил фабрику для ValueHandler, ещё что то лепить ради красоты уже не хочется.
    Но вы можете сделать пул реквест с вашей правильной реализацией.

    И кстати можете дать ссылку на «любой сериалайзер», думаю благодарен за неё буду не я один.
    И ссылку на почитать про Option.

    С методом default() что не так? обычный сеттер, магия в геттерах для значения:
    // значение имеется ? 
    $result = $this->has() ?
    // да, вернуть значение
     $this->_value
    // нет, вернуть значение по умолчанию
    : $this->_default;
    

    в чём криминал?
  • Типобезопасная работа с массивами PHP
    0
    можно обойтись, а можно не обойтись, здесь:
    $pointInf['address']

    будет лишний варнинг если индекса нет.
    Прелесть библиотеки в автодополнении, жмёшь контрл + пробел и выбираешь вариант, на клавиатуре, за секунду, обычно IDE подставляет первыми вариантами то что тебе надо и для того что бы набить код уходит минимум времени, часто пишешь на одном дыхании.
    Можно писать так:
    $val1 = (int)(array_key_exists('key1', $vars) ? $vars('key1') : $def1);
    $val2 = (int)(array_key_exists('key'2, $vars) ? $vars('key2') : $def1);
    $val3 = (float)(array_key_exists('key3', $vars) ? $vars('key3') : $def2);
    $val4 = (bool)(array_key_exists('key4', $vars) ? $vars('key4') : $def3);
    $val5 = (int)(array_key_exists('key5', $vars) ? $vars('key5') : $def1);
    

    а мне нравиться писать так:
    $vars = new ArrayHandler($vars);
    $val1 = $vars->get('key1')->default($def1)->int();
    $val2 = $vars->get('key2')->default($def1)->int();
    $val3 = $vars->get('key3')->default($def2)->double();
    $val4 = $vars->get('key4')->default($def3)->bool();
    $val5 = $vars->get('key5')->default($def1)->int();
    

    и не надо ни каких ребусов решать с "??" и когда дочитал всю строку выражения не надо вспоминать что результат надо привести к типу который был указан в начале строки.
    Всё делается линейно:
    $val1 = 
    // в $val1 запиши значение следующего выражения
    $vars
    // из массива $vars
    ->get('key1')
    // возьми элемент с индексом 'key1'
    ->default($def1)
    // используй значение по умолчанию $def1
    ->int();
    // приведи значение к int
    

    Мне такой код легче заходит, библиотека написана для себя и мне не жалко ей поделиться, кто может обойтись без неё обходитесь, кто же вас неволит?
  • Типобезопасная работа с массивами PHP
    0

    Смысл использования ArrayHandlera в том что по get() он выдаёт ValueHandler у которого есть методы для приведения типов.
    Можно упрощать массив с помощью array_column(), но для типобезопасности всё равно надо создать экземпляр ArrayHandler.
    Смысл использования библиотеки в интеграции функционала.
    Можно писать $number = (int)@(vars['key']) всегда на выходе будет int и ни когда не будет ошибки "ключ не найден", но как то не очень нравиться мне такой код.

  • Типобезопасная работа с массивами PHP
    –1

    Идея с классами вполне себе альтернативный вариант, но надо гетеры выписать, это чуть сложней чем просто одна строка get('side_numbers')->int().
    И в базу писать массив как то проще, с классом придётся этот массив предварительно создать и наполнить.
    array_column() — да, спасибо за подсказку, можно использовать внутри simplify().
    Короткий срок жизни кода это когда нам надо завести в базу исходные данные которые позже будут обработаны с помощью SQL.
    Моя последняя задача была о том что бы из csv залить в базу точки продаж и с помощью описательного адреса для каждой точки определить гео координаты.
    А дальше конечные пользователи CRM с точками продаж должны работать через админку Битрикса.
    И кругом у тебя массивы — csv — массив, ответ геокодера — массив, ответ ORM Битрикса — массив.
    Соответственно с обработкой этих данных и появлялись новые требования к этой библиотеке и исходя из них развивался функционал.

  • Типобезопасная работа с массивами PHP
    –2

    Кому надо разберётся. Или вообще публиковать ни чего не надо если стиль излржения кому то может показаться не достаточно доходчивым ?

  • Типобезопасная работа с массивами PHP
    0

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

  • Типобезопасная работа с массивами PHP
    –6

    Главное что бы код был ок. А пресс релизы пусть пресс секретари пишут и прочие контент менеджеры. Каждоиу своё

  • Типобезопасная работа с массивами PHP
    –1

    PDO::FETCH_CLASS — Зачем такие сложности? Специфика задач подразумевает очень короткий срок жизни кода. И даже безотноситено этого, как использование PDO::FETCH_CLASS гарантирует мне соблюдение типов?
    Автоматического приведения типов не случиться, присвоения значений по умолчанию тоже.
    Писать каждый раз логику? вот я и написал библиотеку один раз что бы использовать везде. Будь у меня источник данных PDO или .csv, или json из какого то API, не важно какой источник данных, если он сводиться к массиву то с помощью своей библиотеки у меня всегда на выходе будут переменные строго заданных типов.
    FETCH_COLUM по этой же причине не всегда применим, по этой же причине методу simplify можно отдать массив с нужными нам индексами и он вернёт только заданные колонки, это нужно когда мы из
    .csv файла парсим не все колонки, а только две три.

  • Типобезопасная работа с массивами PHP
    –2

    Спасибо за ссылку.
    Посмотрел на коллекции. Весь функционал коллекций это работа с массивом. Но основное назначение моей библиотеки это работа со значением.
    Во первых понять определено оно или нет.
    Во вторых получит значение строго заданного типа, либо получить значение по умолчанию.
    Этот функционал не сложно сочинить самому, занимает он пять строчек кода, но когда тебе это надо сделать для 5 — 15 колонок, тебе очень хочется упихать обработку одной колонки в одну строчку и не страшно если это будет цепочка вызовов, и не страшно что под капотом будет работать не 5, а 500 сторок кода, это всё не имеет значения когда тебе просто надо накидать код, который жить будет от силы неделю, а скорей всего уже завтра утратит свою актуальность.

  • Типобезопасная работа с массивами PHP
    0
    Про float, верное замечание.
  • Типобезопасная работа с массивами PHP
    –3
    нет конечно, я только по гихабу поиск делал, репозиторий Ларавея в результаты поиска не попал. с другой стороны, мне парсеры на Ларавеле писать?
  • МЕНЯТЬ людей. Или… менять Людей. О том, как «взлететь» проекту преобразований
    0
    Здравая статья, за что минусы непонятно. Если хочешь что то в жизни поменять — начни с себя. Известная истина :)
  • Зарплатная вилка. Ты ж у мамы программист
    –1
    божественно!!!
    самое лучшее объяснение качества программных продуктов как изделия, и качества программного кода самого по себе.
    Идеальный код нужен только даром, бабки заплатят за самый мимально хоть как то работающий, только что бы сдать проект, а как с ним жить потом, это проблемы заказчика, и немного авторов ТЗ.
  • 4 шага от экономиста до руководителя заказной разработки, или IT как способ борьбы со скукой
    0
    не понимаю я этих минусов за статью, конечно статья пустая и в ней намечен только план, так и цена ей ноль, но ни как не минус.
  • На чем разрабатывать Oracle разработчику в 2019-м году (и после)
    0
    +1, присоединюсь, было бы интересно послушать обзор, когда сам с dbForge работал 4 года назад, там было пара багов которые делали работу не возможной, может быть сейчас уже исправили?
    Сама по себе IDE очень приятная.
  • Я в одиночку отрефакторил 15 тысяч строк легаси. Это были худшие две недели в жизни
    +1
    У автора определённо литературный талант, прочитал на одном дыхании, во многом узнавал себе.
    Автор, да и фиг с ним что твой идеальный код ушёл в утиль, за то ты можешь собой гордиться что ты смог проделать титаническую работу и существенно повысить качество этого кода.
    У тебя появился ОПЫТ, ты применил НАВЫК, который сможешь с меньшим успехом применить в более везучем проекте.
    Автор ты молодец!
  • Снова про phpQuery
    0
    Композер подключить и пакет вытянуть (либу) это две строчки в командной строке. Во время работы скрипта Композер ни чего лишнего не грузит, кроме автозагрузчика.
    То есть что я хочу сказать что Композер это не утяжеляет проект ни разу.
  • Мой опыт работы в Фирме 1С
    0
    +1, m-rv спасибо что приоткрыли завесу тайны о закулисы ОдинЭса
  • Как собеседовать работодателя?
    +2
    спасибо за хороший чек лист. Я думаю кому то будет приятно понять, что у него всё хорошо.
  • PHP Xdebug proxy: когда стандартных возможностей Xdebug не хватает
    +2
    Отладка в режиме php-fpm несколькими разработчиками выходит за рамки данной статьи, но описана, например, здесь

    ссылку забыли подставить
  • Тестовые задания на собеседовании разработчика — есть ли в них смысл?
    0
    что в нём плохого?
    задание хорошее для работодателя если он хочет оценить соискателя с минимальными затратами времени для соискателя. Если у вас другое мнение, то я вам своё не навязывал.
  • Тестовые задания на собеседовании разработчика — есть ли в них смысл?
    0
    как минимум не надо человек в кадрах оформлять и прочие бумажки.
  • Тестовые задания на собеседовании разработчика — есть ли в них смысл?
    +1
    тестовое задание это именно повод поговорить. И это действительно способ отсечь тех кто «просто спросить».
    И конечно тестовые задания делаются по принципу — что быстрей то и сделал, и если ты получил дооолгое тестовое, то ты его дооолго не делаешь, и скорей всего работу найдёшь раньше чем до выполнения этого задания дойдёт очередь.
    Мне как работодателю, всегда интересно посмотреть на код будущего сотрудника, за 2-4 часа можно написать достаточно кода что бы показать кто ты есть, поэтому чем то громоздким ни когда не гружу.
    Тестовых за свою жизнь я сделал не мало, из моих 40 репозиториев на гитхабе, только 5 это какие то проекты, остальное — тестовые.
    Тестовые попадаются интересные, одно из 5-ти не чаще, и как правило эти тестовые укладываются в один рабочий день, а чаще в пару часов.
    Например написать сложение столбиком двух чисел произвольной размерности ( одно число это 40+ десятичных знаков), тут мы видим и как человек с валидацией работает и как человек делает декомпозицию и делает ли он её вообще, как называет переменные и как оформляет код.
    Хорошее задание, возьмите себе на заметку.
  • ITIL и ITSM — история большого обмана. Есть ли польза? Сколько это стоит и кому точно НЕ стоит «внедрять ITIL»?
    0
    Здравый смысл ни кто не отменял, решения о том или ином внедрении должен принимать эксперт по этой области деятельности, а не его менеджер, и тем более не «генеральный менеджер».
    Процессы управления IT услугами надо внедрять в любом случае, но не обязательно под копирку, наверное, лучше с оглядкой на ITSM.
    Вы как думаете?
  • История одного удачного применения SRP в Legacy проекте
    0
    без конкретных примеров всей прелести нового подхода не понять. примеров бы.