2012-05-31 2 views
5

, поэтому я пытаюсь решить проблему, которую я имею при разработке классов PHP. Я создал базовый класс и назначил частные переменные. У меня есть дочерние классы, расширяющие этот базовый класс, которые делают ссылку и изменяются этими частными переменными через функции базового класса. Вот пример того, имейте в виду, что я до сих пор путают о разнице между private и protected методы/переменные (дайте мне знать, если я делаю это неправильно!):PHP Частный доступ переменной от дочернего

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

Так что я бы ожидать, что результат будет hello! выводится на экран - вместо того, чтобы нет ничего. Может быть, фундаментальное непонимание классов с моей стороны, или, может быть, я просто делаю что-то неправильно. Любое руководство очень ценится! Благодарю.

EDIT:

Спасибо всем, кто внес свой вклад в ответ - я думаю, что, несмотря на отличные решения, что дочерние классы, на самом деле не то, что мне нужно - это, кажется, делегируют классы могут быть более полезными в этой точке, как Мне не нужно ссылаться на базовые функции из других классов.

+1

попытка эхо ($ суб-> getTest()); – bumperbox

+1

Попробуйте [PHP5 OOP] (http://www.php.net/oop5). – meze

+1

Нет никаких 'echo' или' print' для вывода чего-то на экран – zerkms

ответ

8

Должно быть так:

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

основной код:

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

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

Я бы также заменил 'parent ::' '$ this->' – zerkms

+0

Хорошо, я понимаю, почему это работает, в отличие от моего, я думаю. Есть ли способ ссылаться на функцию setTest родителя из дочерней функции, так что код '$ this-> test = $ value' устанавливает переменную для родителя, а не для дочернего? В конечном итоге мне бы не хотелось делать вызовы, если я могу сделать их из конструктора ребенка. Я в основном хочу получить доступ к родительским функциям, а не наследовать их. – iLoch

+0

@iLoch Я не совсем понимаю, что вы имеете в виду, но посмотрите мой отредактированный код. Это то, что вы хотите? – flowfree

Смежные вопросы