Чат PHP-разработчиков
Наследование в PHP

Наследование в PHP

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

Котики бывают двух полов: мальчики и девочки. Все мы прекрасно понимаем, чем они отличаются. Однако, у них есть и общие черты – независимо от пола и у тех и у тех есть четыре лапы, есть хвост, голова, усы и далее по списку. То есть есть что-то общее, а есть что-то, что их отличает. Так сказать, детали реализации.

В природе таких примеров уйма – это деление существ по классам и царствам, разделение по половому признаку, разделение по расовой принадлежности, и так далее. Любую вещь можно отнести к какому-то классу, а по каким-то другим признакам – отличить её от других вещей.

Так вот в программировании очень часто встречаются аналогичные ситуации, когда какой-то сущности (или нескольким сущностям) нужно повторить то же, что есть у другой сущности, но с какими-то дополнительными возможностями.

Предположим, на сайте есть простые записи в блоге. У них есть заголовок и текст. Администратор их может редактировать, добавлять что-то новое. А есть посты-уроки, как тот, что вы читаете прямо сейчас. И они должны иметь те же свойства и уметь делать всё то же самое, что и обычные посты, но вдобавок ко всему, у них должна быть домашка.

Давайте создадим для простых записей в блоге класс Post. Пусть, с некоторыми упрощениями, он выглядит так:

Код доступен только после покупки курса ООП в PHP.

Неужели, для того чтобы сделать класс урока с домашкой нам нужно копировать весь этот код в новый класс Lesson, а затем добавлять новое свойство homework и добавлять геттер и сеттер?

Оказывается – нет. Благодаря наследованию, разумеется. Как это работает? Да проще простого!

Класс может унаследовать от другого класса свойства и методы. Делается это при помощи ключевого слова extends (англ. - расширять). Вот так:

Код доступен только после покупки курса ООП в PHP.

Класс Lesson называют классом-наследником, или дочерним классом. Класс Post – родительский класс.
В качестве родительского класса при помощи слова extends можно указать только один класс. Однако, у класса Lesson, в свою очередь, тоже могут быть наследники. Они унаследуют все свойства и методы всех своих родителей.

При этом доступными внутри объектов класса-наследника будут только свойства или методы, объявленные в родительском классе как public или protected. Свойства и методы, с модификатором доступа private не будут унаследованы дочерними классами.

То есть, если мы хотим в классе Lesson объявить метод, который будет работать со свойствами title и text, то мы должны определить эти свойства не как private, а как protected:

Код доступен только после покупки курса ООП в PHP.

Теперь мы можем работать с ними и в классе Lesson:

Код доступен только после покупки курса ООП в PHP.

Вот таким нехитрым образом мы расширили класс Lesson, унаследовав его от класса Post. Как видим, мы избежали копирования кода, что не может не радовать.

При этом в объектах класса Lesson нам так же доступны все protected- и public-методы, объявленные в родительском классе. Давайте убедимся, в этом.

Код доступен только после покупки курса ООП в PHP.

Мы получим следующее:

Код доступен только после покупки курса ООП в PHP.

Как видим, всё прекрасно работает.

Модификаторы доступа

Давайте теперь вернёмся к модификаторам доступа и до конца проясним ситуацию, как каждый модификатор влияет на методы и свойства:

  • private – доступны только внутри объектов этого класса, недоступны в объектах классов-наследников;
  • protected – доступны внутри объектов этого класса и всем объектам классов-наследников. При этом недоступны извне;
  • public – доступны как внутри объектов класса, так и снаружи – можем напрямую обращаться к ним извне. Доступны объектам классов-наследников.

Все public-свойства и методы, то есть то, что позволяет нам напрямую взаимодействовать с объектами извне, называются интерфейсом класса.
Это, опять-таки, относится к инкапсуляции.

Вызов родительского метода

Если присмотреться к классам Post и Lesson, то можно заметить некоторое дублирование кода в конструкторе. Мы и там и там выполняем одинаковые действия для свойств title и text. Было бы неплохо от этого избавиться, воспользовавшись в Lesson уже готовым функционалом из Post.

