2017-06-04 1 views
1

Ich versuche, Klassenbaum zu tun, wo jede Klasse in der Struktur überprüfen eigenes Verzeichnis für Vorlage und verwenden Sie es, aber wenn ich Funktion in geerbter Klasse aufrufen dann Eltern genannt. Wie kann ich es tun ?PHP: Probleme mit der Vererbung

Mein Code in Beispiel unten Ausgang:

D
C
b/1.phtml

aber ich muss 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

Mit all diesen Unterklassen in einer Welt der Schmerzen Sie eingeben. – Federkun

Antwort

1

Ich würde einfachmachengeschützt:

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

und stellen Sie die Verlängerung Klassen, das gleiche zu tun.

Das wird dann dazu führen, templates_dir() zurückgeben, was auch immer $templates_dir festgelegt ist.

+0

Danke, es ist die Lösung für templates_dir, aber die Hauptidee ist die Neudefinition der Vorlage und ohne die Funktion check_template in jeder untergeordneten Klasse, die das Elternobjekt aufruft, neu zu definieren: check_template ruft die erste Elternklasse auf, wo definiert ist. – anry

+0

Ich möchte jede Klasse im Klassenbaum finden Vorlage in eigenen Vorlagen dir und wenn es keine Vorlage Aufruf sofortige Mutterklasse für diese Vorlage in eigenen templates_dir und weiter, bis die Vorlage gefunden wird – anry

1

Ein anderer Ansatz wird die Funktionen in einer abstrakten Klasse platzieren, und jede der Klassen A, B, C, D erweitert dies, Dies ist eine saubere Art, Dinge zu tun.

Unten ist der Code -

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