Этот урок набрал набрал достаточно большое количество комментариев и дальнейшее его комментирование отключено. Если вы хотели убедиться в правильности выполнения ДЗ или у вас возник вопрос по уроку, посмотрите ранее добавленные комментарии, кликнув по кнопке ниже. Скорее всего вы найдете там то, что искали. Если это не помогло - задайте вопрос в чате в телеграме - https://t.me/php_zone
SlipKnot 16.07.2018 в 10:36

Фух, ну и пот. Вот вариант домашки:

<?php

interface CalculateSquare
{
    public function calculateSquare (): float;
}

class Circle implements CalculateSquare
{
    const PI = 3.1416;
    private $r;
    public function __construct(float $r)
    {
        $this->r = $r;
    }
    public function calculateSquare(): float
    {
        return self::PI * ($this->r ** 2);
    }
}
class Restangle
{
    private $x;
    private $y;
    public function __construct (float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }
    public function calculateSquare(): float
    {
        return $this->x * $this->y;
    }
}
class Square implements CalculateSquare
{
    private $x;
    public function __construct(float $x)
    {
        $this->x = $x;
    }
    public function calculateSquare():float
    {
        return $this->x ** 2;
    }
}

$objects = [
    new Square(5),
    new Restangle (2,4),
    new Circle(5)
];

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект класса ' . get_class($object) . ' реализует интерфейс CalculateSquare. Полщадь - ' . $object->calculateSquare();
        echo '<br>';
    } else {
        echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculateSquare';
        echo '<br>';
    }
}
ivashkevich 16.07.2018 в 15:18

Нормально, только

public function getClass()

не нужно нигде - оно ведь нигде не используется. К тому же вызов get_class() без аргумента приведет к ошибке. Поправьте, пожалуйста :)

SlipKnot 17.07.2018 в 03:32

Пересмотрел код, участки вида:

public function getClass()
    {
        return get_class ();
    }

оказались бессмыслены, их нужно просто удалить. Отредактировал, проверьте пожалуйста. Спасибо за подсказку)

ivashkevich 17.07.2018 в 18:17

Теперь отлично!
Не торопитесь и всё будет супер-пупер ;)

Galay 23.07.2018 в 14:55
foreach ($object as $object) 
{
    if($object instanceof CalculateSquare)
    {
        $x = get_Class($object);
        echo "Объект принадлежи классу $x и реализует интерфейс CalculateSquare. Площадь: " . $object->calculateSquare();
        echo '<br>';
    } 
    else
    {
    $x = get_Class($object);
    echo "Объект класса $x не реализует интерфейс CalculateSquare";
    }

Как-то так.

ivashkevich 23.07.2018 в 19:34

Разве работает?

Galay 24.07.2018 в 07:29
interface CalculateSquare
    {
        public function calculateSquare(): float;
    }
class Circle implements CalculateSquare
    {
        const PI = 3.14;
        private $r;
        public function __construct(float $r)
        {
            $this->r = $r;
        }
        public function calculateSquare(): float{

            return self::PI * ($this->r ** 2);
        }

    }
class Rectangle implements CalculateSquare
    {
        private $x;
        private $y;
        public function __construct(float $x, float $y)
        {
            $this->x = $x;
            $this->y = $y;
        }
        public function calculateSquare(): float
        {
            return $this->x * $this->y;
        }

    }
class Scuare implements CalculateSquare
    {
        private $x;
        public function __construct(float $x)
        {
            $this->x = $x;
                    }
        public function calculateSquare(): float
        {
            return $this->x ** 2;
        }

    }
class Cat 
    {
        private $name;
        private $color;
        public function __construct(string $name, string $color){
            $this->name = $name;
            $this->color = $color;
        }

        public function sayHello() {
            echo "Привет, меня зовут {$this->name}, мой цвет - $this->color.";
        }
        public function getColor(): string {
            return $this->color;
        }
        public function setColor(string $color) {
             $this->color = $color;
        }
    }
$object = 
    [
    new Scuare(5),
    new Rectangle(5, 3),
    new Circle(3),
    new Cat('Барсик','Белый')
    ];

foreach ($object as $object) 
{
    if($object instanceof CalculateSquare)
    {
        $x = get_Class($object);
        echo "Объект принадлежи классу $x и реализует интерфейс CalculateSquare. Площадь: " . $object->calculateSquare();
        echo '<br>';
    } 
    else
    {
    $x = get_Class($object);
    echo "Объект класса $x не реализует интерфейс CalculateSquare";
    }
}

Ну вот так работает. Я просто выложил только домашку, без кода скопированного из урока.

ivashkevich 24.07.2018 в 15:55

Да нет, это я понял. Странно что работает функция get_Class - это видимо какой-то баг в PHP. Нужно использовать get_class - все в нижнем регистре.

computerix 03.09.2018 в 12:31
<?php

interface CalculateSquare
{
    public function calculateSquare(): float;
}

class Circle implements CalculateSquare
{
    const PI = 3.1416;

    private $r;

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

    public function calculateSquare(): float
    {
        return self::PI * ($this->r ** 2);
    }
}

class Rectangle implements CalculateSquare
{
    private $x;
    private $y;

    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }

    public function calculateSquare(): float
    {
        return $this->x * $this->y;
    }
}

class Square implements CalculateSquare
{
    private $x;

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

    public function calculateSquare(): float
    {
        return $this->x ** 2;
    }
}

$objects = [
    new Square(5),
    new Rectangle(2, 4),
    new Circle(5)
];

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект реализует интерфейс CalculateSquare. Относится к классу' .get_class($object) . 'Площадь: ' . $object->calculateSquare();
        echo '<br>';
    }
    else {'Объект класса' .get_class($object) . 'не реализует интерфейс CalculateSquare.'};
}
?>
ivashkevich 05.09.2018 в 23:05

Отлично!

DmitryGavrilov 19.09.2018 в 14:27
<?php

interface calculateSquare
{

    public function calculateSquare(): float;
}

class Rectangle
{

    private $x;
    private $y;

    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }

    public function calculateSquare(): float
    {
        return $this->x * $this->y;
    }
}

class Square implements calculateSquare
{

    private $x;

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

    public function calculateSquare(): float
    {
        return $this->x ** 2;
    }

}

class Circle implements calculateSquare
{

    const PI = 3.1416;

    private $r;

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

    public function calculateSquare(): float
    {

        return self::PI * $this->r ^ 2;

    }

}

$objects = [
    new Square(5),
    new Rectangle(2, 4),
    new Circle(5)
];

foreach ($objects as $object) {
    if ($object instanceof calculateSquare) {
        echo 'Объект реализует интерфейс calculateSquare. Площадь: ' . $object->calculateSquare();
        echo '<br>';
        echo 'Это объект класса: ' . get_class($object);
        echo '<br>';
    } else {
        echo 'Объект класса ' . get_class($object) . ' ' . 'не реализует интерфейс calculateSquare';
    }

}
ivashkevich 22.09.2018 в 20:26

Супер!

Benya 28.09.2018 в 21:20
foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
        echo '<br>';
        echo 'Этот объект' . get_class($object) . ' класса.' . '<br>';
    } else {
        echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculateSquare.';
    }
}
ivashkevich 28.09.2018 в 23:16

Отлично =)

SBTesla 05.10.2018 в 10:41
<?php

interface CalculateSquare {
     public function calculateSquare():float ;
}

class Rectangle  implements CalculateSquare {
     private $x;
     private $y;

     public function __construct(float  $x, float $y)
     {
          $this->x = $x;
          $this->y = $y;
     }

     public function calculateSquare (): float {

          return $this->x * $this->y;
     }
}

class Square  implements CalculateSquare {
     private $x;

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

     public function calculateSquare():float
     {
          return $this->x ** 2;
     }
}

class Circle implements CalculateSquare {
     const PI = 3.1416;
     private $r;

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

     public function calculateSquare(): float
     {
          return self::PI * ($this->r ** 2);
     }
}

$objects = [
      new Square(5),
     new Rectangle(2,4),
     new Circle(5)
];

foreach ($objects as $object) {
     if ($object instanceof CalculateSquare) {
          echo 'Обьект класса '. get_class($object).' реализует интерфейс CalculateSquare. Площадь:' . $object->calculateSquare();
          echo '<br>';
     }  else {
          echo 'Обьект класса' . get_class($object) . ' не реализует интерфейс CalculateSquare';
          echo '<br>';
     }
}
ivashkevich 06.10.2018 в 14:30

Супер!

artemjeka 09.10.2018 в 06:19
foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект "' . get_class($object) . '" реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
        echo '<br>';
    } else {
        echo 'Объект класса "' . get_class($object) . '" не реализует интерфейс CalculateSquare.';
        echo '<br>';
    }
}
ivashkevich 12.10.2018 в 08:36

Отлично!

EWA 24.10.2018 в 21:01

Вроде так.

<?php
interface CalculateSquare
{
public function calculateSquare(): float;
}
class Circle implements CalculateSquare
{
const PI = 3.1416;
private $r;

public function __construct(float $r)
{
$this->r = $r;
}
public function calculateSquare(): float
{
return self::PI * ($this->r ** 2);
}
}
class Rectangle
{
private $x;
private $y;
public function __construct(float $x, float $y)
{
$this->x = $x;
$this->y = $y;
}
public function calculateSquare(): float
{
return $this->x * $this->y;
}
}
class Square implements CalculateSquare
{
private $x;

public function __construct(float $x)
{
$this->x = $x;
}
public function calculateSquare(): float
{
return $this->x ** 2;
}
}
$objects = [
new Square(5),
new Rectangle(2, 4),
new Circle(5)
];
foreach ($objects as $object) {
if ($object instanceof CalculateSquare) {
echo 'Объект реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare() . ' и является объектом класса ' . get_class($object);
echo '<br>';
}else{
echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculateSquar.';
echo '<br>';
}
}
ivashkevich 26.10.2018 в 08:53

Все ок

Protos 02.11.2018 в 03:01

$objects = [
    new Square(5),
    new Rectangle(2,4),
    new Circle(9)
];

foreach ($objects as $object){
    if ($object instanceof CalcSquare){
        echo 'Объект реализует интерфейс CalcSquare. И принадлежит к классу ' . get_class($object) . PHP_EOL ;

    }
    else {
        echo 'Объект НЕ РЕАЛИЗУЕТ интерфейс CalcSquare. И принадлежит к классу ' . get_class($object) . PHP_EOL ;
    }
}
ivashkevich 02.11.2018 в 07:41

Хорошо, только не стоило убирать расчет площади.

AntonM99 04.11.2018 в 16:56
$objects =[
    new Square(5),
    new Rectangle(2,4),
    new Circle(5)
];

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект реализует интерефейс CalculateSquare. Это объект класса ' . get_class($object) . '.' . ' Площадь: ' . $object->calculateSquare();
        echo '<br>';
    } else {
        echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculateSquare';
        echo '<br>';
    }
}
ivashkevich 04.11.2018 в 18:23

Отлично!

zebra 04.11.2018 в 20:09

Домашка :))

class Rectangle
{
    private $x;
    private $y;

    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }

    public function calculateSquare(): float
    {
        return $this->x * $this->y;
    }
}

