2017-06-04 89 views
1

我嘗試做類樹,其中樹中的每個類檢查模板的自己的目錄並使用它,但是當我在繼承的類中調用函數,然後調用父類。我該怎麼做 ?PHP:繼承問題

我的例子下面輸出在代碼:

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

與所有那些你在痛苦的世界進入的子類。 – Federkun

回答

1

我只想讓$templates_dir受保護:

class A { 
    protected $templates_dir = 'a'; 
} 

並調整擴展類來執行相同操作。

然後這會導致templates_dir()返回任何$templates_dir設置爲。

+0

謝謝,它是templates_dir的解決方案,但主要思想是重新定義模板,並且不需要在每個調用父類的子類中重新定義函數check_template:check_template調用首先定義的父類。 – anry

+0

我希望類樹中的每個類都在自己的模板中找到模板目錄,並且如果沒有模板調用直接父類用於在自己的templates_dir中檢查此模板,並且直到找到模板 – anry

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