Для этого мы можем вызвать родительский конструктор в конструкторе дочернего класса. Делается это при помощи ключевого слова parent и двойного двоеточия.

Код доступен только после покупки курса ООП в PHP.

Что именно произойдёт? В момент вызова конструктора класса Lesson (при создании нового объекта), сначала произойдёт вызов метода __construct из родительского класса, а затем задастся свойство homework. При этом этот метод из родительского класса отработает для свойств класса-наследника. Можно представить, что мы просто скопировали сюда содержимое этого метода из класса Post и вставили его сюда. Именно так и происходит, когда этот код выполняется.

Давайте проверим что всё работает:

Код доступен только после покупки курса ООП в PHP.

Результат:

Код доступен только после покупки курса ООП в PHP.

Как видим, всё успешно отработало и мы получили то, что хотели.
Вызывать с помощью parent:: можно не только конструктор, но и любой другой метод.

Как видим, тема наследования тесно связана с темой инкапсуляции. Одно без другого не работает. Уберёте одно – и другое сломается. На этом с наследованием всё, делайте домашку, а потом переходите к изучению полиморфизма.

Полный код, получившийся в ходе урока:

Код доступен только после покупки курса ООП в PHP.
Домашнее задание
  • Создайте ещё один класс, являющийся наследником класса Lesson - PaidLesson (платный урок).
  • Объявите в нем свойство price (цена), а также геттеры и сеттеры для этого свойства. Добавьте в конструкторе параметр, через который это свойство будет устанавливаться при создании объекта.
  • Создайте объект этого класса со следующими свойствами:
    заголовок: Урок о наследовании в PHP
    текст: Лол, кек, чебурек
    домашка: Ложитесь спать, утро вечера мудренее
    цена: 99.90
  • Выведите этот объект с помощью var_dump()
Онлайн обучение PHP
Путь с полного нуля до джуниора!
Начать бесплатно
Читайте также
Курс программирования на PHP
Подготовка до уровня устройства на работу!
Начать бесплатно
Комментарии (64)


SlipKnot

Домашка:

class PaidLesson extends Lesson
{
    private $price;
    public function __construct(string $title, string $text, string $homework, float $price)
    {
        parent::__construct($text, $title, $homework);
        $this->price = $price;
    }
    public function getPrice()
    {
        return $this->price;
    }
    public function setPrice(float $price)
    {
        $this->price = $price;
    }
}

$paidLesson = new PaidLesson('Урок о наследовании PHP', 'лол, кек, чебурек',
    'Домашка: ложитесь спать, утро вечера мудренее', 99.90);
var_dump($paidLesson);

UPD: что такое "void"? Мы вроде такого не проходили. Или дайте ссылку где прочитать

ivashkevich

Отлично!
А void - значит что функция ничего не возвращает.

Galay
class PaidLesson extends Lesson {
    private $price;
    public function __construct(string $title, string $text, string $homework, float $price) {
        parent:: __construct ($title, $text, $homework);
        $this->price = $price;
        }
    public function getPrice()
            {
                return $this->price;
            }
    public function setPrice(): void 
            {
                $this->price = $price;
            }
}
$pideLesson = new PaidLesson('Урок о наследовании в PHP','Лол, кек, чебурек','Ложитесь спать, утро вечера мудренее', 99.90);
var_dump($pideLesson);
g--nokoder
Class PaidLesson extends Lesson{
    private $price;

    public function __construct($title, $text, $homework, $price){
        parent::__construct($title, $text, $homework);
        $this->price = $price;
    }

    public function setPrice($price):void {
        $this->price = $price;
    }
    public function getPrice(){
        return $this->price;
    }
}

$paidlesson = new PaidLesson("Урок о наследование в PHP", "лол, кек, чебурек", "Повторение мать учение!!!", "445,5 рубль");

echo "<br>";
echo "<pre>";
var_dump($paidlesson);
echo "</pre>";
ivashkevich

