PHP:继承问题

时间:2017-06-04 13:41:39

标签: php inheritance

我尝试做树类,树中的每个类都检查自己的模板目录并使用它,但是当我在继承类中调用函数然后调用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');

2 个答案:

答案 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');