Из документации Python:
Если есть больше позиционных аргументов, чем есть формальные слоты параметров, возникает исключение TypeError, если не присутствует формальный параметр с использованием синтаксического «* идентификатора» ; в этом случае этот формальный параметр получает кортеж, содержащий избыточные позиционные аргументы (или пустой кортеж, если не было избыточных позиционных аргументов).
Если какой-либо аргумент ключевого слова не соответствует формальному имени параметра, возникает исключение TypeError, если не присутствует формальный параметр с использованием синтаксиса «** identifier»; в этом случае этот формальный параметр получает словарь, содержащий избыточные аргументы ключевого слова (с использованием ключевых слов как ключей и значений аргументов в качестве соответствующих значений) или (новый) пустой словарь, если не было лишних аргументов ключевого слова.
blockquote>
Поскольку ваш класс 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 указатель на ... сам; -)
Это может сэкономить вам несколько часов на поиск.
Помните: ваш класс Child только наследует свойства DEFINED в классе Parent ... Итак, если вы создаете экземпляр объекта с использованием родительского класса, а затем заселяете он с данными, то эти данные НЕ будут доступны в вашем дочернем классе ...
Это, конечно, супер очевидно, но я предполагаю, что другие могут столкнуться с одной и той же проблемой.
Простое простое решение не расширяет ничего, просто передайте объект $ вашего родительского класса в ваш дочерний класс через конструктор. Таким образом, у вас есть доступ ко всем свойствам и методам объекта, сгенерированного родительским классом
Пример
class child {
public parentObject;
public function __construct($parentObject) {
$this->parentObject = $parentObject;
}
}
Если ваш $ parentObject имеет общедоступное свойство $ name, вы можете доступ к нему внутри дочернего класса с помощью функции типа:
public function print_name() {
echo $this->parentObject->name;
}
это должно работать.
class Child extends Parent
{
private function myMethod()
{
return $this->_anotherP;
}
}
, потому что _anotherP его защищен, поэтому каждый деривативный класс может присоединиться к нему, но его нет в другом объекте, тот же объект.
Однако сделайте геттеры сеттерами в родительском его разумном выборе.