class Square implements CalculateSquare
{
    private $x;

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

    public function calculateSquare(): float
    {
        return $this->x ** 2;
    }
}

interface CalculateSquare
{
    public function calculateSquare(): float;
}

class Circle implements CalculateSquare
{
    const PI = 3.1416;

    private $r;

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

    public function calculateSquare(): float
    {
        return self::PI * ($this->r ** 2); //self - обращение к текущему классу
    }
}

//$circle1 = new Circle(2.5);
// var_dump($circle1 instanceof CalculateSquare); //instanceof - проверяет является ли экзэпляром какого-либо класса, либо реализует какого-либо интерфейс
//get_class  Возвращает имя класса к которому принадлежит объект

$objects = [
    new Square(5),
    new Rectangle(2, 4),
    new Circle(5)
];

//var_dump($objects);
//echo (get_class($objects[0]));
//echo '<br>';

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare() . ' и это объект класса ' . get_class($object);
        echo '<br>';
    }
    else {
        echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculateSquare. ';
        echo '<br>';
    }
}
ivashkevich 04.11.2018 в 20:14

Супер!

Todd 05.11.2018 в 00:49
$objects = [
    new Rectangle(2, 4),
    new Square(5),
    new Circle(5),
];

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare() . '<br>';
        echo 'Этот объекст относится к кассу ' . get_class($object) . '<br><br>';
    } else {
        echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculateSquare <br><br>';
    }
}
ivashkevich 05.11.2018 в 09:17

Отлично!

stokato 06.11.2018 в 07:58

Познакомьтесь самостоятельно с функцией get_class().
Дополните информацию об объекте, для которого считается площадь – пишите что это объект такого-то класса.
Для объектов, которые не реализуют интерфейс CalculateSquare пишите:
Объект класса ТУТ_НАЗВАНИЕ_КЛАССА не реализует интерфейс CalculateSquare.

interface CalculateSquare
{
    public function calculateSquare(): float;
}

class Rectangle implements CalculateSquare
{
    private $x;
    private $y;

    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }

    public function calculateSquare(): float
    {
        return $this->x * $this->y;
    }
}

class Square 
{
    private $x;

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

    public function calculateSquare(): float
    {
        return $this->x ** 2;
    }
}

class Circle implements CalculateSquare
{
    private $r;

    const PI = 3.1416;

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

    public function calculateSquare(): float
    {
        return self::PI * ($this->r ** 2);
    }
}

$objects = [
    new Square(5),
    new Rectangle(2, 4),
    new Circle(5)
];

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект ' . get_class($object) . ' реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
        echo '<br>';
    }
    else{
        echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
        echo '<br>';
    }
}
ivashkevich 08.11.2018 в 10:33

Отлично!

bildep 18.11.2018 в 15:32
<?php

interface CalculateSquare
{
    public function calculateSquare(): float;
}

class Circle implements CalculateSquare
{
    const PI = 3.1416;

    private $r;

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

    public function calculateSquare(): float
    {
        return self::PI * ($this->r ** 2);
    }
}

class Rectangle
{
    private $x;
    private $y;

    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }

    public function calculateSquare(): float
    {
        return $this->x * $this->y;
    }
}

class Square implements CalculateSquare
{
    private $x;

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

    public function calculateSquare(): float
    {
        return $this->x ** 2;
    }
}

$objects = [
    new Square(5),
    new Rectangle(2, 4),
    new Circle(5)
];

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект класса ' . get_class($object) . ' реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
        echo '<br>';
    } else {
        echo 'Объект класса ' . get_class($object) .' не реализует интерфейс CalculateSquare';
        echo '<br>';
    }
}
ivashkevich 19.11.2018 в 21:49

Отлично!

Waldemar 30.11.2018 в 02:55
foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare() . '. Этот объект класса ' . get_class($object);
        echo '<br>';
    } else {
        echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculateSquare.' . '<br>';
    }
ivashkevich 30.11.2018 в 23:19

Отлично!

CarfikDK 17.12.2018 в 15:54

Домашка:

$objects = [
  new Square(5),
  new Rectangle(2, 4),
  new Circle(5)
];

foreach ($objects as $object) {
    if( $object instanceof CalculateSquare ) {
        echo 'Объект реализует интерфейс CalculateSquare. Прощадь: ' . $object->calculateSquare() . '<br> Этот объект класса: ' . get_class($object);
        echo '<br>';
    } else {
        echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculateSquare';
        echo '<br>';
    }
}
ivashkevich 17.12.2018 в 15:59

Отлично

alepawka 01.01.2019 в 16:52
foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare() . ', а его класс: ' . get_class($object);
        echo '<br>';
    }
    else 
    {
        echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculateSquare';
        echo '<br>';
    }
}
ivashkevich 01.01.2019 в 17:57

Отлично

landialog 02.01.2019 в 00:59

interface CalculateSquare
{
    public function calculateSquare();
}

class Circle implements CalculateSquare
{
    const PI = 3.14;
    private $r;

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

    public function calculateSquare()
    {
        return self::PI * ($this->r ** 2);
    }
}

class Rectangle implements CalculateSquare
{
    private $a;
    private $b;

    public function __construct($a, $b)

    {
        $this->a = $a;
        $this->b = $b;
    }

    public function calculateSquare()
    {
        return $this->a * $this->b;
    }
}

class Square implements CalculateSquare
{
    private $a;

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

    public function calculateSquare()
    {
        return $this->a ** 2;
    }
}

$all = [
    new Circle(7),
    new Square(4),
    new Rectangle(4, 3)
];

foreach ($all as $value) {

    if ($value instanceof CalculateSquare) {
        echo '<p> Площадь равна = ' . $value->calculateSquare() . 'Это объект класса - ' . get_class($value);
    } else {
        echo 'Объект класса' . get_class($value) . 'не реализует интерфейс CalculateSquare';
    }
}

Вопрос по поводу типизации данных. PhpStorm выдает ошибку если указывать эту строгую типизацию.
Насколько это грозит последствиями если ее не указывать?
P.S. Новое для себя открыл, крутое выражение возведение в степень **2.

ivashkevich 02.01.2019 в 21:04

По коду - ок. Шторм правильно всё говорит, если ожидаете целочисленное, то и передавать нужно целочисленное. Лучше сейчас использовать strict_types=1 уже.

Bogdan 04.01.2019 в 15:23

Дополните информацию об объекте, для которого считается площадь – пишите что это объект такого-то класса.
Для объектов, которые не реализуют интерфейс CalculateSquare пишите:
Объект класса ТУТ_НАЗВАНИЕ_КЛАССА не реализует интерфейс CalculateSquare.

foreach ($objects as $key => $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare() .
            ', это объект ' . get_class($objects[$key]) . ' класса.';
        echo '<br>';
    } else {
        echo 'Объект класса ' . get_class($objects[$key]) . ' не реализует интерфейс CalculateSquare.';
    }
}
ivashkevich 05.01.2019 в 07:57

Отлично!

Bugaga159 02.02.2019 в 10:54
$objects = [
    new Square(5),
    new Rectangle(2, 4),
    new Circle(5)
];

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект '. get_class($object) .' реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare() . '<br>';
    }else{
        echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculateSquare <br>';
    }
}
ivashkevich 03.02.2019 в 23:48

Ок!

excent63 03.02.2019 в 19:20
<?php
interface CalculateSquare
{
    public function calculateSquare(): float;
}
class Rectangle implements CalculateSquare
{
    private $x;
    private $y;

    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }
    public function calculateSquare(): float
    {
        return $this->x * $this->y;
    }
}
class Square
{
    private $x;

    public function __construct(float $x)
    {
        $this->x = $x;
    }
    public function calculateSquare(): float
    {
        return $this->x ** 2;
    }
}
class Circle implements CalculateSquare

{
    const PI = M_PI;

    private $r;

    public function __construct(float $r)
    {
        $this->r = $r;
    }
    public function calculateSquare(): float
    {
        return self::PI * ($this->r ** 2);
    }
}

$objects = [
    new Square(5),
    new Rectangle(2, 4),
    new Circle(5)
];

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare() . '. ';
        echo 'Это объект класса '. get_class($object). '.';
        echo '<br>';
    }else {
        echo get_class($object) . ' не реализует интерфейс CalculateSquare';
        echo '<br>';
    }
}
ivashkevich 03.02.2019 в 23:49

Ок!

cap 25.02.2019 в 16:19
<?php

interface CalculateSquare
{
    public function calculateSquare(): float;

}

interface ClassName
{
    public function className() ;
}

class Circle implements CalculateSquare, ClassName
{
    const PI = 3.1416;

    private $r;

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

    public function calculateSquare(): float
    {
        return self::PI * ($this->r ** 2);
    }

    public function className()
    {
        return get_class($this);
    }
}

class Rectangle implements ClassName
{
    private $x;
    private $y;

    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }

    public function calculateSquare(): float
    {
        return $this->x * $this->y;
    }

    public function className()
    {
        return get_class($this);
    }
}

class Square implements CalculateSquare, ClassName
{
    private $x;

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

    public function calculateSquare(): float
    {
        return $this->x ** 2;
    }

    public function className()
    {
        return get_class($this);
    }
}

$objects = [
    new Square(5),
    new Rectangle(2, 4),
    new Circle(5)
];

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект реализует интерфейс CalculateSquare. 
        Площадь: ' . $object->calculateSquare() . '.' .' Объект реализует класс: '. $object->className() . '.';
        echo '<br>';
    }else{
        echo 'Объект <b>НЕ</b> реализует интерфейс CalculateSquare.' .' Объект реализует класс: '.
            $object->className() . '.';
        echo '<br>';
    }
}
//конечно, тут сожно и без interface ClassName, но этож тема про интерфейсы
ivashkevich 26.02.2019 в 09:35

По самому заданию - всё сделано хорошо. Только метод className() у вас везде одинаковый, да и в общем-то лишний. Но хорошо, что вы разобрались как это в целом работает :)

Evgeny 10.03.2019 в 23:30

<?php

interface CalculateSquare
{

    public function calculateSquare(): float;

}

class Circle implements CalculateSquare
{
    private const PI = 3.1416;
    private $r;

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

    public function calculateSquare(): float
    {
        return self::PI * ($this->r ** 2);
    }
}

class Rectangle implements CalculateSquare
{

    protected $x;
    protected $y;

    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }

    public function calculateSquare(): float
    {
        return $this->x * $this->y;
    }
}

class Square implements CalculateSquare
{

    protected $x;

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

    public function calculateSquare(): float
    {
        return $this->x ** 2;
    }
}

$objects = [
    new Circle(24.65),
    new Rectangle(15.7, 27.25),
    new Square(25.5),
];

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект класса ' . get_class($object) . ' реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
        echo '<br>';
    } else {
        echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculateSquare.';
        echo '<br>';
    }
}
ivashkevich 11.03.2019 в 21:22

Отлично

[email protected] 17.03.2019 в 18:10
foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare() . ' Это объект класса ' . get_class($object);
        echo '<br>';
    } else {
        echo "Объект класса " . get_class($object) . " не реализует интерфейс CalculateSquare.<br>";
    }
}
ivashkevich 17.03.2019 в 23:57

