2012-05-31 15 views
5

quindi sto cercando di risolvere un problema che sto avendo nella progettazione di classi PHP. Ho creato una classe base e ho assegnato variabili private. Ho classi figlio che estendono questa classe base, che fanno riferimento e modifiche a queste variabili private attraverso le funzioni della classe base. Ecco un esempio, tenere a mente Sono ancora confuso circa la differenza tra private e protected metodi/variabili (fatemi sapere se sto facendo male!):PHP Accesso variabile privato dal bambino

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!'); 
    } 
} 
?> 

Quindi mi aspetto che il risultato sia hello! stampato sullo schermo - invece non c'è nulla. Potrebbe esserci un fondamentale fraintendimento delle lezioni da parte mia, o forse sto solo facendo qualcosa di sbagliato. Qualsiasi consiglio è molto apprezzato! Grazie.

EDIT:

Grazie a tutti coloro che hanno contribuito una risposta - Credo che, nonostante le ottime soluzioni, che le classi figlie sono in realtà non è quello che mi serve - sembra delegare classi può essere più utile a questo punto, come Non ho davvero bisogno di fare riferimento alle funzioni di base all'interno delle altre classi.

+1

prova echo ($ sub> getTest()); – bumperbox

+1

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

+1

Non c'è alcun 'echo' o 'print' per produrre qualcosa sullo schermo – zerkms

risposta

8

dovrebbe essere così:

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(); 
    } 
} 

codice principale:

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

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

Sostituire anche 'parent ::' con '$ this->' – zerkms

+0

Ok, posso capire perché funziona in contrasto con il mio credo. C'è un modo in cui posso fare riferimento alla funzione setTest del genitore dalla funzione figlio, in modo che un codice '$ this-> test = $ valore' imposta la variabile per il genitore, al contrario del bambino? In ultima analisi, mi piacerebbe non dover effettuare chiamate se riesco a farle dal costruttore del bambino. Fondamentalmente voglio accedere alle funzioni genitore, non ereditarle. – iLoch

+0

@iLoch Non capisco bene cosa intendi, ma dai un'occhiata al mio codice modificato. È quello che vuoi? – flowfree