Всё норм, кроме, опять же, типов аргументов - их нужно указывать. Так не пишут уже пару лет.
И строки без переменных в них нужно писать в одинарных кавычках.

g--nokoder

Я писал типов аргументов, но PHPStorm выдает подсказку, это устарело и его использовали ниже версии 7. Так писать или нет?)

ivashkevich

Не мог он такую подсказку дать, он говорит, что в Ваших настройках PHPStorm указана версия PHP < 7, а типы появились позже. Нужно зайти в настройки PHPStorm в пункт PHP и выбрать правильную версию.

g--nokoder

Извиняюсь, английский не очень у меня, не правильно понял))

ivashkevich

Ничего страшного, главное чтобы Вы на новой версии учились =)

computerix
<?php

class Post
{
    protected $title;
    protected $text;

    public function __construct(string $title, string $text)
    {
        $this->title = $title;
        $this->text = $text;
    }

    public function getTitle()
    {
        return $this->title;
    }

    public function setTitle($title): void
    {
        $this->title = $title;
    }

    public function getText()
    {
        return $this->text;
    }

    public function setText($text): void
    {
        $this->text = $text;
    }
}

class Lesson extends Post
{
    protected $homework;

    public function __construct(string $title, string $text, string $homework)
    {
        parent::__construct($title, $text);
        $this->homework = $homework;
    }

    public function getHomework(): string
    {
        return $this->homework;
    }

    public function setHomework(string $homework): void
    {
        $this->homework = $homework;
    }
}
class PaidLesson extends Lesson
{
    protected $price;

    public function __construct(string $title, string $text, string $homework, string $price)
    {
        parent::__construct($title, $text, $homework);
        $this->price = $price;
    }

    public function getPrice(): string
    {
        return $this->price;
    }

    public function setPrice(string $price): void
    {
        $this->price = =$price;
    }
}   
$lesson = new Lesson('Урок о наследовании в PHP', 'Лол, кек, чебурек', 'Ложитесь спать, утро вечера мудренее', '99.90');
var_dump($lesson);
DmitryGavrilov
class PaidLesson extends Lesson {

    private $price;

    public function __construct( string $title, string $text, string $homework, float $price)
    {
        parent::__construct($title, $text, $homework);
        $this->price = $price;
    }

    public function getPrice() {
        return $this->price;
    }

    public function setPrice(float $price) {
        $this->price = $price;
    }

}

$paidLesson  = new PaidLesson('Урок о наследование PHP', 'Лол,кек,чебурек',
    'Ложитесь спать, утро вечера мудренее', 99.90);
var_dump($paidLesson);
ArtemijeKA
class PaidLesson extends Lesson
{
    private $price;

    public function __construct(string $title, string $text, string $homework, float $price)
    {
        parent::__construct($title, $text, $homework);
        $this->price = $price;
    }

    public function setPrice($price): void
    {
        $this->price = $price;
    }

    public function getPrice(): float
    {
        return $this->price;
    }
}

$paidLesson = new PaidLesson('Урок о наследовании в PHP', 'Лол, кек, чебурек', 'Ложитесь спать, утро вечера мудренее', 99.90);
var_dump($paidLesson);
$paidLesson->setPrice(55.234);
$paidLesson->setTitle('Новый title!');
$paidLesson->setText('Новый text!');
$paidLesson->setHomework('Новый homework!');
var_dump($paidLesson);

//object(PaidLesson)[1]
  //private 'price' => float 55.234
  //private 'homework' (Lesson) => string 'Новый homework!' (length=20)
  //protected 'title' => string 'Новый title!' (length=17)
  //protected 'text' => string 'Новый text!' (length=16)
ivashkevich

Всё супер!

Benya
class PaidLesson extends Lesson
{
    private $price;

    public function __construct($title, $text, $homework, $price)
    {
        parent::__construct($title, $text, $homework);
        $this->price = $price;
    }

    public function getPrice(): float
    {
        return $this->price;
    }
    public function setPrice(float $price): void
    {
        $this->price = $price;
    }
}

