Есть магический метод __get (с двумя нижними подчёркиваниями)
class Category
{
private $children = null;
public function __get($property)
{
if ($property === 'children') {
if ($this->children !== null) return $this->children;
else {
$this->children = $this->getChildren();
return $this->children;
}
} else {
throw 'Undefined property';
}
}
private function getChildren()
{
// TODO: запрос к базе и получение результата
}
}
$category = new Category();
someAction($category->children); // в первый раз будет запрос
showSubCategories($category->children); // второй и послудеющий раз возьмёт уже из приватного поля
А к вопросу нужности - зачастую в ORM это настраивается, какие поля брать сразу, а какие лениво. Так что полностью зависит от задачи.