Отлично

mitja1211 19.03.2019 в 12:47
<?php

interface CalculateSquare
{
    public function calculateSquare(): float;
}

class Circle implements CalculateSquare
{
    const PI = 3.1416;

    private $r;

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

    public function calculateSquare(): float
    {
        return self::PI * ($this->r ** 2);
    }
}

class Rectangle
{
    private $x;
    private $y;

    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }

    public function calculateSquare(): float
    {
        return $this->x * $this->y;
    }
}

class Square implements CalculateSquare
{
    private $x;

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

    public function calculateSquare(): float
    {
        return $this->x ** 2;
    }
}

$objects = [
    new Square(5),
    new Rectangle(2, 4),
    new Circle(5)
];

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare() . ', это объект класса ' . get_class($object);
        echo '<br>';
    } else {

        echo 'Объект класса ' .  get_class($object) . ' не реализует интерфейс CalculateSquare ' . ' Площадь: ' . $object->calculateSquare() . ', это объект класса ' . get_class($object);
        echo '<br>';

    }
}
ivashkevich 19.03.2019 в 23:27

Отлично

Grewi 28.03.2019 в 23:51
foreach ($objects as $object){
    if($object instanceof CalculateSquare){
        echo 'Объект  '.get_class($object).' реализует CalculateSquare. Площадь: '. $object->calculateSquare().'</br>';
    }else{
        echo 'Объект '.get_class($object).' не реализует CalculateSquare. </br>';
    }
}
ivashkevich 29.03.2019 в 16:29

Отлично

Boodoo 10.04.2019 в 06:45
foreach($objects as $object) {
        if($object instanceof CalculateSquare) {
            echo 'Класс объекта ' . get_class($object) . '.';
            echo 'Объект реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
            echo '<br>';
        } else {
            echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculateSquare.';
            echo '<br>';
        }
    }
ivashkevich 10.04.2019 в 15:21

Отлично

polvanovv 18.04.2019 в 07:48
interface CalculeteSquare
{
    public function calculateSquare(): float;
}
class  Rectangle implements CalculeteSquare
{
    private $x;
    private $y;

    public function __construct(float $x,float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }

    public function calculateSquare(): float
    {
        return $this->x * $this->y;
    }
}

class Square implements CalculeteSquare
{
    private $x;

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

    public function calculateSquare():float
    {
        return $this->x **2;
    }
}

class  Circle
{
    const PI = 3.1416;
    private $r;

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

    public function calculateSquare():float
    {

        return self::PI * ($this->r ** 2);
    }

    public function getR(): float
    {
        return $this->r;
    }
}

$objects = [
    new Square(5),
    new Rectangle(2, 4),
    new Circle(5)
];

foreach ($objects as $object){
    if ($object instanceof CalculeteSquare){
        echo 'Обьект класса ' .get_class($object) . ' реализует интерфейс CalculateSqure. Площадь: ' . $object->calculateSquare();
        echo '<br>';
    }else {
        echo 'Обьект класса ' . get_class($object) . ' не реализует интерфейс CalculateSqure.';
        echo '<br>';
    }
}
ivashkevich 18.04.2019 в 08:37

Отлично!

artemship 07.05.2019 в 11:04
foreach ($objects as $object) {
    if (!$object instanceof CalculateSquare) {
        echo 'Объект класса '
            . get_class($object)
            . ' не реализует интерфейс CalculateSquare';
        echo '<br>';
    } else {
        echo 'Объект класса '
            . get_class($object)
            . ' реализует интерфейс CalculateSquare. Его площадь: '
            . $object->calculateSquare();
        echo '<br>';
    }
}
ivashkevich 10.05.2019 в 13:29

Отлично!

Dram 11.05.2019 в 09:37
foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare() . ' и относится к классу ' . get_class($object);
        echo '<br>';
    } else{
        echo 'Объект класса '. get_class($object) .' не реализует интерфейс CalculateSquare.';
        echo '<br>';
    }
}
ivashkevich 11.05.2019 в 14:00

Отлично

Danya 03.06.2019 в 15:55

Я правильно полял , что интерфейс просто обязывает класс, реализующий интерфейс, содержать определенные методы , описаные в интерфейсе. Типа как конструктор , который обязывает дать имя котику (как пример в прошлых уроках)

ivashkevich 03.06.2019 в 18:17

Всё верно описали, но аналогия с конструктором лишняя, не очень подходящий пример.

Danya 03.06.2019 в 20:39

"Через интерфейс мы можем изменять внутреннее состояние объекта, добиться от него каких-то действий, или получить от него что-то." - это определение из раздела "Объектно-ориентированный подход в PHP" который идет чуть позже , очень сильно облегчил понимание))

ivashkevich 03.06.2019 в 20:51

Там под интерфейсом подразумевается просто набор публичных методов. Не то, что здесь описывается с помощью слова interface :)

Tina 09.06.2019 в 16:55

Домашка Урок: 4 (Интерфейсы)

<?php
interface CalculateSquare
{
    public function calculateSquare(): float;
}
//Прямоугольник
//class Rectangle implements CalculateSquare
class Rectangle
{
    private $x;
    private $y;
    //добавила свойство name для понимания при выводе о какой фигуре идет речь
    public $name;

    public function __construct($x, $y, string $name)
    {
        $this->x = $x;
        $this->y = $y;
        $this->name = $name;
    }

    public function calculateSquare():float
    {
        return $this->x * $this->y;
    }
}

//Квадрат
class Square implements CalculateSquare
{
    private $x;
    public $name;

    public function __construct(float $x, string $name)
    {
        $this->x = $x;
        $this->name = $name;
    }

    public function calculateSquare(): float
    {
        return $this->x ** 2;
    }
}

//Круг
class Circle implements CalculateSquare
{
    const PI = 3.1416;
    private $r;
    public $name;

    public function __construct(float $r, string $name)
    {
        $this->r = $r;
        $this->name = $name;
    }

    public function calculateSquare(): float
    {
        $pi = 3.1416;
        return $pi * ($this->r ** 2);
    }
}

$objects = [
    new Square(5, 'Квадрат'),
    new Rectangle(2, 4, 'Прямоугольник'),
    new Circle(5, 'Круг')
];

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект ' . $object->name . ' класса ' .get_class($object) . ' реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
        echo '<br>';
    } else {
       echo 'Объект ' . $object->name . ' класса ' . get_class($object) . ' не реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
       echo '<br>';
    }
}
$circle1 = new Circle(2.5, '');
var_dump($circle1 instanceof Circle);
ivashkevich 09.06.2019 в 18:28

А почему это свойство public?

ashfedor 10.06.2019 в 20:34
foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект ' , get_class($object) , ' реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
        echo '<br>';
    }else{
        echo 'Объект ' , get_class($object) , ' не реализует интерфейс CalculateSquare.' . '<br>';
    }
}
ivashkevich 11.06.2019 в 02:17

Отлично

rpash151 22.06.2019 в 18:58
<?php

interface CalculateSquare
{
    public function calculateSquare(): float;
}

class Rectangle implements CalculateSquare
{
    private $x;
    private $y;

    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }

    public function calculateSquare(): float
    {
        return $this->x * $this->y;
    }
}

class Square implements CalculateSquare
{
    private $x;

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

    public function calculateSquare(): float
    {
        return $this->x ** 2;
    }
}

class Circle
{
    const PI = 3.1416;
    private $r;

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

    public function calculateSquare(): float
    {
        return self::PI * ($this->r ** 2);
    }
}

$objects = [
    new Square(5),
    new Rectangle(2, 4),
    new Circle(2.5)
];

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
        echo ' Это объект класса:'.get_class($object);
        echo '<br>';
    }
    else
        {
            echo 'Объект класса '.get_class($object).' не реализует интерфейс CalculateSquare';
        }
}
ivashkevich 23.06.2019 в 17:51

Отлично. Только отступы после else поехали. Для формирования кода используйте кнопку в редакторе комментариев, слева вверху.

Moskva 03.07.2019 в 11:41
<?php

interface CalculateSquare{
    public function calculateSquare():float;
}

class Rectangle{
    private $x;
    private $y;

    public function __construct(float $x, float $y)
    {
        $this->x= $x;
        $this->y= $y;
    }

    public function calculateSquare():float{
        return $this->x*$this->y;
    }
}

class Square implements CalculateSquare {
    private $x;

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

    public function calculateSquare():float{
        return $this->x ** 2;
    }
}

class Circle implements CalculateSquare {
    const PI = 3.1416;
    private $r;

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

    public function calculateSquare():float{//Для того, чтобы обратиться к константе, нужно использовать конструкцию self::ИМЯ_КОНСТАНТЫ,
        return self::PI * ($this->r ** 2);//или ИмяКласса::ИМЯ_КОНСТАНТЫ. Ключевое слово self – это обращение к текущему классу
    }
}

$objects = [
    new Square(5),
    new Rectangle(2,4),
    new Circle(5)
];

foreach ($objects as $object){
    if ($object instanceof  CalculateSquare){
        echo 'Объект реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare() . '. Класс ' . get_class($object);
        echo '<br>';
    }
    else {
       echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculateSquare.';
        echo '<br>';
    }
}
ivashkevich 03.07.2019 в 11:56

Отлично!

Bizzzon 18.07.2019 в 22:51
<?php

interface CalculateSquare
{
    public function calculateSquare(): float;
}

class Circle implements CalculateSquare
{
    const PI = 3.1416;

    private $r;

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

    public function calculateSquare(): float
    {
        return self::PI * ($this->r ** 2);
    }
}

class Rectangle implements CalculateSquare
{
    private $x;
    private $y;
    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }

    public function calculateSquare(): float
    {
        return $this->x * $this->y;
    }

}

class Square implements CalculateSquare
{
    private $x;

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

    public function calculateSquare(): float
    {
        return $this->x ** 2;
    }
}

$objects = [
    new Square(5),
    new Rectangle(2, 4),
    new Circle(5)
];

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare() . ' ' .  'Класс объекта:' . ' ' .get_class($object);
        echo '<br>';
    } else {
       echo 'Объект класса' .get_class($object) . ' ' . 'не реализует интерфейс CalculateSquare.';
    }
}
ivashkevich 19.07.2019 в 07:00

Супер!

Metey 19.07.2019 в 10:55
<?php

interface CalculateSquare
{
    public function calculateSquare(): float;
}

class Circle implements CalculateSquare
{
    const PI = 3.1416;

    private $r;

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

    public function calculateSquare(): float
    {
        return self::PI * ($this->r ** 2);
    }
}

class Rectangle
{
    private $x;
    private $y;

    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }

    public function calculateSquare(): float
    {
        return $this->x * $this->y;
    }
}

class Square implements CalculateSquare
{
    private $x;

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

    public function calculateSquare(): float
    {
        return $this->x ** 2;
    }
}

