Наследование PHP и установка переменных в родительской структуре - PullRequest
2 голосов
/ 20 января 2012

Привет, мне интересно, может кто-нибудь пролить свет на следующую проблему для меня.

У меня есть два класса

класс 1

class application{
    private $something = "hello my name is";

    function __construct(){
       $this->something .= " bob";
       $this->require_login_class_method();
    }

    public function getName(){
        return $this->something;
    }

    ...
}

класс 2

class login extends application{
    function __construct(){
       echo $this->getName();
    }
}

мой результат всегда

"меня зовут"

без

"боб"

однако, если я вызываю (внутри класса login - construct)

parent::__construct();

, это работает.

Что если мой метод конструкции класса приложения принимает переменные, которые мне не нужныпройти или не нужно проходить второй раз (из логина)?

Заранее спасибо


Решение

Спасибо всем, ктоответил.

Решение, которое я до сих пор собрал, состоит в том, чтобы сделать следующее

приложение класса

//if variables are present, make them optional
function __construct($var1 = null, $var2 = null){
    //do something
}

имя класса

function __construct(){
    parent::__construct();
    //do something with variables set in parent construct
}

Ответы [ 5 ]

4 голосов
/ 20 января 2012

Если вы расширяете класс, вы можете переопределить конструктор.Если вы это сделаете, вы должны сделать всю работу, которая выполняется в этом конструкторе, для себя.Вы также можете вызвать родительский конструктор, и вся работа, выполняемая там, также будет вызвана.Третий вариант не существует: либо вы звоните, либо нет.

2 голосов
/ 20 января 2012

Я думаю, строгие стандарты требуют, чтобы ваш дочерний конструктор принимал те же переменные, что и его родительский, но если вы хотите обойти это, вы всегда можете сделать переменные необязательными в родительском конструкторе:И, конечно, если вы переопределите конструктор, вам придется вызывать его вручную от дочернего элемента, если вы хотите вообще его вызывать.

2 голосов
/ 20 января 2012

В ОО вы можете переписать методы.Итак, вы переписали родительский класс (значит, он не выполняется при вызове дочернего класса).
У вас есть возможность вызывать любые родительские методы parent::anyMethod()

Вот как это работает.

1 голос
/ 20 января 2012

Родитель- __constructor должен вызываться с каждым аргументом, для которого не установлено значение по умолчанию. Если вы не хотите устанавливать определенные переменные, вы должны установить значения по умолчанию в родительском конструкторе или переопределить весь код.

1 голос
/ 20 января 2012

Вы устанавливаете переменную в конструкторе. Так что сначала нужно позвонить. Eg.:

class login extends application{
    function __construct(){
       parent::__construct();
       echo $this->getName();
    }
}

Если вам нужно передать переменные, вы должны сделать это вручную:

class login extends application{
    function __construct($x){
       parent::__construct($x);
       echo $this->getName();
    }
}

Да, это что-то вроде сцепления. Постарайтесь не переопределять конструкторы, если вы можете помочь. Кроме того, старайтесь избегать выполнения какой-либо сложной логики (например, входа в удаленную службу) в конструкторе. Лучше сделать это позже, по запросу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...