Есть ли способ связать методы php, а также что-то вернуть?

У меня есть рекурсивно определенная функция с именем getPropertyValue($object, $property), которая возвращает false, если $property не существует на произвольной глубине в $object, и значение, соответствующее первому $property, найденному внутри $object, в противном случае. По сути, это обобщенная версия встроенной функции PHP property_exists().

Я хочу сделать этот метод цепочечным, и я знаю, что для этого я бы просто вернул ссылку на экземпляр класса ($this) в методе, но я уже возвращаю, как я упоминал выше, значение, соответствующее первое $свойство, найденное внутри $object.

Как я могу сделать этот метод цепочкой, все еще возвращая это значение? Я думаю, что есть возможность вернуть объект, содержащий как $this, так и значение этого свойства/false, если оно найдено/не найдено соответственно. Это жизнеспособный подход? Каков наилучший способ добиться цепной связи в этом контексте?

Большое спасибо.


person Jay Yoon    schedule 03.11.2013    source источник
comment
возможный дубликат Как связать методы в PHP?   -  person RafH    schedule 03.11.2013
comment
Вы возвращаете ложь. Цепочка означала бы продолжение; и если из одного метода возвращается false, то зачем продолжать и возвращать другое значение, если это не удалось?   -  person AbraCadaver    schedule 03.11.2013


Ответы (2)


Этот тип API на самом деле не работает, когда вы хотите вернуть данные.

Это может быть удобно для создания сложных объектов, где многочисленные методы могут выполняться с меньшим количеством стандартного кода. Методы имеют тенденцию называться описательно, давая хорошее представление о том, что делается.

Примером может служить шаблон «построитель запросов», который строит оператор SQL с помощью цепочек методов.

$sql = $qb->select()->from('table')->where()->field('foo')->equals('bar');

Однако не дайте себя обмануть, это просто спасает вас от использования сеттеров.

$qb->setSelect();
$qb->setFrom('table');
$qb->setField('foo');  
$qb->setEquals('bar');

Очевидно, что вы не создаете построитель запросов, и существуют разные реализации одного и того же API, однако ключ в том, что все они добавляют данные к объекту, а не возвращают его.

person AlexP    schedule 03.11.2013

вы можете вернуть несколько значений, поместив их в массив:

return array($value,$this); // so you return both.
person Adriana    schedule 03.11.2013
comment
Да, но в контексте вопроса это небрежно. Они ожидают объединения методов с одним конечным результатом или получения ложных результатов. Должны ли мы кодировать, чтобы принимать массив от всех методов, если что-то в цепочке ложно, но нам все равно нужно какое-то значение? - person AbraCadaver; 03.11.2013
comment
хорошо, тогда вам нужно использовать другой подход: только вернуть $this и заставить функцию записать свои результаты во внешний ассоциативный массив с именами ключей = именами свойств и значениями = значение свойства, если найдено, и false в противном случае. затем проверьте массив позже, после того, как функция выполнила свою работу. - person Adriana; 03.11.2013