$objects = [
    new Square(5),
    new Rectangle(2, 4),
    new Circle(5)
];

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект реализует интерфейс CalculateSquare. Площадь: ' . 
        $object->calculateSquare() . ' и принадлежит к классу ' . get_class ($object);
        echo '<br>';
    }
    else {
        echo 'Объект класса ' . get_class ($object) . ' не реализует интерфейс CalculateSquare';
        echo '<br>'; 
    }
}
ivashkevich 20.07.2019 в 14:37

Отлично

webdev 20.07.2019 в 15:39

ДЗ

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект реализует интерфейс CalculateSquare класса '.get_class($object).' Площадь: ' . $object->calculateSquare();
        echo '<br>';
    }else{
        echo 'Объект класса '.get_class($object).' не реализует интерфейс CalculateSquare.';
    }
}
ivashkevich 21.07.2019 в 05:13

Отлично

Reechniy 21.07.2019 в 16:08
<?php

interface CalculateSquare
{
    public function calculateSquare(): float;
}

class Rectangle implements CalculateSquare
{
    private $x;
    private $y;

    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }

    public function calculateSquare(): float
    {
        return $this->x*$this->y;
    }
}

class  Square implements CalculateSquare
{
    private $x;

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

    public function calculateSquare(): float
    {
        return $this->x ** 2;
    }
}

class Circle implements CalculateSquare
{
    const PI = 3.1416;

    private $r;

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

    public function calculateSquare(): float
    {
             return self::PI * ($this->r ** 2);
    }
}

$objects = [
    new Square(5),
    new Rectangle(2, 4),
    new Circle(5)
];
foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект класса ' . get_class($object) . ' реализуется интерфейс CalculationSquare. Площадь: ' . $object->calculateSquare();
        echo '<br>';
    }else {
        echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculationSquare';
        echo '<br>';
    }
    }
ivashkevich 21.07.2019 в 19:16

Отлично

Blook 31.07.2019 в 22:53
$objects = [
    new Square(5),
    new Rectangle(2, 4),
    new Circle(5)
];

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект класса ' . get_class($object) .', реализующего интерфейс Calculate Square. Площадь:' . $object->calculateSquare();
        echo '<br>';
    } else  {
        echo 'Класс ' . get_class($object) . ' не реализует интерфейс CalculateSquare';
        echo '<br>';
    }
}
ivashkevich 01.08.2019 в 04:54

Отлично!

gruimed 05.08.2019 в 14:58
<?php

class Rectangle implements CalculateSquare
{
    private $x;
    private $y;

    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }

    public function calculateSquare(): float
    {
        return $this->x * $this->y;
    }
}

class Square implements CalculateSquare
{
    private $x;

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

    public function calculateSquare(): float
    {
        return $this->x ** 2;
    }
}

class Circle
{
    const PI = 3.1416;

    private $r;

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

    public function calculateSquare(): float
    {
        return self::PI * ($this->r ** 2);
    }
}

$circle1 = new Circle(2.5);
//var_dump($circle1 instanceof CalculateSquare);

interface CalculateSquare
{
    public function calculateSquare(): float;
}

$objects = [
    new Square(5),
    new Rectangle(2, 4),
    new Circle(5)
];

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Object of class ' . get_class($object) . ' implements an Interface. Square is: ' . $object->calculateSquare() . "\n";
    } else {
        echo 'Object of class ' . get_class($object). ' doesn\'t implements an Interface. Square is: ' . $object->calculateSquare() . "\n";
    }
}

Есть несколько вопросов:
1) почему я не могу использовать для вывода конструкцию

echo "Object of class {get_class($object)} implements an Interface. Square is: {$object->calculateSquare()} \n";

Выдает ошибку

Recoverable fatal error: Object of class Square could not be converted to string 

при этом при проверке

echo gettype(get_class($object));

выдает string

2) При создании массива $objects используем []. Я чаще наблюдала массивы в (), и PHPStorm тоже создает с круглыми скобками. В чем разница и какие аргументы есть при выборе?

ivashkevich 06.08.2019 в 20:10
  1. {get_class($object)} - так внутри строки не распарсится. Нельзя функции прямо там вызывать. Парится переменная $object, которую к строке привести не получается, вот и ругается. А вообще не надо использовать такой способ. Или используйте конкатенацию строк с кодом, либо используйте sprintf.
  2. Современный стандарт PSR диктует правило короткого синтаксиса
    $a = [1, 2];

    Вместо

    $a = array(1, 2);

    Второй вариант считается устаревшим.

gruimed 07.08.2019 в 13:11

Поняла, спасибо!

fosfat 08.08.2019 в 21:00

У вас опечатка в разделе "Интерфейсы":

"Окей, разобрались с константами и имеем в итоге 3 объекта, описывающих геометрические фигуры и реализацию для вычисления их площадей."

Вместо "3 объекта" - "3 класса".

ivashkevich 10.08.2019 в 06:47

Отличное замечание, спасибо!

khuurak 16.08.2019 в 17:15

$objects = [
    new Rectangle(2, 5),
    new Square(3),
    new Circle(4)
];

foreach($objects as $object) {
    if($object instanceof CalculateSquare) {
        echo 'Объект реализует интерфейс CalculateSquare в классе '.get_class($object).'. Площадь: '.$object->calculateSquare();
        echo '<br>';
    } else {
        echo 'Объект класса '.get_class($object).' не реализует интерфейс CalculateSquare.';
        echo '<br>';
    }
}
ivashkevich 16.08.2019 в 20:38

Отлично

Pro100Bah 02.09.2019 в 12:32
interface CalculateSquare
{
    public function calculateSquare(): float ;
}

class Rectangle
{
    private $x;
    private $y;

    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }

    public function calculateSquare(): float
    {
        return $this->x * $this->y;
    }
}

class Square implements CalculateSquare
{
    private $x;

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

    public function calculateSquare(): float
    {
        return $this->x ** 2;
    }
}

class Circle implements CalculateSquare
{
    const PI =  3.1416;

    private $r;

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

    public function calculateSquare(): float
    {
        return self::PI * ($this->r ** 2);
    }
}

$objects = [
new Square(5),
    new Rectangle(2, 4),
    new Circle(5)
    ];

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
        echo '<br>';
    } else {                                                                                    //homework4
        echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculateSquare.'; //get_class — Возвращает имя класса, к которому принадлежит объект
        echo '<br>';                                                                            //homework4
    }
}
ivashkevich 02.09.2019 в 18:40

Отлично

Dreft 04.09.2019 в 21:09
foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare() . ' Это объект класса ' . get_class($object); "<br>";
        echo '<br>';
    } else {
        echo 'Объект класса ' . get_class($object) . ' не реализует объект CalculateSquare' . '<br>';
    }
}
ivashkevich 04.09.2019 в 21:27

Отлично

XXX 23.09.2019 в 15:58
foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект реализует интерфейс CalculateSquare и имеет класс: ' . get_class($object) . '.' . ' Площадь: ' . $object->calculateSquare();
        echo '<br>';
    } else {
        echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculateSquare.';
        echo '<br>';
    }
}
ivashkevich 23.09.2019 в 20:48

имеет класс

является объектом класса

В остальном - отлично

[email protected] 29.09.2019 в 21:40
<?php

class Rectangle
{
    private $x;
    private $y;

    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }

    public function calculateSquare(): float
    {
        return $this->x * $this->y;
    }
}

class Square implements CalculateSquare
{
    private $x;

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

    public function calculateSquare(): float
    {
        return $this->x ** 2;
    }
}

class Circle implements CalculateSquare
{
    private $r;

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

    public function calculateSquare(): float
    {
        $pi = 3.1416;
        return $pi * ($this->r ** 2);
    }
}

interface CalculateSquare
{
    public function calculateSquare(): float;
}
$objects = [
    new Square(5),
    new Rectangle(2, 4),
    new Circle(5)
];

foreach ($objects as $object) {
    $name = get_class($object);
    if ($object instanceof CalculateSquare) {
        echo 'Объект реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare() . ' Меня зовут ' . $name;
        echo '<br>';
    } else
        echo $name . ' не реализует интерфейс CalculateSquare' . '<br>';

}
ivashkevich 30.09.2019 в 00:38

Отлично

dliashchenko 09.10.2019 в 09:24
<?php
interface CalculateSquare
{
    public function calculateSquare(): float;
}

class Square implements CalculateSquare
{
    private $x;
    public function __construct(float $x)
    {
        $this->x = $x;
    }
    public function calculateSquare(): float
    {
        return $this->x ** 2;
    }
}

class Rectangle
{
    private $x;
    private $y;
    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }
    public function calculateSquare():float
    {
        return $this->x * $this->y;
    }
}

class Circle implements CalculateSquare
{
    const PI = 3.1416;
    private $r;
    public function __construct(float $r)
    {
        $this->r = $r;
    }
    public function calculateSquare():float
    {
        return self::PI ** ($this->r ** 2);
    }
}

$objects = [
    new Circle(3),
    new Rectangle(2.3, 5.3),
    new Square(4.5)
];
foreach($objects as $object){
    if ($object instanceof CalculateSquare){
        echo 'Объект класса ' . get_class($object) . ' реализует интерфейс CalculateSquare' . '<br/>';
        echo 'Объект реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare() . '<br/>' ;
        echo '<br/>';

    } else{
        echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculateSquare' . '<br/>';
        echo '<br/>';
    }
}
ivashkevich 09.10.2019 в 19:24

Отлично

Evilinside 11.10.2019 в 16:59
<?php

interface CalculateSquare
{
    function calculateSquare(): float;
}

//Класс прямоугольник
class Rectangle implements CalculateSquare
{
    private $x;
    private $y;

    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }

    function calculateSquare(): float
    {
        return $this->x * $this->y;
    }
}

//Класс квадрат
class Square implements CalculateSquare
{
    private $x;

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

    public function calculateSquare(): float
    {
        return $this->x ** 2;
    }
}

//Класс круг
class Circle implements CalculateSquare
{
    const PI = 3.1416;
    private $r;

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

    public function calculateSquare(): float
    {
        return self::PI * ($this->r ** 2);
    }
}

//Создадим класс треугольник, который не реализует интерфейс CalculateSquare
class RightTriangle
{
    private $a;
    private $b;

    public function __construct(float $a, float $b)
    {
        $this->a = $a;
        $this->b = $b;
    }

    public function calculateSquare(): float
    {
        return ($this->a * $this->b)/2;
    }
}

$objects = [
    new Rectangle(3, 2),
    new Square(2),
    new Circle(5),
    new RightTriangle(2,3)
];
foreach ($objects as $object) {

    if ($object instanceof CalculateSquare) {
        echo "Объект " . get_class($object) . ' реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare() . "\n";

    } elseif ($object instanceof CalculateSquare == false) {
        echo "Объект класса " . get_class($object) . " не реализует интерфейс CalculateSquare.";

    }

}
ivashkevich 11.10.2019 в 21:19

Супер!

H3licoptero 27.10.2019 в 20:55
foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare() . '.' . ' Используется объект класса ' . get_class($object) . '.';
        echo '<br>';
    } else {
        echo 'Объект класса ' . get_class($object)  . ' не реализует интерфейс CalculateSquare.';
    }
}
ivashkevich 28.10.2019 в 09:31