$paid = new PaidLesson('Урок о наследовании в PHP', ' Лол, кек, чебурек', 'Ложитесь спать, утро вечера мудренее', '99.9');
var_dump($paid);
SBTesla
class PaidLesson extends Lesson {
     protected  $prise;

     public function __construct(string $title, string $text, string $homework, string $prise)
     {
          parent::__construct($title, $text, $homework);
          $this->prise = $prise;
     }

     public function getPrise():float {
          return $this->prise;
     }
     public function setPrise($prise): void
     {
          $this->prise = $prise;
     }
}

$PaidLesson = new PaidLesson('Урок о наследовании в PHP', 'Лол, кек, чебурек', 'Ложитесь спать, утро вечера мудренее','цена:99.90');
var_dump($PaidLesson);
ivashkevich

Хорошо, только price через c.

AxLT

Отличный курс, все доступно и понятно.

class PayLesson extends Lesson
{
    protected $price;

    public function __construct(string $title, string $text, string $homeWork, float $price)
    {
        parent::__construct($title, $text, $homeWork);
        $this->price = $price;
    }

    public function setPrice(float $price)
    {
        $this->price = $price;
    }

    public function getPrice(): float
    {
        return $this->price;
    }
}

$payLess = new PayLesson
(
    'Урок о наследовании в PHP',
    'Лол, кек, чебурек',
    'Ложитесь спать, утро вечера мудренее',
    99.90
);
var_dump($payLess);
ivashkevich

Отлично! И спасибо =)

AntonM99
class PaidLesson extends Lesson
{
    private $price;

    public function __construct(string $title, string $text, string $homework, float $price)
    {
        parent::__construct($title, $text, $homework);
        $this->price = $price;
    }

    public function getPrice(): float
    {
        return $this->price;
    }

    public function setPrice(float $price): void
    {
        $this->price = $price;
    }
}

$pLesson = new PaidLesson('Урок о наследовании в PHP', 'Лол, кек, чебурек', 'Ложитесь спать, утро вечера мудренее', '99.90');

var_dump($pLesson);
zebra

Домашка:)

 class PaidLesson extends Lesson
 {
     private $price;

     public function __construct(string $title, string $text, string $homework, float $price)
     {
         parent::__construct($title, $text, $homework);
         $this->price = $price;
     }

     public function setPrice(float $price): void
     {
         $this->price = $price;
     }

     public function getPrice()
     {
         return $this->price;
     }
 }

 $paidLesoon = new PaidLesson('Урок о наследовании в PHP', 'Лол, кек, чебурек', 'Ложитесь спать, утро вечера мудрене', 99.90);
 var_dump($paidLesoon);
Todd
<?php
class PaidLesson extends Lesson {

    private $price;

    public function __construct(string $title, string $text, string $homework, float $price) {
        parent::__construct($title, $text, $homework);
        $this->price = $price;
    }

    public function setPrice(float $price): void {
        $this->price = $price;
    }

    public function getPrice(): float {
        return $this->price;
    }
}

$paidLesson = new PaidLesson('Урок о наследовании в PHP', 'Лол, кек, чебурек', 'Ложитесь спать, утро вечера мудренее', 99.90);

debug($paidLesson);
?>
ivashkevich

