■趣旨
サンプルソースです。ツリー構造を実現するパターンです。ノードとなるクラスを定義し、そのサブクラスとして、子要素を持つクラスと、子要素を持たないクラス(葉)を実装します。
■DirectoryFile.class.php
<?php abstract class DirectoryFile { protected $name; public function __construct($name){ $this->name = $name; } public function getName(){ return $this->name; } abstract public function add(DirectoryFile $child); abstract public function remove (DirectoryFile $child); abstract public function getChildren(); abstract public function display($level); } class File extends DirectoryFile { public function add(DirectoryFile $child){ echo('File cannot have any elements.'); return null; } public function remove(DirectoryFile $child){ echo('File don\'t have any elements.'); return null; } public function getChildren(){ return null; } public function display($level){ echo(str_repeat("\t", $level) . $this->name . "\n"); } } class Dir extends DirectoryFile { private $files; public function __construct($name){ parent::__construct($name); $this->files = array(); } public function add(DirectoryFile $child){ $this->files[] = $child; return $this; } public function remove(DirectoryFile $child){ return array_splice($this->files, array_search($child, $files, true), 1); } public function getChildren(){ return $this->files; } public function display($level){ echo(str_repeat("\t", $level) . $this->name. "\n"); foreach($this->files as $child){ $child->display($level + 1); } } } ?>
■sample.php
<?php require_once('DirectoryFile.class.php'); $root = new Dir('root'); $dir0 = new Dir('dir0'); $dir1 = new Dir('dir1'); $root->add($dir0)->add($dir1); $file00 = new File('file00'); $file01 = new File('file01'); $dir0->add($file00)->add($file01); $dir10 = new Dir('dir10'); $file10 = new File('file10'); $dir1->add($dir10)->add($file10); $file101 = new File('file101'); $file102 = new File('file102'); $dir1->add($file101)->add($file102); $root->display(0); ?>
■あとがき
素敵なソースを見つけたので・・・結果はsample.phpを実行して試してみてください。