Вот простое руководство.
Наследование - повторное использование кода способом ООП
Наследование - это фундаментальная возможность / конструкция в объектно-ориентированном программировании, где вы можете использовать один класс в качестве основы / основы для другого класса или многих других классов.
Почему это?
Это позволяет вам эффективно повторно использовать код, найденный в вашем базовом классе.
Скажем, вы хотели создать новый employee class
, поскольку мы можем сказать, что employee
- это тип / тип "персона", они будут иметь общие свойства и методы.
Есть смысл?
В такой ситуации наследование может сделать ваш код легче, потому что вы повторно используете один и тот же код в двух разных классах. Но в отличие от old-school
PHP:
Вы должны набрать код только один раз.
Фактический код, который повторно используется, может быть многократно использован во многих (неограниченных) классах
но это только напечатано в одном месте концептуально, это своего рода
как PHP включает ().
Взгляните на пример кода PHP:
// 'extends' is the keyword that enables inheritance
class employee extends person
{
function __construct($employee_name) {
$this->set_name($employee_name);
}
}
Повторное использование кода с наследованием:
Поскольку класс employee
основан на классе person
, employee
автоматически имеет все открытые и защищенные свойства и методы "person".
Примечание ботаника: Ботаники скажут, что employee
- это тип человека.
код:
class employee extends person
{
function __construct($employee_name){
$this->set_name($employee_name);
}
}
Обратите внимание, как мы можем использовать set_name () в employee
, хотя мы не объявляли этот метод в классе employee
. Это потому, что мы уже создали set_name () в классе person
.
Nerd Примечание: класс person
называется (для ботаников) классом base
или parent
, потому что это класс, на котором основан employee
. Эта иерархия классов может стать важной в будущем, когда ваши проекты станут более сложными.
Повторное использование кода с наследованием:
Как вы можете видеть из фрагмента кода ниже, мы можем вызвать get_name для нашего employee
объекта, любезно person
.
код:
<?phpinclude("class_lib.php"); ?>
<?php
// Using our PHP objects in our PHP pages.
$stefan = new person("Stefan Mischook");
echo "Stefan's full name: " . $stefan->get_name();
$james = new employee("Johnny Fingers");
echo "---> " . $james->get_name();
?>
Это классический пример того, как ООП может уменьшить количество строк кода (не нужно писать одни и те же методы дважды), сохраняя при этом ваш код модульным и намного проще в обслуживании.
Переопределение методов 1
Иногда (при использовании наследования) вам может понадобиться изменить способ работы метода из базового класса.
Например, скажем, метод set_name () в классе 'employee' должен был сделать что-то отличное от того, что он делает в классе person
.
Вы override
версия person
классов set_name (), объявив тот же метод в employee
.
Фрагмент кода:
<?php
class person
{
protected function set_name($new_name) {
if ($new_name != "Jimmy Two Guns") {
$this->name = strtoupper($new_name);
}
}
}
class employee extends person
{
protected function set_name($new_name) {
if ($new_name == "Stefan Sucks") {
$this->name = $new_name;
}
}
}
?>
Обратите внимание, что set_name () отличается в классе employee
от версии, найденной в родительском классе: person
.
<<strong> Методы переопределения: 2
Иногда вам может понадобиться получить доступ к версии вашего базового класса метода, который вы переопределили в производном (иногда называемом "дочернем") классе.
В нашем примере мы переопределили метод set_name () в классе employee
. Теперь у меня есть
использовал этот код:
hperson::set_name($new_name);
для доступа к родительской версии класса (person) метода set_name ().
код:
<?php
class person
{
// explicitly adding class properties are optional - but
// is good practice
var $name;
function __construct($persons_name) {
$this->name = $persons_name;
}
public function get_name() {
return $this->name;
}
// protected methods and properties restrict access to
// those elements.
protected function set_name($new_name) {
if ($this->name != "Jimmy Two Guns") {
$this->name = strtoupper($new_name);
}
}
}
// 'extends' is the keyword that enables inheritance
class employee extends person
{
protected function set_name($new_name) {
if ($new_name == "Stefan Sucks") {
$this->name = $new_name;
}
else if ($new_name == "Johnny Fingers") {
person::set_name($new_name);
}
}
function __construct($employee_name)
{
$this->set_name($employee_name);
}
}
?>
Примечания: Использование символа:
::
… позволяет вам конкретно назвать класс, в котором вы хотите, чтобы PHP искал метод:
person::set_name()
… Говорит PHP, что нужно искать set_name () в классе person
.
Существует также ярлык, если вы просто хотите обратиться к родителю текущего класса - с помощью ключевого слова parent
.
код:
protected function set_name($new_name)
{
if ($new_name == "Stefan Sucks") {
$this->name = $new_name;
}
else if ($new_name == "Johnny Fingers") {
parent::set_name($new_name);
}
}