Хорошо, но переноси открывающие скобки { для классов и методов на новые строки.

demyanovpaul@yandex.ru

Создайте ещё один класс, являющийся наследником класса Lesson - PaidLesson (платный урок).
Объявите в нем свойство price (цена), а также геттеры и сеттеры для этого свойства. Добавьте в конструкторе параметр, через который это свойство будет устанавливаться при создании объекта.
Создайте объект этого класса со следующими свойствами:
заголовок: Урок о наследовании в PHP
текст: Лол, кек, чебурек
домашка: Ложитесь спать, утро вечера мудренее
цена: 99.90
Выведите этот объект с помощью var_dump()

<?php

class Post
{
    protected $title;
    protected $text;

    public function __construct(string $title, string $text)
    {
        $this->title = $title;
        $this->text = $text;
    }

    public function getTitle()
    {
        return $this->title;
    }

    public function setTitle($title): void
    {
        $this->title = $title;
    }

    public function getText()
    {
        return $this->text;
    }

    public function setText($text): void
    {
        $this->text = $text;
    }
}

class Lesson extends Post
{
    protected $homework;

    public function __construct(string $title, string $text, string $homework)
    {
        parent::__construct($title, $text);
        $this->homework = $homework;
    }

    public function getHomework(): string
    {
        return $this->homework;
    }

    public function setHomework(string $homework): void
    {
        $this->homework = $homework;
    }
}

class PaidLesson extends Lesson
{
    protected $price;

    public function __construct(string $title, string $text, string $homework, float $price)
    {
        parent::__construct($title, $text, $homework);
        $this->price = $price;
    }

    public function getPrice(): float
    {
        return $this->price;
    }

    public function setPrice(float $price): void
    {
        $this->price = $price;
    }
}

$lesson = new PaidLesson('Урок о наследовании в PHP', 'Лол, кек, чебурек',
    'Ложитесь спать, утро вечера мудренее', 99.90);

var_dump($lesson);
Moskva
    class PaidLesson extends Lesson
    {
        private $price; 
        public function __construct(string $title, string $text, string $homework, string $price)
        {
            parent::__construct($title, $text, $homework); // позваляет унаследовать переменные в this из родительского класса
            $this->price = $price;
        }
        public function getPrice(): string
        {
            return $this->$price;
        }
        public function setPrice(string $price): void 
        {
            $this->price = $price;
        }   
    }
    $message = new PaidLesson('Урок о наследовании PHP', 'лол, кек, чебурек',
    'Домашка: ложитесь спать, утро вечера мудренее', 99.90);
    var_dump($message);
bildep
<?php
class Post
{
    protected $title;
    protected $text;

    public function __construct(string $title, string $text)
    {
        $this->title = $title;
        $this->text = $text;
    }

    public function getTitle()
    {
        return $this->title;
    }

    public function setTitle($title): void
    {
        $this->title = $title;
    }

    public function getText()
    {
        return $this->text;
    }

    public function setText($text): void
    {
        $this->text = $text;
    }
}

class Lesson extends Post
{
    protected $homework;

    public function __construct(string $title, string $text, string $homework)
    {
        parent::__construct($title, $text);
        $this->homework = $homework;
    }

    public function getHomework(): string
    {
        return $this->homework;
    }

    public function setHomework(string $homework): void
    {
        $this->homework = $homework;
    }
}

class PaidLesson extends Lesson
{
    protected $price;

    public function __construct(string $title, string $text, string $homework, string $price)
    {
        parent::__conctruct($title, $text, $homework);
        $this->setPrice($price);

    }

    public function setPrice(string $price): void
    {
        $this->price = $price;
    }

    public function getPrice(): string
    {
        return $this->price;
    }

}

$lesson = new PaidLesson('Урок о наследовании в PHP', 'Лол, кек, чебурек', 'Ложитесь спать, утро вечера мудренее', '99.90');

var_dump($lesson);

ошибка выходит Fatal error: Uncaught Error: Call to undefined method Lesson::__conctruct() in

ivashkevich

Это из-за опечатки в написании: __conctruct, а должно быть __construct.

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

lig7771991@list.ru
<?php

class Post
{
    protected $title;
    protected $text;

    public function __construct(string $title, string $text)
    {
        $this->title = $title;
        $this->text = $text;
    }

    public function getTitle()
    {
        return $this->title;
    }

    public function setTitle($title): void
    {
        $this->title = $title;
    }

    public function getText()
    {
        return $this->text;
    }

    public function setText($text): void
    {
        $this->text = $text;
    }
}

class Lesson extends Post
{
    protected $homework;

    public function __construct(string $title, string $text, string $homework)
    {
        parent::__construct($title, $text);
        $this->homework = $homework;
    }

    public function getHomework(): string
    {
        return $this->homework;
    }

    public function setHomework(string $homework): void
    {
        $this->homework = $homework;
    }
}
class PaidLesson extends Lesson
{
    private $price;

    public function __construct(string $title, string $text, string $homework, float $price)
    {
        parent::__construct($title, $text, $homework);
        $this->price = $price;
    }

    public function getPrice(): string
    {
        return $this->price;
    }

    public function setPrice(string $price): void
    {
        $this->price = $price;
    }
}

$lesson = new PaidLesson('Урок о наследовании в PHP', 'Лол, кек, чебурек', 'Ложитесь спать, утро вечера мудренее', 99.90);
echo '<pre>';
var_dump($lesson);
echo '</pre>';
Waldemar
class PaidLesson extends Lesson
{
    private $price;

    public function __construct(string $title, string $text, string $homework, float $price)
    {
        parent::__construct($title, $text, $homework);
        $this->price = $price;
    }

    public function getPrice(): float
    {
        return $this->price;
    }

    public function setPrice(float $price): void
    {
        $this->price = $price;
    }
}

$PaidLesson = new PaidLesson('Урок о наследовании в PHP', 'Лол, кек, чебурек', 'Ложитесь спать, утро вечера мудренее', 99.90);
var_dump($PaidLesson);
Waldemar

Решил в ОпенСервере сменить PHP с 7.0 на 7.2, и var_dump вывелся в сплошную строку:

object(PaidLesson)#1 (4) { ["price":"PaidLesson":private]=> float(99.9) ["homework":"Lesson":private]=> string(67) "Ложитесь спать, утро вечера мудренее" ["title":protected]=> string(43) "Урок о наследовании в PHP" ["text":protected]=> string(30) "Лол, кек, чебурек" }

ivashkevich

В 7.2 у OpenServer отсутствует XDebug. Это именно он формирует красивый вывод var_dump.

lordbear53@gmail.com

Спасибо за урок!
У меня есть вопрос: "var_dump();" у меня выводится строкой, а не акуратно столбиком как у вас, как это можно решить?

<?php

class Post
{
    protected $title;
    protected $text;

    public function __construct(string $title, string $text)
    {
        $this->title = $title;
        $this->text = $text;
    }

    public function getTitle()
    {
        return $this->title;
    }

    public function setTitle($title): void
    {
        $this->title = $title;
    }

    public function getText()
    {
        return $this->text;
    }

    public function setText($text): void
    {
        $this->text = $text;
    }
}

class Lesson extends Post
{
    private $homework;

    public function __construct(string $title, string $text, string $homework )
    {
        parent::__construct($title, $text);
        $this->homework = $homework;
    }

    public function getHomework() : string
    {
        return $this->homework;
    }

    public function setHomework(string $homework) : void
    {
        $this->homework = $homework;
    }
}

class PaidLesson extends Lesson
{
    private $price;
    public function __construct(string $title, string $text, string $homework, float $price)
    {
        parent::__construct($title, $text, $homework);
        $this->price = $price;
    }

    public function getPrice() : float
    {
        return $this->price;
    }

    public  function  setPrice() : void
    {
        $this->price = $price;
    }
}

$lesson = new PaidLesson('Урок о наследовании PHP', 'Лол, кек, чебурек', 'Сон для слабакооов!!', '99.90');

var_dump($lesson);
ivashkevich

За это отвечает расширение xdebug. Инструкция тут

lordbear53@gmail.com

Совсем забыл настроить Xdebug поле того как скачал PHPstorm из телеграм чата. Огромное спасибо! А как само ДЗ?

ivashkevich

Что-то не выводится цена.

lordbear53@gmail.com

Исправил

<?php

class Post
{
    protected $title;
    protected $text;

    public function __construct(string $title, string $text)
    {
        $this->title = $title;
        $this->text = $text;
    }

    public function getTitle()
    {
        return $this->title;
    }

    public function setTitle($title): void
    {
        $this->title = $title;
    }

    public function getText()
    {
        return $this->text;
    }

    public function setText($text): void
    {
        $this->text = $text;
    }
}

class Lesson extends Post
{
    private $homework;

    public function __construct(string $title, string $text, string $homework )
    {
        parent::__construct($title, $text);
        $this->homework = $homework;
    }

    public function getHomework() : string
    {
        return $this->homework;
    }

    public function setHomework(string $homework) : void
    {
        $this->homework = $homework;
    }
}

class PaidLesson extends Lesson
{
    private $price;
    public function __construct(string $title, string $text, string $homework, float $price)
    {
        parent::__construct($title, $text, $homework);
        $this->price = $price;
    }

    public function getPrice() : float
    {
        return $this->price;
    }

    public  function  setPrice(float $price) : void
    {
        $this->price = $price;
    }
}

$lesson = new PaidLesson('Урок о наследовании PHP', 'Лол, кек, чебурек', 'Сон для слабакооов!!', '99.90');
var_dump($lesson);
ivashkevich

Другое дело :)

