2012-05-31 5 views
5

, also versuche ich ein Problem zu lösen, das ich beim Entwerfen von PHP-Klassen habe. Ich habe eine Basisklasse erstellt und private Variablen zugewiesen. Ich habe untergeordnete Klassen, die diese Basisklasse erweitern, die durch Funktionen der Basisklasse auf diese privaten Variablen verweisen und sie ändern. Hier ist ein Beispiel, im Auge behalten bin ich immer noch verwirrt über den Unterschied zwischen private und protected Methoden/Variablen (lassen Sie mich wissen, wenn ich es falsch mache!):PHP Privater Variablenzugriff von Kind

base.class.php

<?php 
class Base { 
    private $test; 
    public function __construct(){ 
     require('sub.class.php'); 
     $sub = new Sub; 
     echo($this->getTest()); 
    } 
    public function getTest(){ 
     return $this->test; 
    } 
    protected function setTest($value){ 
     $this->test = $value; 
    } 
} 
?> 

sub.class.php

<?php 
class Sub extends Base { 
    public function __construct(){ 
     parent::setTest('hello!'); 
    } 
} 
?> 

Also würde ich das Ergebnis erwarten hello! auf dem Bildschirm gedruckt werden - stattdessen gibt es nichts. Es könnte ein grundlegendes Missverständnis der Klassen von mir geben, oder vielleicht mache ich nur etwas falsch. Jede Anleitung wird sehr geschätzt! Vielen Dank.

EDIT:

Sie alle danken, die eine Antwort beigetragen - ich glaube, trotz der ausgezeichneten Lösungen sind, dass Kinder Klassen eigentlich nicht, was ich brauche - es scheint Klassen delegieren an dieser Stelle kann nützlicher sein, als Ich muss nicht wirklich auf die Base-Funktionen innerhalb der anderen Klassen verweisen.

+1

try Echo ($ sub> getTest()); – bumperbox

+1

Versuchen Sie [PHP5 OOP] (http://www.php.net/oop5). – meze

+1

Es gibt kein 'echo' oder' print', um etwas auf dem Bildschirm auszugeben – zerkms

Antwort

8

sollte wie folgt sein:

base.class.php:

class Base { 
    private $test; 
    public function __construct() { 
     echo $this->getTest(); 
    } 
    public function getTest() { 
     return $this->test; 
    } 
    protected function setTest($value) { 
     $this->test = $value; 
    } 
} 

sub.class.php:

class Sub extends Base { 
    public function __construct() { 
     parent::setTest('hello!'); // Or, $this->setTest('hello!'); 
     parent::__construct(); 
    } 
} 

Hauptcode:

require 'base.class.php'; 
require 'sub.class.php'; 

$sub = new Sub; // Will print: hello! 
+2

würde ich auch ersetzen "Elternteil" mit '$ this->' – zerkms

+0

Ok, ich kann sehen, warum das im Gegensatz zu meiner funktioniert denke ich. Gibt es eine Möglichkeit, ich kann die SetTest-Funktion des Elterns von der Child-Funktion verweisen, so dass der Code $ $ this-> test = $ value "setzt die Variable für das Elternteil, im Gegensatz zum Kind? Ich möchte schließlich keine Anrufe tätigen müssen, wenn ich sie vom Erbauer des Kindes machen kann. Ich möchte grundsätzlich auf die übergeordneten Funktionen zugreifen, sie nicht erben. – iLoch

+0

@iLoch Ich verstehe nicht ganz, was du meinst, aber sieh dir meinen bearbeiteten Code an. Ist es das, was du willst? – flowfree