<?php
// Entity
class Element 
{
    private $id;
    private $title;

    public function __construct($id, $title)
    {
        $this->id = $id;
        $this->title = $title;
    }

    // getters and setters methods ...
}

// Collection
class Page
{
    private $id;
    
    // has many elements (one-to-many)
    private $elements = array();

    public function __construct($id)
    {
        $this->id = $id;
    }
    
    public function setElements(array $elements)
    {
        foreach ($elements as $element) {
            $object = new Element($element['id'], $element['title']);
            $this->addToElements($object);
        }
    }
    
    public function getElements()
    {
        return $this->elements;
    }
    
    public function addToElements(Element $element)
    {
        $this->elements[] = $element;
    }
}

// DAO (Data access object)
class ElementDao 
{
    public function findAllByPageId($pageId) 
    {
        $db = Database::getInstance();
        $rows = $db->select('element');
        return $rows;
    }
}
class PageDao 
{
    private $elementDao;
    
    public function __construct(ElementDao $elementDao)
    {
        $this->elementDao = $elementDao;
    }
    
    public function findById($id)
    {
        $db = Database::getInstance();
        $row = $db->select('page')->where('id = ?', $id);
        
        $page = new Page($row['id']);
        $pageElements = $this->elementDao->findAllByPageId($id);
        $page->setElements($pageElements);
        
        return $page;
    }
}

$elementDao = new ElementDao();
$pageDao = new PageDao($elementDao);
$page = $pageDao->findById(1);
foreach ($page->getElements() as $index => $element) {
    echo $element->getTitle();
}