vadymbilyi@gmail.com
class PaidLesson extends Lesson
{
    public $price;

    function __construct(string $title, string $text, string $homework, float $price)
    {
        parent::__construct($title, $text, $homework);
        $this->price = $price;
    }

    public function getPrice(): float
    {
        return $this->price;
    }

    public function setPrice(string $price): void
    {
        $this->price = $price;
    }

}

$paidLesson = new PaidLesson('Урок о наследовании в PHP', 'Лол, кек, чебурек', 'Ложитесь спать, утро вечера мудренее', 99.90);
var_dump($paidLesson);
alepawka
class PaidLesson extends Lesson
{
    private $price;

    public function __construct(string $title, string $text, string $homework, float $price)
    {
        parent::__construct($title,$text,$homework);
        $this -> price = $price;
    }
    public function SetPrice($price) {
        $this -> price = price;
    }
    public function GetPrice() {
        return $this ->price;
    }
}
$lessPHP = new PaidLesson('Урок по наследованию PHP','Лол,кек,чебурек','Ложись спать!','99.90');
var_dump($lessPHP);
ivashkevich

Ок. Имена методов должны начинаться с маленькой буквы. Для цены указали тип float и явно передаёте строку - почему не число?

landialog
class PaidLesson extends Lesson
{
    private $price;
    public function __construct($title, $text, $homework, $price)
    {
        parent::__construct($title, $text, $homework);
        $this->price = $price;
    }

