Объект-псевдострока в PHP

Nov 20, 2013 16:02


Некоторый метод некоторого класса возвращает строку, с которой нужно что-то делать. Если ничего не нужно делать, метод возвращает NULL (ну а что ещё? это самое разумное, чтобы не мешать типы возврата, хоть PHP такое и позволяет). Вызовы метода в нескольких модулей ничтоже сумняшеся проверяют возврат функции в if’е. Как-то так: if($ids=$module->loadIds()) …

А потом вдруг оказалось, что строка, которую возвращает этот метод, может быть пустой,- и с ней нужно делать то же самое, что и с любой другой строкой. Ан нет! Не попадаем мы в эту ветку, пустая строка, видите ли, приводится к false не хуже, чем NULL.

Тут возможны разные решения. Во-первых, метод мог бы возвращать массив идентификаторов и, наверное, так было бы и правильнее,- но это вызывающее пренебрежение производительностью: сначала разбивать строку по запятой, а потом клеить её обратно через запятую. Во-вторых, метод мог бы возвращать просто булевское значение, а собственно строку идентификаторов загружать в аргумент по ссылке. Типа так: if($module->loadIds($ids)) … Но выходные аргументы мне вообще категорически не нравятся, это контринтуитивный синтаксис.

Кроме того, в обоих вариантах нужно переписывать все вызовы метода, а хотелось обойтись только самим методом. В общем, чтобы он возвращал такую строку, которая приводилась бы к true, но потом вела бы себя как пустая. Но как?

В релиз я пихнул «костыль» - вместо пустой строки метод стал возвращать строку, состоящую из запятой. Она потом подставляется в SQL-запрос, и практический результат получается тот же. Можно было бы с тем же успехом возвращать строку из пробела.

Потом, когда у меня выдалось время, я переписал код на более громоздкий, но как будто более чистый трюк (с применением «магического» метода):

class TrueString{ private $value; function __construct($value){ $this->value=(string)$value; } public function __toString() { return $this->value; } }
А метод возвращает (если не NULL) new TrueString($ids). Который приводится к булевскому значению true, но при этом к строковому значению пустой строки.

Вуаля! Всё равно мне не нравится. Но я не знаю, можно ли сделать лучше красивей при наличном языке. Право же, лучше бы [ни в каком языке вообще] не было неявного приведения типов, тогда при вызове метода его возврат всегда приходилось бы проверять на NULL, ну и ладно. Зато ошибиться в этом было бы невозможно.

php, ООП

Previous post Next post
Up