2013-03-15 3 views
0
abstract class BaseController 
{ 
    protected $arctica, $database, $content, $cacheTime; 

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

class Controller extends BaseController 
{ 
    protected $cacheTime = 2; 
    protected $database = 'override'; //trying to override database var 

    function __construct($arctica) 
    { 
     parent::__construct($arctica); 
    } 

    function Run() 
    { 
        var_dump($this->database); //A class instance, not string('override') 
     $this->load('homepage'); 
    } 
} 

Я хотел бы задать несколько вопросов об этом классе.Переопределение защищенных переменных между родительскими и дочерними классами

Q1: Если я хочу достичь $database variable of child class, как я могу дотянуться до него?

Q2: Как я могу гарантировать, что $database variable in parent class не может быть изменен/отменен классом ребенка, даже в самом себе? ($ database должен быть постоянным экземпляром базы данных, поэтому дочерний элемент контроллера не должен касаться его.) Сейчас это так, но я не знаю, почему tbh.

Q3: Как добавить дополнительные параметры в мои созданные переменные? Например, вместо защищенного $ var protected const $var было бы больше смысла для меня. Это что-то, что PHP не поддерживает или вообще не поддерживается в ООП? (Может быть, это поддерживается, и я не знаю как?)

Q4: Если я определяю метод в родительском классе, могу ли я связаться с ним без $ this? Мне нравится load('homepage').

Спасибо большое!

+0

Q1: Откуда? От родителя к ребенку? – Ihsan

+0

Взгляните на окончательный вариант: http://www.php.net/manual/en/language.oop5.final.php – jantimon

+0

Q3: Как можно использовать защищенную нестационарную константу? – jantimon

ответ

1

Ваш код берет информацию о базе данных из объекта $arctica. Используемая информация не используется, ни защищенная переменная в абстрактном классе, ни в расширенном классе.

Если вы хотите, чтобы защищенная переменная сохранилась, вы должны создать свою собственную версию __construct(), чтобы изменить это.Вероятно, вот так:

public function __construct($arctica) { 
    parent::__construct($arctica); 
    $this->database = "override"; 
} 

Q1: Вы добираетесь до него.

Q2: Невозможно обеспечить соблюдение защищенной переменной. Просто не кодируйте материал, который делает это. Вы можете использовать геттеры и сеттеры для достижения этого.

Q3: PHP не поддерживает это.

Q4: Нет. PHP всегда нуждается в $this, если он используется внутри объектов для работы над собственным экземпляром.

+0

Вы правы в Q1. Я полностью забыл о передаче значений внутри конструктора. На все мои вопросы ответил. Спасибо. –

0

Q1: Если я хочу достичь переменной $ базы данных дочернего класса, как я могу ее достичь?

Если он объявлен protected, вы получить доступ к нему с $this->database от обоих родителей или ребенка.

Если это private, вы получаете доступ к нему через $this->database, но только от родителя.

Q2: Как я могу гарантировать, что переменная $ database в родительском классе не может быть изменена/переопределена дочерним классом, даже в самом себе?

Вы можете его объявить private. Однако, на мой взгляд, использование private - это запах кода. Вы должны сделать их двумя отдельными классами и объединить их по композиции.

Q3: Как добавить дополнительные параметры в мои созданные переменные?

Не знаю, что вы имеете в виду.

Q4: Если я определяю метод в родительском классе, могу ли я связаться с ним без $ this? Как нагрузка («домашняя страница»).

Вы не можете. Так работает PHP.

+0

Q3: Это в основном вместо public $ var, public var $ var или public const $ var. –

+0

Вы хотите сделать постоянным? Затем используйте ключевое слово 'const'. – troelskn

+0

Нет. Скажем, public (означает, что переменная является общедоступной) целочисленная (означает переменную целую) переменную $. Поэтому переменная должна быть как целочисленной, так и общедоступной, а не целой. Я могу создать ключевое слово const, чтобы создать переменную, но затем, как я могу дать ему общедоступные/частные/защищенные ключевые слова? –

0

A1: BaseController не может достигать атрибутов своих дочерних классов. BaseController даже не знает, что у него есть дети. Вы можете сделать это abstract и заставить своих детей реализовать геттер, чтобы BaseController мог получить доступ к значениям атрибута через геттер.

A2: Сделайте database в BaseControllerprivate так, что только BaseController может получить к нему доступ. Затем определите защищенный геттер в BaseController, чтобы дочерние классы могли получить доступ к database через геттер, а не напрямую.

A3: PHP не имеет таких ключевых слов, как final, поскольку Java имеет его, например. PHP знает ключевое слово const, но это имеет другое значение, чем «однажды написанное никогда не написано снова». Посмотрите руководство для const.

A4: Нет, языковые ограничения снова. Без $this PHP не знал бы, что вы хотите получить доступ к методу или свойству. Вы можете получить доступ к глобальной функции или локальной переменной (которая будет создана).

+0

Ваш A1 неверен. 'BaseController' может, безусловно, получить доступ к атрибутам своих детей. – troelskn

+0

A2: Контроллер также должен получить доступ к переменной $ database в BaseController, но Контроллер не должен переопределять переменную $ database непосредственно. Я не хочу, чтобы люди переопределяли переменную $ database в дочернем классе и назначали ей значение. Они должны быть разрешены, потому что база данных $ должна работать только с действительным экземпляром базы данных. –

+0

@troelskn Трудно поверить мне, но хорошо - я сделаю некоторые исследования. – Joshua

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