Унаследованные свойства класса Возвращаемый NULL [дубликат]

Из документации Python:

Если есть больше позиционных аргументов, чем есть формальные слоты параметров, возникает исключение TypeError, если не присутствует формальный параметр с использованием синтаксического «* идентификатора» ; в этом случае этот формальный параметр получает кортеж, содержащий избыточные позиционные аргументы (или пустой кортеж, если не было избыточных позиционных аргументов).

Если какой-либо аргумент ключевого слова не соответствует формальному имени параметра, возникает исключение TypeError, если не присутствует формальный параметр с использованием синтаксиса «** identifier»; в этом случае этот формальный параметр получает словарь, содержащий избыточные аргументы ключевого слова (с использованием ключевых слов как ключей и значений аргументов в качестве соответствующих значений) или (новый) пустой словарь, если не было лишних аргументов ключевого слова.

14
задан shxfee 17 February 2010 в 20:44
поделиться

3 ответа

Поскольку ваш класс Child расширяет ваш Parent класс, все свойства и методы, которые либо public, либо protected в классе Parent будут видны классом Child, как если бы они были определяемый в классе Child - и наоборот.

Когда класс Child extends класса Parent, его можно увидеть как "Child a Parent " - это означает, что Child обладает свойствами Parent, если только он не переопределяет их другим способом.

(Кстати, обратите внимание, что« parent "- это зарезервированное ключевое слово в PHP, что означает, что вы не можете назвать класс с таким именем)

Вот краткий пример« родительского »класса:

class MyParent {
    protected $data;
    public function __construct() {
        $this->someMethodInTheParentClass();
    }
    protected function someMethodInTheParentClass() {
        $this->data = 123456;
    }
}

И это «дочерний» класс:

class Child extends MyParent {
    public function __construct() {
        parent::__construct();
    }
    public function getData() {
        return $this->data; // will return the $data property 
                            // that's defined in the MyParent class
    }
}

Это можно использовать следующим образом:

$a = new Child();
var_dump($a->getData());

И вы получите результат:

int 123456

Это означает, что свойство $data, определенное в классе MyParent и инициализированное в методе того же класса MyParent, доступно классу Child, как если бы оно было его.

Чтобы сделать вещи простыми: поскольку Child "является" MyParent, ему не нужно ke ep указатель на ... сам; -)

29
ответ дан Pascal MARTIN 23 August 2018 в 19:39
поделиться
  • 1
    Да. Требование к родительской :: __ конструкции было тем, что мне нужно: O – shxfee 17 February 2010 в 21:30
  • 2
    О, да, это одна из сложнейших вещей, и я не думал об этом упоминать: если ваш дочерний класс определяет конструктор, PHP не будет вызывать конструктор родительского класса, что означает, что вам придется называть его самостоятельно (см. примечание к fr.php.net/manual/en/language.oop5.decon.php ) – Pascal MARTIN 17 February 2010 в 21:32

Это может сэкономить вам несколько часов на поиск.

Помните: ваш класс Child только наследует свойства DEFINED в классе Parent ... Итак, если вы создаете экземпляр объекта с использованием родительского класса, а затем заселяете он с данными, то эти данные НЕ будут доступны в вашем дочернем классе ...

Это, конечно, супер очевидно, но я предполагаю, что другие могут столкнуться с одной и той же проблемой.

Простое простое решение не расширяет ничего, просто передайте объект $ вашего родительского класса в ваш дочерний класс через конструктор. Таким образом, у вас есть доступ ко всем свойствам и методам объекта, сгенерированного родительским классом

Пример

class child {

    public parentObject;

    public function __construct($parentObject) {
        $this->parentObject = $parentObject;
    }

}

Если ваш $ parentObject имеет общедоступное свойство $ name, вы можете доступ к нему внутри дочернего класса с помощью функции типа:

public function print_name() {
    echo $this->parentObject->name;
}
0
ответ дан Robert Sinclair 23 August 2018 в 19:39
поделиться

это должно работать.

class Child extends Parent
{
  private function myMethod()
  {
    return $this->_anotherP;
  }
}

, потому что _anotherP его защищен, поэтому каждый деривативный класс может присоединиться к нему, но его нет в другом объекте, тот же объект.

Однако сделайте геттеры сеттерами в родительском его разумном выборе.

-2
ответ дан useless 23 August 2018 в 19:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: