2012-04-04 6 views
0
class config { 
    public $pageName; 

    function __construct($pageName=''){ 
     $this->pageName = $pageName;   
    } 
} 


class header extends config { 
    function display(){ 
     echo parent::$this->pageName; 
    } 

} 


$config = new config('Home Page'); 
$header = new header(); 
$header->display(); 

Dies zeigt nichts an, ich dachte, es sollte 'Home Page' angezeigt haben.auf PHP Wie bekomme ich den Wert von einer Variablen in einer Elternklasse?

Irgendeine Idee, wie ich das erreichen kann?

+0

Sie konnte einfach tun 'echo $ this-> pagename; ' – Sachin

+0

+1 zu counter unerklärten Downvote. – ArjunShankar

Antwort

4

Das Objekt $header hat keine Beziehung zum Objekt $config. Nur weil ihre Klassenhierarchie verbunden ist, heißt das nicht, dass die Objektinstanzen Daten gemeinsam nutzen.

$config1 = new config('Home Page'); 
$config2 = new config(); 

Hier $config2 konnte nicht den Wert 'Home Page' entweder zugreifen, da es sich um ein anderes Objekt ist. Es ist keine Frage der Klassenhierarchie.

+0

Ihre Erklärung, warum dies geschieht, ist richtig, aber es wäre nett, wenn Sie Ratschläge geben könnten, wie Sie das erwartete (durch das OP) Ergebnis erreichen können. – knittl

+0

kann ich nicht, weil das was das OP erwartet nicht viel Sinn macht. Wenn er buchstäblich erreichen möchte, was sein Code zeigt, müsste er statische Klasseneigenschaften verwenden, was höchstwahrscheinlich nicht die richtige Lösung für sein Problem ist. – deceze

+0

Es gibt Möglichkeiten, den Konstruktor oder IoC zu erben. – knittl

1

Sie möchten Ihre Objekte komponieren, anstatt ihre Klassen erben (aka Inversion of Control, Dependency Injection):

interface IConfig { 
    public function pageName(); 
} 
class Config implements IConfig { 
    private $pageName; 
    public function pageName() { return $this->pageName; } 

    function __construct($pageName=''){ 
     $this->pageName = $pageName;   
    } 
} 


class Header { 
    private $config; 

    function __construct(IConfig $config) { 
     $this->config = $config; 
    } 

    function display(){ 
     echo $this->config->pageName(); 
    } 

} 


$config = new Config('Home Page'); 
$header = new Header($config); 
$header->display(); 
1
$header = new header('Home Page'); 
$header->display(); 
+0

Eigentlich wird es *, wenn Sie es nicht überschreiben. Der Konstruktor wird wie der Rest * vererbt *. – deceze

+0

ganz richtig, geändert – cloakedninjas

0
$header = new header('Home Page'); 
$header->display(); 
+0

Es ist nicht notwendig, den Konstruktor in der Klasse 'header' zu deklarieren, nur um den Konstruktor des Parents aufzurufen. Lassen Sie das alles einfach weg, der Konstruktor wird wie alles andere geerbt. – deceze

+0

Sie haben Recht! :-) –