    public function setPrice($price)
    {
        $this->price = $price;
    }

    public function getPrice()
    {
        return $this->price;
    }
}

$plesson = new PaidLesson('Урок о наследовании в PHP', 'Лол, кек, чебурек', 'Ложитесь спать, утро вечера мудренее', 99.90);
var_dump($plesson);

P.S. Опять этот вопрос по поводу использования типов данных. Где-то в документации по PHP прочитал что добавлением псевдотипов данных используется с PHP 7.1 как подсказка для программистов.
Правда это? Или еще есть др. объяснение, в качестве доп. защиты данных?
К слову сказать в PhpStorme(установлена последняя версия) есть подсказки написания геттеров и сеттеров и там почему-то не добавляет эти доп. данные?

ivashkevich

Посмотри урок про функции из курса PHP для начинающих.

Bogdan

Объявите в нем свойство price (цена), а также геттеры и сеттеры для этого свойства. Добавьте в конструкторе параметр, через который это свойство будет устанавливаться при создании объекта.

<?php
include "Lesson.php";

class PaidLesson extends Lesson
{
    private $price;

    public function __construct(string $title, string $text, string $homework, float $price)
    {
        parent::__construct($title, $text, $homework);
        $this->price = $price;
    }

    public function setPrice(string $price): void
    {
        $this->price = $price;
    }

    public function getPrice()
    {
        return $this->price;
    }
}

Создайте объект этого класса со следующими свойствами:
заголовок: Урок о наследовании в PHP
текст: Лол, кек, чебурек
домашка: Ложитесь спать, утро вечера мудренее
цена: 99.90

<?php
include "PaidLesson.php";

