我尝试做树类,树中的每个类都检查自己的模板目录并使用它,但是当我在继承类中调用函数然后调用parent时。我该怎么办?
以下示例中的代码输出:
d
ç
B / 1.phtml
但我需要 d / 1.phtml
<?php
class A {
private $templates_dir = 'a';
}
class B extends A {
private $templates_dir = 'b';
public function templates_dir()
{
return $this->templates_dir;
}
public function check_template($tpl)
{
$dir = $this->templates_dir();
$file = $dir. '/'. $tpl;
echo (get_class($this)). "\r\n";
echo (get_parent_class($this)). "\r\n";
echo $file . "\r\n";
// idea - if (!file_exists($file)) return parent::check_template($file);
// method call each class while template will be found
// how do it?
}
}
class C extends B {
private $templates_dir = 'c';
}
class D extends C {
private $templates_dir = 'd';
}
$obj = new D();
$obj->check_template('1.phtml');
答案 0 :(得分:1)
我会让$templates_dir
受保护:
class A {
protected $templates_dir = 'a';
}
并调整扩展类以执行相同的操作。
这将导致templates_dir()
返回$templates_dir
设置为的任何内容。
答案 1 :(得分:1)
另一种方法是将函数放在一个抽象类中,A,B,C,D类中的每一个都扩展了这个,这是一种更简洁的处理方式。
以下是代码 -
abstract class WW {
protected function templates_dir()
{
return $this->templates_dir;
}
public function check_template($tpl)
{
$dir = $this->templates_dir();
$file = $dir. '/'. $tpl;
echo (get_class($this)). "\r\n";
echo (get_parent_class($this)). "\r\n";
echo $file . "\r\n";
// idea - if (!file_exists($file)) return parent::check_template($file);
// method call each class while template will be found
// how do it?
}
}
class A extends WW {
protected $templates_dir = 'a';
}
class B extends WW {
protected $templates_dir = 'b';
}
class C extends WW {
protected $templates_dir = 'c';
}
class D extends WW {
protected $templates_dir = 'd';
}
$obj = new D();
$obj->check_template('1.phtml');