2012-05-31 16 views
5

asi que estoy tratando de solucionar un problema que tengo al diseñar clases de PHP. Creé una clase base y asigné variables privadas. Tengo clases secundarias que amplían esta clase base, que hacen referencia y cambios a estas variables privadas a través de funciones de la clase base. He aquí un ejemplo, tenga en cuenta que todavía estoy confundido acerca de la diferencia entre private y métodos protected/las variables (que me haga saber si estoy haciendo mal!):Acceso variable privado de PHP desde

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

por lo tanto, era de esperar que el resultado sea hello! impreso en la pantalla - en su lugar no hay nada. Podría haber un malentendido fundamental de las clases de mi parte, o tal vez solo estoy haciendo algo mal. Cualquier orientación es muy apreciada! Gracias.

EDIT:

Gracias a todos los que contribuyeron una respuesta - Creo que, a pesar de las excelentes soluciones, que las clases de los niños no son realmente lo que necesito - parece delegar clases puede ser más útil en este punto, como se Realmente no necesito hacer referencia a las funciones base desde dentro de las otras clases.

+1

intento de eco ($ sub-> getTest()); – bumperbox

+1

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

+1

No hay ningún 'echo' o' print' para mostrar algo en la pantalla – zerkms

Respuesta

8

debería ser así:

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

código principal:

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

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

También reemplazaría 'parent ::' con '$ this->' – zerkms

+0

Ok, puedo ver por qué funciona esto, opuesto al mío, creo. ¿Hay alguna manera de que pueda hacer referencia a la función setTest del elemento primario desde la función secundaria, de modo que un código '$ this-> test = $ value' establezca la variable para el elemento primario, en contraposición al elemento secundario? En última instancia, me gustaría no tener que hacer llamadas si puedo hacerlas desde el constructor del niño. Básicamente quiero acceder a las funciones principales, no heredarlas. – iLoch

+0

@iLoch No entiendo muy bien a qué se refiere, pero eche un vistazo a mi código editado. Esto es lo que quieres? – flowfree

Cuestiones relacionadas