Создание и доступ к вложенным объектам и функциям?

0

У меня есть функция класса, которая запрашивает такие данные:

// Disclaimer: (None of the following is "real")
class Mockup {

  function getData() {

    query("SELECT id,name FROM pages")
    // Results: $id = 1, $name = "Math Text Book: Grade 7"

  }

}

Хотя я хотел бы иметь доступ к обоим значениям (то есть $ id и $ name), я могу только вернуть одно значение по отдельности (таким образом, создавая недостаток по сравнению с просто запросом вне класса).

Может ли быть что-то в соответствии с приведенными ниже примерами в сочетании с приведенным выше примером кода?

$test = new Mockup;
echo $test->getData()->id; // Echos "7"

Точно так же я видел что-то вроде следующего в различных программах, таких как MediaWiki:

$test = new Mockup;
echo $test->getData()->getId(); // Echos "7"

Является ли это признаком того, что также возможно также встраивать функции?

  • 2
    Почему вы можете получить доступ только к одному значению? query() неявно создает переменные ?! Как насчет возврата массива данных? Мне очень непонятно, какие у вас проблемы, вам придется более подробно остановиться. Запрос данных из базы данных - это не совсем неисследованная территория, так какая у вас проблема со стандартными решениями, которые все используют?
  • 0
    @deceze Возможно, я не был ясен. Суть вопроса заключалась в том, чтобы найти способ получить необходимые данные, используя «метод» в нижней части (следовательно, я предположил, что они были «вложенными») - тот факт, что «я могу «Получите больше, чем одно значение» - это не вопрос, так что это не имеет значения.
Теги:
oop

1 ответ

1
Лучший ответ

Это не встроенная функция, которую он связывает по методу. Когда метод возвращает экземпляр класса, вы можете использовать его для немедленного использования другого члена класса (var или function), объединяя их вместе.

class Mockup {

  public $id;
  public $name;

  function getData() {
    $data = query();
    $this->id = $data->id;
    $this->name = $data->name;
    return $this; // return the instance for chaining
  }

  function getId() {
    return $this->id;
  }

  function getName() {
    return $this->name;
  }

}

$mockup = new Mockup();

//unchained
$mockup->getData();
$id = $mockup->getId();
$name = $mockup->getName();
// or
$id = $mockup->id;
$name = $mockup->name;

//chained
$id = $mockup->getData()->getId();
$name = $mockup->getData()->getName();
//or
$id = $mockup->getData()->id;
$name = $mockup->getData()->name;

Если вы хотите вернуться сразу, вы можете просто вернуть массив или объект, содержащий эти значения.

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

$garage->getVehicle('plane')->fly(); // returns new Plane() with specific methods
$garage->getVehicle('car')->drive(); // returns new Car() with specific methods
  • 0
    Ах, это имеет гораздо больше смысла! Надеюсь, вы понимаете, почему я был сбит с толку. Спасибо, что объяснили это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню