Ответы пользователя по тегу PHP
  • PHP: нужно ли создавать массив перед его заполнением?

    @kastigar
    С isset абсалютно верно. Но я бы не стал называть это «чтение», т.к. isset — это специальная конструкция языка. Если вы попытаетесь спросить индекс не-массива, то:
    unset($a);
    echo $a['a']['b']['c']; // будет warning
    echo $a['a']; // тоже будет warning
    isset($a['a']['b']['c']); // не будет warning'а
    

    С записью тоже есть нюансы. Если переменная (даже если это элемент массива) не установлена, то её можно неявно использовать как массив. Но если она установлена и не является массивом, то могут быть проблемы:
    <?php
    unset($a);
    $a['a'] = 'a'; // это ок
    $a['b'] = 1; // это ок
    $a['a'][0] = 'b'; // перезапишет первый символ строки!!!
    $a['b'][0] = 'b'; // будет notice, про обращение к скаляру, как к массиву
    unset($a);
    $a['a']['b']['c']['d'] = 'str'; // тоже ок
    $с = new SomeClass;
    $с[0] = 'c'; // Если класс имплементил ArrayAccess интерфейс, то вызовется метод offsetGet,
                 // иначе Fatal error
    

    Так что если не уверены, что содержится в переменной или элементе массива, то лучше явно проинициализируйте массив.
    Ответ написан
    Комментировать
  • Работа с Doctrine ORM: Пользовательские репозитории?

    @kastigar
    Не вижу ничего плохого в статическом get методе. ИМХО, в вашем случае — это самый лучший вариант:
    — по производительности не должно уступать или сильно уступать прямому доступу через EM
    — не нужно переживать о захламлении кода
    — доступность метода из любых скриптов/классов

    Да, PHP такой язык, code completion очень часто не доступен. Лично я часто использовал instanceof как временное решение. Т.е. как только нужен completion, я добавляю instanceof. После того как ф-ция дописана, я его убираю. Не самое идеальное решение, но в большинстве случаев хватало. Для репозиториев доктрины делал бы с помощью статического get метода.
    Ответ написан
    Комментировать
  • CPP вставки в PHP-скрипты

    @kastigar
    Помню когда-то натыкался на такой то ли экстеншен, то ли класс. Он позволял выполнять c/c++ код. Стало интересно как. Посмотрел исходники, оказалось всё банально: исходник писался во временный файл, затем компилировался с помощью gcc и выполнялся. Вот в принципе и всё))) Быстрой поиск не нашёл его(давно это было), может вам повезёт больше.
    Ответ написан
    Комментировать
  • Redis. Как записать в ключ TimeStamp с сервера, где запущен Redis-сервер?

    @kastigar
    А по поводу патчить Redis, если все-таки решитесь, вот описание протокола. Нужно создать специальный вид аргумента, с плэйсхолдерами. Я бы добавил, $PLACEHOLDER, получается что если после $ идет числовое значение, то это длина значения и мы его читаем с новой строки (то есть как происходит сейчас). Если же после $ идет нечисловая строка, то это плэйсхолдер. В данном случае, это может быть $TIMESTAMP, который говорит, что аргументом является текущий таймстэмп. Это также позволит добавить еще плэйсхололдеров в будущем (правда не могу придумать каких). Если же нужна большая гибкость, можно заюзать плэйсхолдеры прям в значениях, например что-то вроде %TIMESTAMP%, но это сделает код обратно не совместимым.
    P.S. я бы все-таки смотрел в сторону NTP :)
    Ответ написан
    2 комментария
  • Redis. Как записать в ключ TimeStamp с сервера, где запущен Redis-сервер?

    @kastigar
    Насколько мне известно, Redis такого не умеет. Поэтому есть такие альтернативы:
    — не давать открытый доступ к Redis, а предоставлять сервисы (достаточно трудоёмкая задачка и возможно лишняя, но более правильная, так как нет зависимости от бэкэнда; на самом деле все зависит от задачи)
    — пропатчить Redis (легче первого, но будут проблемы, если патч не примут: придется ручками саппортить такую фичу)
    — настроить синхронизацию времени с помощью NTP-клиента (самое простое, но если нет рута, то невозможно выполнить)
    Ответ написан
    Комментировать