Отлично

TheTigra 04.11.2019 в 17:01

Домашка:

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект реализует интерфейс CalculateSquare. Это объект класса '.get_class($object).' Площадь: ' . $object->calculateSquare();
        echo '<br>';
    } else {
        echo 'Объект класса '.get_class($object).' не реализует интерфейс CalculateSquare.';
    }
}
ivashkevich 04.11.2019 в 19:46

Отлично

andreskrip 21.12.2019 в 18:58
foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект класса ' . get_class($object) . ' реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
        echo '<br>';
    } else {
        echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculateSquare.';
        echo '<br>';
    }
}
ivashkevich 21.12.2019 в 20:19

Отлично

EugeneGrigoryev 20.01.2020 в 10:26

Домашка:

<?php
interface CalculateSquare
{
    public function calculateSquare(): float;
}

class Circle implements CalculateSquare
{
    const PI = 3.1416;

    private $r;

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

    public function calculateSquare(): float
    {
        return self::PI * ($this->r ** 2);
    }
}

class Rectangle
{
    private $x;
    private $y;

    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }

    public function calculateSquare(): float
    {
        return $this->x * $this->y;
    }
}

class Square implements CalculateSquare
{
    private $x;

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

    public function calculateSquare(): float
    {
        return $this->x ** 2;
    }
}

$objects = [
    new Square(5),
    new Rectangle(2, 4),
    new Circle(5)
];

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект класса ' . get_class($object) . ' реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
        echo '<br>';
    } else {
        echo 'Объект класса ' . get_class($object) . ' НЕ реализует интерфейс CalculateSquare.';
        echo '<br>';
    }
}
ivashkevich 20.01.2020 в 12:59

Отлично

YuraG 09.02.2020 в 10:53
Class Sphere
{
    const PI = 3.1416;

    private $r;

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

    public function calculateSquare(): float
    {
        return 4 * self:: PI * ($this->r ** 2);
    }
}
$objects = [
    $circle = new Circle(5),
    $rectangle = new Rectangle(2, 4),
    $square = new Square(5),
    $sphere = new Sphere(5)
];

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект ' . get_class($object) . ' реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
        echo '<br>';
    } else {
        echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
        echo '<br>';
    }
}
ivashkevich 12.02.2020 в 12:26

Супер!

kvakazuabr 10.02.2020 в 20:55
foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare() . '. Объект класса ' . get_class($object) . '.';
        echo '<br>';
    }
    else {
        echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculateSquare.';
        echo '<br>';
    }
}
ivashkevich 12.02.2020 в 13:04

Отлично

OneMoreTime 16.02.2020 в 12:58

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

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

ivashkevich 18.02.2020 в 18:16

Примеры будут в дальнейшем

ChelovekAndrey 02.03.2020 в 00:18
foreach ($objects as $object) {
    if($object instanceof CalculateSquare) {
        echo 'Объект реализует интерфейс CalculateSquare. Площадь ' . $object->calculateSquare() . ' и принадлежит к ' . get_class($object);
        echo '<br>';
    } else {
        echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculateSquare';
        echo '<br>';
    }
}
ivashkevich 05.03.2020 в 03:05

Отлично

Vilotu 21.03.2020 в 23:34
interface CalculateSquare
{
    public function calculateSquare(): float;
}

class Rectangle implements CalculateSquare
{
    private $x;
    private $y;

    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }

    public function calculateSquare(): float
    {
        return $this->x * $this->y;
    }
}

class Square implements CalculateSquare
{
    private $x;

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

    public function calculateSquare(): float
    {
        return $this->x ** 2;
    }
}

class Circle implements CalculateSquare
{
    const PI = 3.1416;

    private $r;

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

    public function calculateSquare(): float
    {
        $pi = 3.1416;
        return self::PI * ($this->r ** 2);
    }
}

$obgects = [
    new Square(5),
    new Rectangle(2,4),
    new Circle(5)
];

foreach ($obgects as $obgect) {
    if ($obgect instanceof CalculateSquare) {
        echo 'Обьект класса ' . get_class($obgect) . ' реализует интерфейс CalculateSquare. Площадь: ' . $obgect->calculateSquare();
        echo '<br>';
    } else {
        echo 'Объект класса ' . get_class($obgect) . 'не реализует интерфейс CalculateSquare';
    }
}
ivashkevich 22.03.2020 в 06:50

Отлично

webdev 23.03.2020 в 13:47

Очепятка :D
а также создадим у методы

ivashkevich 23.03.2020 в 14:17

Спасибо, исправил

Salexandr 31.03.2020 в 19:55
<?php
echo 'Интерфейсы <br>';

interface CalculateSquare
{
    public function calculateSquare(): float;
}

class Circle implements CalculateSquare
{
    const PI = 3.141592;
    private $r;

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

    public function calculateSquare(): float
    {
        return self::PI * ($this->r ** 2);
    }
}

class Rectangle
{
    private $x;
    private $y;

    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }

    public function calculateSquare(): float
    {
        return $this->x * $this->y;
    }
}

class Sqare implements CalculateSquare
{
    private $x;

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

    public function calculateSquare(): float
    {
        return $this->x ** 2;
    }
}

$objects = [
    new Circle(5),
    new Rectangle(2, 4),
    new Sqare(5)
];

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект ' . get_class($object) . ' реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
        echo '<br>';
    } else {
        echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculateSquare.';
        echo '<br>';
    }
}
ivashkevich 01.04.2020 в 04:37

Отлично!

Dimitry 02.04.2020 в 06:09
<?php

interface CalculateSquare
{
    public function calculateSquare(): float;
}

class Circle implements CalculateSquare
{
    const PI = 3.1416;

    private $r;

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

    public function calculateSquare(): float
    {
        return self::PI * ($this->r ** 2);
    }
}

class Rectangle
{
    private $x;
    private $y;

    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }

    public function calculateSquare(): float
    {
        return $this->x * $this->y;
    }
}

class Square implements CalculateSquare
{
    private $x;

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

    public function calculateSquare(): float
    {
        return $this->x ** 2;
    }
}

$objects = [
    new Square(5),
    new Rectangle(2, 4),
    new Circle(5)
];

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект класса '.get_class($object).' реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
        echo '<br>';
    }
    else{
        echo 'Объект класса '.get_class($object).' не реализует интерфейс CalculateSquare.';
        echo '<br>';
    }
}

Домашка

ivashkevich 02.04.2020 в 07:55

Супер!

Soib 02.04.2020 в 22:50
<?php

interface СalculateSquare
{
    public function calculateSquare(): float;
}

class Rectangle implements СalculateSquare
{
    private $x;
    private $y;

    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }

    public function calculateSquare(): float
    {
        return $this->x * $this->y;
    }
}

class Square implements СalculateSquare
{
    private $x;

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

    public function calculateSquare(): float
    {
        return $this->x ** 2;
    }
}

class Circle
{
    private $r;
    const PI = 3.1416;

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

    public function calculateSquare(): float
    {
        return self::PI * ($this->r ** 2);
    }
}

$obj = [
       new Rectangle(17,12),
       new Square(4),
       new Circle(10)
    ];

foreach ($obj as $item)
{
    $className = get_class($item);
    if ($item instanceof СalculateSquare)
    {
        echo "Объект клсаа $className реализует интерфейс CalculateSquare. Площадь: " . $item->calculateSquare() . "\n\r";
    }else
        echo "Объект клсаа $className не реализует интерфейс CalculateSquare.";
}
ivashkevich 03.04.2020 в 14:13

Отлично

leffo 05.04.2020 в 15:07

Здравствуйте, уважаемый Артём!
Сразу предупрежу, поднял homestead на vagrant,там внутри работает php v7.4:
vagrant@homestead:~$ php --version
PHP 7.4.4 (cli) (built: Mar 20 2020 13:47:45) ( NTS ),

поэтому у всех свойств классов указаны модификаторы типа.
Так будет правильнее!

<?php

interface CalculateSquare
{
    public function calculateSquare(): float;
}

class Circle implements CalculateSquare
{
    const PI = 3.1416;

    private float $r;

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

    public function calculateSquare(): float
    {
        return self::PI * ($this->r ** 2);
    }
}

class Rectangle
{
    private float $x;
    private float $y;

    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }

    public function calculateSquare(): float
    {
        return $this->x * $this->y;
    }
}

class Square implements CalculateSquare
{
    private float $x;

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

    public function calculateSquare(): float
    {
        return $this->x ** 2;
    }
}

$objects = [
    new Square(5),
    new Rectangle(2, 4),
    new Circle(5)
];

//var_dump($objects);
foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект класса ' . get_class($object) . ' реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
        echo '<br>';
    } else {
        echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculateSquare.';
        echo '<br>';
    }
}
ivashkevich 05.04.2020 в 19:25

Отлично! За типы свойств большой плюс! Нужно тоже доработать урок.

Dmitry.Dudin 06.04.2020 в 22:26
<?php

interface CalculateSquare
{
    public function calculateSquare():float;
}
class Circle implements CalculateSquare
{
    const PI = 3.1416;

       private $r;

       public function __construct(float $r)
       {
           $this->r=$r;
       }
       public function calculateSquare():float
       {
           return self::PI*($this->r**2);
       }

}
class Rentagle implements CalculateSquare
{
    private $x;
    private $y;

    public function __construct(float $x, float $y)
    {
        $this->x=$x;
        $this->y=$y;
    }
    public function calculateSquare():float
    {
        return $this->y*$this->y;
    }
}
class Square implements CalculateSquare
{
    private $x;

    public function __construct(float $x)
    {
        $this->x=$x;
    }
    public function calculateSquare():float
    {
        return $this->x **2;
    }
}

$objects= [
    new Square(5),
    new Rentagle(2,4),
    new Circle(5)
    ];

    foreach($objects as $object){
        if($object instanceof CalculateSquare){
            echo 'Объект реализует интерфейс CalculateSquare. Площадь: '.$object->calculateSquare();
            echo ' Относится к:'.get_class($object);
            echo '</br>';
        }

    }
ivashkevich 07.04.2020 в 09:26

Отлично!

Alexann 08.04.2020 в 16:05
...
foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект класса: ' . get_class($object) . ' реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
        echo PHP_EOL;
    } else {
        echo 'Объект класса: ' . get_class($object) . ' не реализует интерфейс CalculateSquare.  Площадь: ' . $object->calculateSquare() . PHP_EOL;
    }
}
ivashkevich 08.04.2020 в 19:15

Отлично

[email protected] 11.04.2020 в 10:58
$objects = [
  new Rectangle(3, 2),
  new Circle(5),
  new Square(4)
];

foreach($objects as $object) {
  if($object instanceof CalculateSquare) {
    echo 'Вот вам площадь объекта класса ' . get_class($object) . ': ' . $object->calculateSquare() . '<br />';
  } else {
    echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculateSquare' . '<br />';
  }
}
ivashkevich 11.04.2020 в 21:25

Отлично

Fill 15.04.2020 в 18:40
<?php
//...

class HomeWork
{

}