$paidLesson1 = new PaidLesson(
    'Урок о наследовании в PHP',
    'Лол, кек, чебурек',
    'Ложитесь спать, утро вечера мудренее',
    99.90);

Выведите этот объект с помощью var_dump()

var_dump($paidLesson1);
  1. Большое спасибо за эти уроки, до этого изучал давненько Java, как бы ООП язык, но о ООП знал "слышу звон, не знаю где он", неуверенно себя чувствовал. НО сейчас очень много точек расставилось над i.
  2. в Java вроде было правило, что файл должен иметь название идентичное названию класса, есть ли вообще такое правило, и применяется ли оно к РНР?. Спасибо
ivashkevich

По коду всё хорошо. По правилу именования - да, есть такое, дальше по курсу будет.

Pavel-Tonk

У меня у одного ошибка при выполнении метода класса Post:

    public function setText($text):void
    {
        $this->text = $text;
    }

когда пытаюсь использовать сеттер,
Fatal error: Uncaught TypeError: Return value of Post::setText() must be an instance of void, none returned in W:\domains\myproject.loc\www\index.php:26 Stack trace: #0 W:\domains\myproject.loc\www\index.php(51): Post->setText('\xD0\x98\xD0\xB2\xD0\xB5\xD0\xBD\xD0\xB5\xD1\x86\xD0\xBA\xD0...') #1 {main} thrown in W:\domains\myproject.loc\www\index.php on line 26.
Как я понял ожидается возврат любого значения, из-за void, но его не происходит, т.к. нам return не нужен.

Pavel-Tonk

Вопрос решен=) Переключился на версию PHP 7.1. Оставлю комент, вдруг кому понадобится!

Bugaga159
class PaidLesson extends Lesson
{
    protected $price;

    public function __construct( string $title, string $text, string $homework, float $price)
    {
        parent::__construct($title, $text, $homework);
        $this->price = $price;
    }
    public function getPrice(): float
    {
        return $this->price;

    }
    public function setPrice(float $price): void
    {
        $this->price = $price;
    }

}

$paidLesson = new PaidLesson('Урок о наследовании в PHP', 'Лол, кек, чебурек', 'Ложитесь спать, утро вечера мудренее', 99.90);
var_dump($paidLesson);
ivashkevich

Отлично. А почему поле цены с типом protected?

Bugaga159

Да, я тут ошибся, нужно было private.

excent63

Спасибо за урок!
Это задание понял вот так:

class PaidLesson extends Lesson
{
    private $price;

    public function __construct(string $title, string $text, string $homework, string $price)
    {
        parent::__construct($title, $text, $homework);
        $this->price = $price;
    }
    public function getPrice(): string
    {
        return $this->price;
    }
    public function setPrice(string $price): void
    {
        $this->price = $price;
    }
}
$paidLesson = new PaidLesson('Урок о наследовании PHP','Лол,кек,чебурек','Ложитесь спать, утро вечера мудренее', '99,90');
var_dump($paidLesson);
ivashkevich

Цену всё-таки принято хранить в виде чисел, а не строк.

excent63

Теперь до конца понял как лучше применять строки, или числа. Спасибо!

class PaidLesson extends Lesson
{
    private $price;

    public function __construct(string $title, string $text, string $homework, float $price)
    {
        parent::__construct($title, $text, $homework);
        $this->price = $price;
    }
    public function getPrice(): float
    {
        return $this->price;
    }
    public function setPrice(float $price): void
    {
        $this->price = $price;
    }
}
$paidLesson = new PaidLesson('Урок о наследовании PHP','Лол,кек,чебурек','Ложитесь спать, утро вечера мудренее', 99.90);
var_dump($paidLesson);
Самый понятный курс PHP
Онлайн-уроки в удобное время!
Начать бесплатно
Популярное за сутки
Онлайн-курсы PHP и MySQL
Обучение с полного нуля до уровня джуниора!
Начать бесплатно
Сейчас читают
Онлайн-курсы PHP и MySQL
Обучение с полного нуля до уровня джуниора!
Начать бесплатно
Новые статьи
Логические задачи с собеседований