Массив возврата PHP при разрыве цепочки в синглтоне

Я создал одноэлементный класс с методами цепочки (для использования в шаблоне).

Чтобы цепочка работала, мне нужно вернуть new static. Это позволяет добавить следующую цепочку. У меня проблема в том, что я не хочу возвращать статический объект, если больше нет цепочек.

Пример

<?php
class bread {
  public static $array;
  public static function blueprints() {
    static::$array = array('some', 'values');
    return new static;
  }
  public static function fields() {
    return static::$array;
  }
}

$blueprints = bread::blueprints();
$fields = bread::blueprints()->fields();

print_r($blueprint) // Returns object - FAIL
print_r($fields ) // Returns array - OK

В приведенном выше примере я хочу, чтобы $blueprints возвращал массив, потому что к нему больше не привязаны методы.

Как это сделать?


person Jens Törnell    schedule 29.03.2017    source источник
comment
Метод не может знать, как будут использоваться его выходные данные. Как насчет $a = B::c(); $a->d()? Нет разумного способа обнаружить это. Вы также плохо смешиваете статические и нестатические вызовы. Совершенно не здравый подход.   -  person deceze♦    schedule 29.03.2017
comment
@deceze По опыту я знаю, что ты всегда прав. Я думал о том, чтобы сделать что-то вроде этого bread::blueprint('projects', 'en')->fields('title')->value('label');, чтобы он был однострочным, но вместо этого мне, вероятно, нужно использовать массив аргументов. Спасибо!   -  person Jens Törnell    schedule 29.03.2017


Ответы (2)


Ответ прост: вы не можете делать то, что хотите. Цепочка методов не является чем-то особенным для Php. Для вашего примера

bread::blueprints()->fields();

Это ничем не отличается от:

$tmp = bread::blueprints();
$tmp->fields();

Таким образом, поскольку Php не знает контекста, в котором будет использоваться результат, он не может изменить тип возвращаемого значения. Вот еще одна версия этого вопроса: Проверьте, является ли вызов цепочкой методов

Однако ваш класс может реализовать интерфейс ArrayAccess. Это позволит вам относитесь к объекту как к массиву без приведения, и вы получаете полный контроль над тем, как используются члены.

person Serdar Saygılı    schedule 29.03.2017

Вы можете попробовать это: $blueprints = (array)bread::blueprints();

person user7784669    schedule 29.03.2017
comment
Хорошая попытка, но в данном случае это приведет к пустому массиву. (Я не несу ответственности за отрицательный результат). - person Jens Törnell; 29.03.2017