$objects = [
    new Square(5),
    new Rectangle(2, 4),
    new Circle(5),
    new HomeWork()
];

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект кдасса ' . get_class($object) . ' реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
        echo '<br>';
    } else {
        echo 'Объект класса ' . strtoupper(get_class($object)) . ' не реализует интерфейс CalculateSquare.';
        echo '<br>';
    }
}
ivashkevich 16.04.2020 в 06:42

Отлично)

Myakish 17.04.2020 в 12:01

Интерфейсы для склеротиков? Ведь если убрать проверку на интерфейс из цикла, то все площади посчитаются исправно. Вне зависимости продекларирована приверженность к интерфейсу или нет.
P.S. это конечно шутка юмора - видимо в больших или огромных проектах интерфейсы возможно полезны для унификации и стандартизации. Но тогда должны быть подходы (способы), строго декларирующие использование и сами решения?

[email protected] 17.04.2020 в 18:52

Возможно это развитие идеи абстрактных классов, ведь в PHP нельзя наследоваться от нескольких классов сразу, как в других языках, а указать несколько интерфейсов можно.

ivashkevich 17.04.2020 в 20:29

В том числе. Но в первую очередь - это гарантия реализации методов.

Timurik 20.04.2020 в 10:33

вот что получилось:

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект класса ' . get_class($object) . ' реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
        echo '<br>';
    } else {
        echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculateSquare';
        echo '<br>';
    }
}
ivashkevich 20.04.2020 в 17:52

Отлично

studentDev 24.04.2020 в 14:04

HomeWork:

foreach($objects as $object) {
         if($object instanceof CalculateSquare) {
             echo 'Объект реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare() . ' - это объект класса ' . get_class($object);
             echo '</br>';
         } else {
             echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculateSquary!';
             echo '</br>';
         }
    }

RESULT:
Объект реализует интерфейс CalculateSquare. Площадь: 9 - это объект класса Square
Объект класса Rectangle не реализует интерфейс CalculateSquary!
Объект реализует интерфейс CalculateSquare. Площадь: 113.0976 - это объект класса Circle

ivashkevich 24.04.2020 в 14:32

Ок. Зачем только два раза код написали?)

[email protected] 27.04.2020 в 22:14
<?php
    interface CalculateSquare
    {
        public function calculateSquare():float;
    }
    class Rectangle
    {
        private $x;
        private $y;
        public function __construct(float $x, float $y)
        {
            $this->x = $x;
            $this->y = $y;
        }
        public function calculateSquare():float
        {
            return $this -> x * $this -> y;
        }
    }
    class Square implements CalculateSquare
    {
        private $x;
        public function __construct(float $x)
        {
            $this->x = $x;
        }
        public function calculateSquare():float
        {
            return $this->x ** 2;
        }
    }
    class Circle implements CalculateSquare
    {
        const PI = 3.1416;
        private $r;
        public function __construct(float $r)
        {
            $this->r = $r;
        }
        public function calculateSquare():float
        {
            return self::PI * ($this->r ** 2);
        }
    }
    $objects = [
        new Square(5),
        new Rectangle(2,4),
        new Circle(5)
    ];
    foreach ($objects as $object) {
       if ($object instanceof CalculateSquare){
           echo 'Этот объект реализует интерфеёс Calculate. Объект класса '.get_class($object).'. Площадь: '. $object->calculateSquare().'.';
           echo '<br/>';
       } else {
            echo 'Объект класса '.get_class($object).' не реализует интерфейс CalculateSquare.';
            echo '<br/>';
       }
    }

get_class() - возвращает название класса, экземпляром которого является объект. Если переменная не ссылается на объект get_class() возвращает false. Начиная с версии PHP 7.2.0 объекту запрещено явно передавать значение NULL, это приведёт к ошибке уровня E_WARNING.
В ходе выполнения домашнего задания PHPStorm пожаловался на одну ошибку: Constant 'PI' not found in
Я так и не понял, как её решить, а так всё работает.

ivashkevich 28.04.2020 в 06:17

Всё отлично. Шторм скорее всего малость поехал крышей. Попробуй перезапустить его.

[email protected] 28.04.2020 в 10:04

Хорошо
Опять же спасибо вашим урокам! Если бы не вы, пользовался бы я устаревшим объявлением массива

titelivus 03.05.2020 в 19:05
<?php

interface CalculateSquare
{
    public function calculateSquare(): float;
}

class Circle implements CalculateSquare
{
    const PI = 3.1416;

    private $r;

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

    public function calculateSquare(): float
    {
        return self::PI * ($this->r ** 2);
    }
}

class Rectangle
{
    private $x;
    private $y;

    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }

    public function calculateSquare(): float
    {
        return $this->x * $this->y;
    }
}

class Square implements CalculateSquare
{
    private $x;

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

    public function calculateSquare(): float
    {
        return $this->x ** 2;
    }
}

$objects = [
    new Square(5),
    new Rectangle(2, 4),
    new Circle(5)
];

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект класса '. get_class($object) . ' реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
        echo '<br>';
    } else {
        echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculateSquare.';
        echo '<br>';
    }
}
ivashkevich 03.05.2020 в 21:04

Отлично

[email protected] 08.05.2020 в 19:43
<?php
class Rectangle
{
    private $x;
    private $y;

    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }
    public function calculateSquare(): float
    {
        return $this->x * $this->y;
    }
}

class Square implements CalculateSquare
{
    private $x;

    public function __construct(float $x)
    {
        $this->x = $x;
    }
    public function calculateSquare(): float
    {
        return $this->x ** 2;
    }
}

class Circle implements CalculateSquare
{
    const PI = 3.1416;
    private $r;

    public function __construct(float $r)
    {
        $this->r = $r;
    }
    public function calculateSquare(): float
    {
        return self::PI * ($this->r ** 2);
    }
}

interface CalculateSquare
{
    public function calculateSquare(): float;
}

$objects = [
    new Square(5),
    new Rectangle(2, 4),
    new Circle(5)
];
foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare() . '. ' . 'Объект принадлежит классу ' . get_class($object) . '.' . '<br>';

    } else {
        echo 'Объект класса ' . get_class($object) . ' ' . 'не реализует интерфейс CalculateSquare.' . '<br>';
    }
}
ivashkevich 08.05.2020 в 20:33

Отлично

[email protected] 16.05.2020 в 13:18

внесенные изменения

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
        echo '<br>';
        echo 'Это объект класса '. get_class($object).  '<br>';
    } else{
        echo 'Объект класса '. get_class($object).' не реализует интерфейс CalculateSquare'.'<br>';
    }
}

почему в примерах документации используются запятые, а не точка (echo "Меня зовут " , get_class($this) , "\n";)

ivashkevich 16.05.2020 в 14:07

Через точку происходит конкатенация строки. А конструкция echo поддерживает вывод значений, перечисленных через запятую

n.yurasheva 19.05.2020 в 00:20
<?php

interface CalculateSquare
{
    public function calculateSquare(): float;
}

class Circle implements CalculateSquare
{
    const PI = 3.1416;

    private $r;

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

    public function calculateSquare(): float
    {
        return self::PI * ($this->r ** 2);
    }
}

class Rectangle
{
    private $x;
    private $y;

    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }

    public function calculateSquare(): float
    {
        return $this->x * $this->y;
    }
}

class Square implements CalculateSquare
{
    private $x;

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

    public function calculateSquare(): float
    {
        return $this->x ** 2;
    }
}

$objects = [
    new Square(5),
    new Rectangle(2, 4),
    new Circle(5)
];

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект класса '. get_class ($object).'. Объект реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare().'<br>';
    } else {
        echo 'Объект класса '. get_class ($object).'. Не реализует интерфейс CalculateSquare'.'<br>';
    }
}
ivashkevich 19.05.2020 в 06:12

Супер!

Sviatoslav 20.05.2020 в 20:46

Мой пример

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare() . '. Этот объект класса: ' . get_class($object);
        echo '<br>';
    } else {
        echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculateSquare.';
        echo '<br>';
    }
}
ivashkevich 21.05.2020 в 07:09

Отлично

NR 25.05.2020 в 01:21
$objects = [
    new Square(3),
    new Rectangle(2, 6),
    new Circle(3)
];

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект ' . get_class($object) . ' реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
    }
   else {
    echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculateSquare.';
    }
    echo '<br>';
}
ivashkevich 25.05.2020 в 07:44

Отлично

IePyton 27.05.2020 в 15:36
<?php

interface CalculateSquare
{
    public function calculateSquare(): float;
}

class Rectangle
{
    private $x;
    private $y;

    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }

    public function calculateSquare(): float
    {
        return $this->x * $this->y;
    }
}

class Square implements CalculateSquare
{
    private $x;

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

    public function calculateSquare(): float
    {
        return $this->x ** 2;
    }
}

class Circle implements CalculateSquare
{
    const PI = 3.1416;
    private $r;

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

    public function calculateSquare(): float
    {

        return self::PI * ($this->r ** 2);
    }
}

$objects = [
    new Square(5),
    new Rectangle(4, 5),
    new Circle(5)
];

var_dump($objects);

foreach ($objects as $object){
    if ($object instanceof CalculateSquare){
        echo 'Объект реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
        echo '<br>';
        echo 'Это объект класса: ' . get_class($object);
        echo '<br>';

    } else {
        echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculateSquare.';
        echo '<br>';
    }

}
ivashkevich 27.05.2020 в 18:05

Отлично

[email protected] 06.06.2020 в 18:56
get_class ([ object $object ] ) : string
/*Возвращает имя класса, экземпляром которого является объект object.*/

Выполнила следующие пункты упражнения:

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) 
    {
        echo 'Объект реализует интерфейс CalculateSquare. 
        Площадь: ' . $object->calculateSquare() .
        '. Объект относится к классу: ' . get_class($object) ;
        echo '<br>';
    }
    else 
    {
        echo 'Объект класса '. get_class($object) .
        ' не реализует интерфейс CalculateSquare.';
    }
}

Если убрать из класса Circle упоминание о том, что он реализует этот интерфейс, то вывод следующий:
Объект реализует интерфейс CalculateSquare. Площадь: 25. Объект относится к классу: Square
Объект реализует интерфейс CalculateSquare. Площадь: 8. Объект относится к классу: Rectangle
Объект класса Circle не реализует интерфейс CalculateSquare.

ivashkevich 07.06.2020 в 13:00

Ок. А что с форматированием вдруг стало? Делайте отступы и переносы как в уроках. Для этого в шторме можно нажать Ctrl+Alt+L

superbobr 11.06.2020 в 16:34
<?php

interface CalculateSquare
{
    public function calculateSquare(): float;
}

class Circle implements CalculateSquare
{
    const PI = 3.1416;

    private $r;

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

    public function calculateSquare(): float
    {
        return self::PI * ($this->r ** 2);
    }
}

class Rectangle
{
    private $x;
    private $y;

    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }

    public function calculateSquare(): float
    {
        return $this->x * $this->y;
    }
}

class Square implements CalculateSquare
{
    private $x;

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

    public function calculateSquare(): float
    {
        return $this->x ** 2;
    }
}

