Переизобретая __toArray()

Пытаясь изобрести свой метод toArray()1 для сериализации объектов в ассоциативный массив наткнулся на пару интересных моментов. Методы method_exists и is_callable Можно предположить, что is_callable будет возвращать true для всех методов где method_exists возращает true. Но в действительности это не так. var_dump(is_callable($class, '__toString')); // bool(false) var_dump(method_exists($class, '__toString')); // bool(true) Доступ к закрытым и защищенным свойствам И существование документированной фичи, что при явном приведении типа объекта к массиву, можно получить содержимое скрытых свойств....

December 25, 2014

Имена переменных в PHP

В документации по php сказано: Переменные в PHP представлены знаком доллара с последующим именем переменной. Имя переменной чувствительно к регистру. Имена переменных соответствуют тем же правилам, что и остальные наименования в PHP. Правильное имя переменной должно начинаться с буквы или символа подчеркивания и состоять из букв, цифр и символов подчеркивания в любом количестве. Это можно отобразить регулярным выражением: ‘[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*’ Но на самом деле, имя переменной может быть вообще любой строкой или даже числом:...

October 2, 2014

Изменение ENUM-типа в PostgreSQL

В PostgreSQL 9.1 значительно расширилась функциональность для работы с пользовательскими типами — появилась возможность добавлять, удалять и изменять атрибуты, а также добавлять значения в ENUM типы. До этой же версии, например в PostgreSQL 8.2, для добавления нового значение к ENUM требовалось совершить гораздо больше действий: ALTER TYPE "foo_type" RENAME TO "_old_foo_type"; CREATE TYPE "foo_type" AS ENUM ('old_one', 'new_one'); ALTER TABLE "bar" ALTER COLUMN "foo" SET DEFAULT NULL; ALTER TABLE "bar" ALTER COLUMN "foo" TYPE "foo_type" USING "foo"::TEXT::"foo_type"; ALTER TABLE "bar" ALTER COLUMN "foo" SET DEFAULT 'new_one'::foo_type; DROP TYPE "_old_foo_type"; ...

July 28, 2014

Алогичное поведение `array_rand`

Нельзя надеяться на результат array_rand() если подразумевается получение нескольких случайных ключей. Как только второй аргумент будет равен единице, вместо массива ключей будет возвращен ключ случайного элемента. Лучше экранировать: if (count($array) > 0 && $amount > 0) { $keys = (array) array_rand($array, min($amount, count($array))); } ...

January 10, 2014

Автоматические индексы в PostgreSQL

Если вы постоянно используете PostgreSQL, то должно быть в курсе, что, в соответствии с SQL стандартами, при задании ограничений (Constraints) таких как первичный ключ (Primary Key) или ограничение уникальности (Uniqueness) автоматически создается и b-tree индекс для участвующих в ограничении полей, в то время как для внешнего ключа индекс не создается и его требуется генерировать вручную (подробнее можно прочитать здесь). Однако для людей ранее использовавших MySQL это может быть не очевидным, так как в MySQL InnoDB индексы создаются автоматически для всех внешних ключей, даже если index_name не указывается явным образом....

February 11, 2013

Потоки ввода-вывода в PHP

В PHP, как и в большинстве других языков, ввод и вывод информации может осуществляться посредством потоков. В частности, при работе с CLI могут использоваться стандартные потоки (англ. standard streams) операционной системы. И, не смотря на то, что чаще используются специальные функции и конструкции языка, выполняющие те же действия прозрачно для пользователя, такие как, например, echo, print и printf, периодически возникает необходимость обратится напрямую к таким потокам. Так, например, без стандартных потоков сложно обойтись при работе с получении данных из тела HTTP запроса, при необходимости использования функций, которые поддерживают только ресурсы (fputcsv) или, как было замечено ранее, во время работы в консольном режиме....

February 6, 2013