OOの観点から、次のようなインターフェイスを定義することをお勧めします。
interface BreadcrumbInterface
{
public function getLabel();
public function getParent(); // returns an instance of BreadcrumbInterface, or null
}
次に、このインターフェイスを実装し、オプションで「親」を含めることができるPageクラスを作成します。これには、このインターフェイスも実装する必要があります。これにより、必要な階層が構築されます。
(プロセスでオブジェクト指向設計パターンをブラッシュアップしながら)完全なブレッドクラムを取得するための優れた方法は、ビジターパターンを使用することです。この場合、訪問者を処理するロジックを「抽象化」するために、インターフェイスだけでなく共通の抽象クラスも定義する必要があります。
abstract class BaseNode implements BreadcrumbInterface
{
protected $parent = null;
public function accept(BreadcrumbVisitor $visitor)
{
$visitor->visit($this);
}
public function setParent(BreadcrumbInterface $parent)
{
$this->parent = $parent;
}
public function getParent()
{
return $this->parent;
}
}
class BreadcrumbVisitor
{
protected $breadcrumbs = array();
public function visit(BreadcrumbInterface $node)
{
$parent = $node->getParent();
if ($parent instanceof BaseNode) {
$parent->accept($this);
}
$this->breadcrumbs[] = $node->getLabel();
}
public function getBreadcrumbs()
{
return $this->breadcrumbs;
}
}
これはそのままでは実行されませんが、うまくいけば、あなたはアイデアを得ることができます。おそらく、ノードがラベルだけでなくページへのURLも決定するようにしたい場合もありますが、それは簡単に追加できます。この問題を解決するための一般的なOO構造を示したかっただけです。
編集:
大まかな使用例の追加:
$rootPage = new Page(/*...*/);
$parentPage = new Page(/*...*/);
$parentPage->setParent($rootPage); // In reality you most likely wouldn't be building this structure so explicitly. Each object only needs to know about it's direct parent
$currentPage = new Page(/*...*/);
$currentPage->setParent($parentPage);
$visitor = new BreadcrumbVisitor();
$currentPage->accept($visitor);
$breadcrumbs = $visitor->getBreadcrumbs(); // returns an array, where the first element is the root
// then you can implode with ' > ' if you want
$breadcumbString = implode(' > ', $breadcrumbs);