$objects = [
    new Square(5),
    new Rectangle(2, 4),
    new Circle(5)
];

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект принадлежит классу ' . get_class($object) . '.' . ' Объект реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
        echo '<br>';
    } else {
        echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculateSquare.';
        echo '<br>';
    }
}
ivashkevich 11.06.2020 в 20:32

Отлично

[email protected] 27.06.2020 в 12:25

Спасибо за урок!

foreach ($objects as $object){
    if($object instanceof CalculateSquare){
        echo 'Объект реализует метод CalculateSquare и его площадь равна: ' . $object->calculateSquare();
        echo '<br>';
        echo 'А, и еще он принадлежит к классу ' . get_class($object) . '.';
        echo '<br>';
    }
    else{
        ?>
<p style="color: red">Объект класса  <?= get_class($object)?>   не реализует интерфейс CalculateSquare.</p>
        <?php
    }
}
ivashkevich 27.06.2020 в 16:47

Отлично

[email protected] 30.06.2020 в 11:55

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

Или пример не подходящий или же я ничего не понял.

ivashkevich 01.07.2020 в 18:15

Пример учебный, просто чтобы показать как интерфейсы работают. Практическое применение на более подходящих примерах будет рассмотрено далее по курсу.

Hellbound 14.07.2020 в 02:13
<?php

interface CalculateSquare
{
    public function calculateSquare(): float;
}

class Circle implements CalculateSquare
{
    const PI = 3.1416;

    private $r;

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

    public function calculateSquare(): float
    {
        return self::PI * ($this->r ** 2);
    }
}

class Rectangle
{
    private $x;
    private $y;

    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }

    public function calculateSquare(): float
    {
        return $this->x * $this->y;
    }
}

class Square implements CalculateSquare
{
    private $x;

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

    public function calculateSquare(): float
    {
        return $this->x ** 2;
    }
}

$objects = [
    new Square(5),
    new Rectangle(2, 4),
    new Circle(5)
];

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект реализует интерфейс CalculateSquare. ';
        echo 'Класс объекта: ' . get_class($object);
        echo '. Площадь: ' . $object->calculateSquare();
        echo '<br>';
    } elseif (($object instanceof CalculateSquare ) != true) {
        echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculateSquare';
        echo '<br>';
    }
}
ivashkevich 14.07.2020 в 06:53
    } elseif (($object instanceof CalculateSquare ) != true) {

Во-первых, подобное условие стоит записывать как

    } elseif (!$object instanceof CalculateSquare) {

Ну а во-вторых, тут будет достаточно простого else без каких-либо дополнительных условий.

VitaliyB 27.07.2020 в 16:06
<?php

interface CalculateSquare
{
    public function calculateSquare(): float;
}

class Rectangle implements CalculateSquare
{
    private $x;
    private $y;

    public function __construct(float $x, float $y)
    {

        $this->x = $x;
        $this->y = $y;
    }

    public function calculateSquare(): float
    {
        return $this->x * $this->y;
    }
}

class Square implements CalculateSquare
{
    private $x;

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

    public function calculateSquare(): float
    {

        return $this->x ** 2;
    }
}

class Circle implements CalculateSquare
{
    const PI = 3.1416;
    private $r;

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

    public function calculateSquare(): float
    {

        $pi = 3.1416;
        return $pi * ($this->r ** 2);
    }
}

$objects = [
    new Square(5),
    new Rectangle(2, 4),
    new Circle(5)
];

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект реализует интерфейс CalculateSquare.' . 'Площадь: ' . $object->calculateSquare() . ' Он ' . get_class($object) . ' класса', '<br>';
    }
}
ivashkevich 27.07.2020 в 18:49

Красота!

oleK1 29.07.2020 в 02:00
<?php

interface calculateSquare
{
    public function calculateSquare(): float;
}

interface calculateSquare1
{
    public function calculateSquare1(): float;
}
class Pram implements calculateSquare
{
    private $x;
    private $y;
    private $name;

    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;

    }

    /**
     * @param string $name
     */
    public function setClassName(): string
    {
        return $this->name = get_class($name);
    }

    public function calculateSquare(): float
    {
        return $this->x * $this->y;
    }
}

class Kwadrat implements calculateSquare
{
    private $x;

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

    public function calculateSquare():float
    {
        return $this->x**2;
    }
}

class Krug implements calculateSquare
{
    const PI = 3.1416;

    private $r;

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

    public function calculateSquare(): float
    {
        return self::PI * ($this->r**2);
    }
}

$object = [
    new Pram(2,4),
    new Krug(5),
    new Kwadrat(5)
];

$x = new Kwadrat(12);
foreach ($object as $i)
{
    if($i instanceof  calculateSquare)
    {
        echo "Realizuet interface calculateSquare. Ploszad ".get_class($i)." = ". $i->calculateSquare() . "<hr>";
    }
}
echo "<hr>".$x->calculateSquare()."-".get_class($x)."<hr>";
$x = new Pram(13,13);
echo $x->setClassName();

Все правильно?

ivashkevich 29.07.2020 в 17:50

имена классов и интерфейсов пишутся с большой буквы

        $this->y = $y;

    }

Лишний перенос строки

interface calculateSquare1
{
    public function calculateSquare1(): float;
}

это зачем?

$object = [

Объектов несколько, поэтому называть нужно $objects.

Проблема с форматированием. Делайте отступы и переносы как в уроках. Для этого в шторме можно нажать Ctrl+Alt+L

[email protected] 12.08.2020 в 01:59

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

Замечание: Начиная с PHP 7.2.0, явная передача NULL в object запрещена. Параметр все еще опциональный и вызов get_class() без этого параметра внутри класса будет работать, но явная передача NULL теперь приведет к ошибке уровня E_WARNING.

Куда и какой параметр и для чего совать?

Вот домашка:

<?php

interface CalculateSquare
{
  public function getName(): string;
  public function calculateSquare(): float;
}

class Rectangle implements CalculateSquare
{
  private $x;
  private $y;
  private $name;

  public function __construct(float $x, float $y, string $name)
  {
    $this->x = $x;
    $this->y = $y;
    $this->name = $name;
  }
  public function calculateSquare() : float
  {
    return $this->x * $this->y;
  }

  public function getName(): string
  {
    return $this->name;
  }
}

class Square implements CalculateSquare
{
  private $x;
  private $name;

  public function __construct(float $x, string $name)
  {
    $this->x = $x;
    $this->name = $name;
  }
  public function calculateSquare(): float
  {
    return $this->x ** 2;
  }
  public function getName(): string
  {
    return $this->name;
  }
}

class Circle
{
  const PI = 3.1416;
  private $r;
  private $name;

  public function __construct(float $r, string $name)
  {
    $this->r = $r;
    $this->name = $name;
  }
  public function calculateSquare(): float
  {
    return self::PI * ($this->r ** 2);
  }
  public function getName(): string
  {
    return $this->name;
  }
}

//$round1 = new Circle(3);
$square1 = new Square(6, 'Квадрат');
$rectangle1 = new Rectangle(4, 3, 'Прямоугольник');

$objects = [
  new Rectangle(5, 4, 'Прямоугольник'),
  new Square(6, 'Квадрат'),
  new Circle(7, 'Круг')
];

foreach($objects as $object) {
  if ($object instanceof CalculateSquare) {
    echo "Объект '" . $object->getName() . '\', класса (' . get_class($object) . ") реализует интерфейс CalculateSquare. \nПлощадь: " . $object->CalculateSquare() . "\n";
  } else {
    echo 'Безымянный объект принадлежит классу ' . get_class($object) . ', и интерфейс CalculateSquad не реализует, мать его так!';
  }
  echo "\n";
}

echo var_dump(get_class($rectangle1));
echo var_dump(get_class($square1));
ivashkevich 12.08.2020 в 09:15

Я не понял вашего вопроса. Можете пример скинуть?

По домашке всё отлично кроме вот этой формулировки: "Безымянный объект" - что это вообще такое?

[email protected] 12.08.2020 в 22:59

По поводу вопроса - это из документации на php.net по get_class. Как я понял, в новом пхп get_class не будет выдавать значения, если его не поместить описания внутрь класса

По поводу задания: "Безымянный объект" - это пришлось написать, так как я попробовал в интерфейс положить 2 функции, одна из которых говорит, о каком объекте идёт речь, когда считается площадь. Но, так как в последнем классе, согласно заданию, я отключил реализацию интерфейса, то и представиться этот объект не мог, поэтому он "безымянный", но имеет называние класса)

ivashkevich 13.08.2020 в 16:33

Теперь понял)

get_class не будет работать, если вместо объекта передать туда null

Ysup 29.08.2020 в 23:04

Ребят, объясните что здесь не так:
class Circle {
private $r;

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

public function calculateSquare(): float {
    $pi = 3.1416;
    return $pi * ($this->r ** 2);
}

}

$circle = new Circle(2.5);

//Проверяем, является ли объект $circle экземпляром класса Circle:
var_dump($circle instanceof Circle); // true

//Создали интерфейс:
interface CalculateSquare {
public function calculateSquare(): float;
}
echo '<br>';

//Проверяем, является ли $circle объектом, класс которого
//реализует интерфейс CalculateSquare:
var_dump($circle instanceof CalculateSquare); // false
Здесь выдает false, а должен быть true.

Или я не прав.

ivashkevich 31.08.2020 в 08:24

Оформляйте код (в редакторе комментариев самая первая кнопка).
Нажмите на карандашик и поправьте, пожалуйста. А потом ответьте мне на этот комментарий. Проверю после этого.

[email protected] 09.11.2020 в 20:30

foreach ($objects as $object) {
if ($object instanceof CalculateSquare) {
echo 'Объект класса ' . get_class($object) . ' реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
echo '<br>';
}else echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare(); echo '<br>';
}

ivashkevich 10.11.2020 в 19:16

Нужно оформить код в комментарии (в редакторе комментариев самая первая кнопка).
Нажмите на карандашик и поправьте ваш комментарий, пожалуйста. А потом ответьте мне на этот комментарий. После этого проверю вашу домашнюю работу и отвечу на вопросы.

[email protected] 09.11.2020 в 20:31
<?php

interface CalculateSquare
{
    public function calculateSquare(): float;

}

class Circle implements CalculateSquare
{
    const PI = 3.1416;

    private $r;

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

    public function calculateSquare(): float
    {
        return self::PI * ($this->r ** 2);
    }
}

class Rectangle
{
    private $x;
    private $y;

    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }

    public function calculateSquare(): float
    {
        return $this->x * $this->y;
    }
}

class Square implements CalculateSquare
{
    private $x;

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

    public function calculateSquare(): float
    {
        return $this->x ** 2;

    }

}

$objects = [
    new Square(5),
    new Rectangle(2, 4),
    new Circle(5)
];

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект класса ' . get_class($object) .  ' реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
        echo '<br>';
    }else echo 'Объект класса  ' . get_class($object) .  '  не реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare(); echo '<br>';
}
ivashkevich 10.11.2020 в 19:17

Всегда используйте фигурные скобки для блоков if-else.

Проблема с форматированием. Делайте отступы и переносы как в уроках. Для этого в шторме можно нажать Ctrl+Alt+L

С логикой всё ок

[email protected] 11.11.2020 в 00:37
if ($object instanceof CalculateSquare) { //Срабатывает проверка: Теперь мы перед тем как попросить какой-либо объект посчитать свою площадь, можем проверить, есть ли у него такой метод, то есть, реализует ли он соответствующий интерфейс. Также можно проверять на класс SquareFigure и так далее
        echo  'Это объект '. get_class($object) . ' класса. '.'Объект реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
        echo '<br>';
    } else {
        echo 'Объект класса ' . get_class($object) . '  не реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
        echo '<br>';
    }
ivashkevich 13.11.2020 в 02:26

Отлично

pixel 17.11.2020 в 20:21
<?php
    require_once __DIR__ . '/Rectangle.php';
    require_once __DIR__ . '/Circle.php';
    require_once __DIR__ . '/Square.php';

    $objects = [
        new Square(5),
        new Rectangle(2, 4),
        new Circle(5)
    ];

    foreach ($objects as $object) {
        if ($object instanceof CalculateSquare) {
            echo 'Объект реализует интерфейс CalculateSquare. Площадь: '
                . $object->calculateSquare()
                . ' Мой класс - ' . get_class($object);
            echo '<br>';
        } else {
            echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculateSquare.';
        }
    }
ivashkevich 19.11.2020 в 20:29

Отлично

MikeSiebel 19.11.2020 в 14:27

Добрый день!

<?php
interface CalculateSquare
{
    public function calculateSquare(): float;
}
class Rectangle implements CalculateSquare
{
    private $x;
    private $y;

    public function __construct(float $x, float $y)
{
    $this->x = $x;
    $this->y = $y;
}

    public function calculateSquare(): float
{
    return $this->x * $this->y;
}
}
class Square implements CalculateSquare
{
    private $x;

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

    public function calculateSquare(): float
{
    return $this->x ** 2;
}
}

class Circle
    //implements CalculateSquare
{
    const PI = 3.1416;

    private $r;

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

    public function calculateSquare(): float
    {
        return self::PI * ($this->r ** 2);
    }
}
$objects = [
    new Square(5),
    new Rectangle(2, 4),
    new Circle(5)
];

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
        echo '<br>';
        echo "Принадлежит классу с именем " , get_class($object) , "\n";
        echo '<br>';
        echo '<br>';
    }else{
        echo "Объект класса ", get_class($object) , " не реализует интерфейс CalculateSquare.";
        echo '<br>';
        echo '<br>';
    }
}
ivashkevich 19.11.2020 в 20:56

Отлично

Larisa 23.11.2020 в 22:50
<?php

class Rectangle implements CalculateSquare
{
    private $x;
    private $y;

    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }

    public function calculateSquare(): float
    {
        return $this->x * $this->y;
    }
}

class Square implements CalculateSquare
{
    private $x;

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

    public function calculateSquare(): float
    {
        return $this->x ** 2;
    }
}

class Circle implements CalculateSquare
{
    const PI = 3.1416;
    private $r;

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

    public function calculateSquare(): float
    {
        return self::PI * ($this->r ** 2);
    }
}

interface CalculateSquare
{
    public function calculateSquare(): float;
}

$circle1=new Circle(2.5);
var_dump($circle1 instanceof Circle);

$circle1=new Circle(2.5);
var_dump($circle1 instanceof Rectangle);

$circle1=new Circle(2.5);
var_dump($circle1 instanceof CalculateSquare);
echo '<br>';

$objects = [
    new Square(5),
    new Rectangle(2,4),
    new Circle(5)
];

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект реализует интерфейс CalculateSquare. Относится к классу ' . get_class($object) . '. Площадь: ' . $object->calculateSquare();
        echo '<br>';
    } else {
        echo 'Объект класса ' . get_class($object) . 'не реализует интерфейс CalculateSquare.';
    }
}

Результат:
Объект реализует интерфейс CalculateSquare. Относится к классу Square. Площадь: 25
Объект реализует интерфейс CalculateSquare. Относится к классу Rectangle. Площадь: 8
Объект реализует интерфейс CalculateSquare. Относится к классу Circle. Площадь: 78.54

ivashkevich 25.11.2020 в 21:09

Отлично

serega19860511 05.12.2020 в 16:54
interface CalculateArea
{
    public function calculateArea(): float;
}

class Rectangle implements CalculateArea
{
    private $x;
    private $y;

    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }

    public function calculateArea(): float
    {
        return $this->x * $this->y;
    }
}

class Square
{
    private $x;

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

    public function calculateArea(): float
    {
        return $this->x ** 2;
    }
}

class Circle implements CalculateArea
{
    const PI = 3.14;
    private $r;

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

    public function calculateArea(): float
    {
        return self::PI * ($this->r ** 2);
    }
}

$objects = [
    new Circle(6),
    new Square(4),
    new Rectangle(4,5),
];

foreach ($objects as $object) {
    if ($object instanceof CalculateArea) {
        echo 'Объект класса '.get_class($object).' реализует интерфейс CalculateArea. Его площадь: '.$object->calculateArea().'<br>';
    }else{
        echo 'Объект класса '.get_class($object).' не реализует интерфейс CalculateArea.<br>';
    }
}
ivashkevich 06.12.2020 в 07:25

Супер!

serega19860511 06.12.2020 в 14:17

Добрый день Артём, метод get_class() возвращает имя класса, но вроде бы есть альтернативный вывод имени класса что-то вроде self::class или self::ИмяКласса, или я что-то путаю? Спасибо.

ivashkevich 06.12.2020 в 15:10

Да, можно использовать даже $var::class, если вы точно знаете, что в переменной находится объект

serega19860511 06.12.2020 в 21:39
$objects = [
    new Circle(6),
    new Square(4),
    new Rectangle(4,5),
];

foreach ($objects as $object) {
    if ($object instanceof CalculateArea) {
        echo 'Объект класса '.get_class($object).' реализует интерфейс CalculateArea. Его площадь: '.$object->calculateArea().'<br>';
    }else{
        echo 'Объект класса '.get_class($object).' не реализует интерфейс CalculateArea.<br>';
    }

        echo $object::class;
}

Пробую вот эту реализацию вывода имени класса echo $object::class; получаю ошибку

ivashkevich 06.12.2020 в 21:48

Что за ошибка?

serega19860511 07.12.2020 в 21:25

Вот такая ошибка выходит: Fatal error: Dynamic class names are not allowed in compile-time ::class fetch in D:\OSPanel\domains\test2\public_html\index.php on line 213

ivashkevich 08.12.2020 в 21:11

Извините что ввел вас в заблуждение, с переменной всё-таки нельзя ::class писать

kan22 25.12.2020 в 20:08
foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект класса ' . get_class($object) . ' реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
        echo '<br>';
    } else {
        echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculateSquare.';
        echo '<br>';
    }
}
ivashkevich 26.12.2020 в 21:44

Отлично

OneMoreTime 28.12.2020 в 17:58

То что было сделано в уроке с помощью интерфейсов, можно же было сделать с помощью абстрактного класса(хотя это тоже из области полиморфизма), например так:

Есть абстрактный класс Shape с абстрактным методом вычисления площади, от которого наследуются классы Circle, Square, Rectangle и каждый из наследников реализует свой метод вычисления площади. И так же можно насоздавать массив объектов и проверять, является ли каждый из них объектом Shape, если да - выводить результат вычисления площади.

Т.е. через наследование реализовано то же самое, что было реализовано через интерфейс. Так если я прав, в чем преимущество использования интерфейса? Почему тут был применен именно интерфейс?
Важно(хотелось бы на будущее) понимать - когда прямо необходимо использовать интерфейс. По крайней мере, на этом примере - не очень понятно.

ivashkevich 29.12.2020 в 19:39

Да, вы правильно поняли, это можно было бы сделать и с помощью абстрактного класса.

Но у них разное предназначение. Интерфейс нужен только для того, чтобы его реализовывать (например метод для вычисления площади, как в нашем случае). Абстрактный класс нужен для того чтобы частично реализовать какую-то логику в нем, а частично - заставить реализовать в отдельных дочерних классах.

Дальше будут примеры с абстрактным контроллером, будет понятнее.

dimadima 11.02.2021 в 13:37
<?php

interface CalculateSquare
{
    public function calculateSquare(): float;
}

class Circle implements CalculateSquare
{
    const PI = 3.1416;

    private $r;

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

    public function calculateSquare(): float
    {
        return self::PI * ($this->r ** 2);
    }
}

class Rectangle //implements CalculateSquare
{
    private $x;
    private $y;

    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }

    public function calculateSquare(): float
    {
        return $this->x * $this->y;
    }
}

class Square implements CalculateSquare
{
    private $x;

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

    public function calculateSquare(): float
    {
        return $this->x ** 2 ;

    }
}

$objects = [
    new Square(5),
    new Rectangle(2, 4),
    new Circle(5)
];

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект '. get_class($object) .' реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
        echo '<br>';
    }
     else {
        echo 'Объект класса '.get_class($object).' не реализует интерфейс CalculateSquare';
        echo '<br>';
    }
}
ivashkevich 14.02.2021 в 15:13

Отлично

Vladimir96 12.03.2021 в 23:23
 foreach($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
        echo ', и он является экземпляром класса ' . get_class($object);
        echo '<br>';
    } else {
        echo 'Объект класса ' . get_class($object) .' не реализует интерфейс CalculateSquare.';
        echo '<br>';
    }
 }
ivashkevich 16.03.2021 в 09:57

Отлично

Egor.Ka 14.03.2021 в 16:57

Сделал

<?php
class Rectangle
{
    private $x;
    private $y;

    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }

    public function calculateSquare(): float
    {
        return $this->x * $this->y;
    }
}
class Square implements CalculateSquare
{
    private $x;

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

    public function calculateSquare(): float
    {
        return $this->x ** 2;
    }
}
class Circle implements CalculateSquare
{
    const PI = 3.1416;
    private $r;

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

    public function calculateSquare(): float
    {
        return self::PI * ($this->r ** 2);
    }
}
interface CalculateSquare
{
    public function calculateSquare(): float;
}

$objects = [
    new Square(5),
    new Rectangle(2, 4),
    new Circle(5)
];

foreach ($objects as $object) {
    $name_Class= get_class($object);
    if ($object instanceof CalculateSquare) {
        echo 'Объект реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare() .
            ' Это объект класса '. $name_Class;
        echo '<br>';
    } else {
        echo 'Объект класса ' . $name_Class . ' не реализует интерфейс CalculateSquare. ';
        echo '<br>';
    }
}
ivashkevich 17.03.2021 в 16:10

Отлично

Sergey503 15.05.2021 в 17:09
$objects = [
    new Square(5),
    new Rectangle(2, 4),
    new Circle(5),
];

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
        echo '<br>';
        echo 'Этот объект ' . get_class($object) . ' класса';
        echo '<br>';
    } else {
        echo 'Объект класса ' . get_class($object) . ' не реализует интерфейс CalculateSquare.';
        echo '<br>';
    }
}
ivashkevich 19.05.2021 в 21:28

Отлично

Логические задачи с собеседований