запрос о том, как именно работают интерфейсы в PHP - PullRequest
0 голосов
/ 25 июня 2018

Рассмотрим следующий код:

interface MotorInterface
{
 public function start();
}

class Car
{
  private $motor;

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

  public function start() {
    return $this->motor->fire();
  }
}

Я немного растерялся из-за того, как работают интерфейсы, когда вводятся как зависимости. Как вы могли заметить, я передал MotorInterface интерфейс как зависимость в Car классе. Интерфейс указывает только один прототип. Но теперь рассмотрим это:

class PetrolMotor implements MotorInterface
{
 public function start() {
    return 'starting';
 }
 public function fire() {
    return 'firing';
 }
}

А это ..

$motor = new PetrolMotor();
$car = new Car($motor);

var_dump($car->start());

Работает и отображает firing. Тем не менее, я никогда не прототипировал метод fire() в MotorInterface. Как это работает?

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

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

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

<?php

interface iUser
{
    function login($uname, $pword);
}

Это устанавливает основное правило для того, что ДОЛЖЕН иметь пользовательский класс, для чего мы можем создать класс, реализующий это;

class User implements iUser
{
    public function login($uname, $pword)
    {
        /* code to login */
    }
}

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

class User implements iUser
{
    public function login($uname, $pword)
    {
        /* code to login */
        onLoginCreateSession($uname); // Call this here in the event of successful login
    }

    private function onLoginCreateSession($uname)
    {
        /* set session variables for login success */
    }
}

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

<?php
interface iCRUD
{
    public function create (array $data);
    public function read($recordid);
    public function update(array $data);
    public function delete($recordid);
}

Это простой интерфейс с 4-мя определениями функций, но когда мы его реализуем ...

class User implements iCrud
{
    public function create (array $data)
    {
        // create to a user table using data
    }
    public function read($recordid)
    {
        // read from a user table using id
    }
    public function update(array $data)
    {
        // update user table based on data
    }
    public function delete($recordid)
    {
        // delete from user table using id
    }
}

class Documents implements iCRUD
{
    public function create (array $data)
    {
        // create to a documents table using data
    }
    public function read($recordid)
    {
        // read from a documents table using id
    }
    public function update(array $data)
    {
        // update documents table based on data
    }
    public function delete($recordid)
    {
        // delete from documents table using id
    }
}

Вы можете видеть, как даже один и тот же интерфейс может использоваться для нескольких решений

0 голосов
/ 25 июня 2018

PHP не ограничивает методы, которые вы можете вызывать для объекта.

Цитирование Руководства PHP по объявлениям типов :

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

Вы ввели PetrolMotor, то есть MotorInterface. Это удовлетворит подсказку типа. И это все, что делает подсказка типа. Технически это не ограничивает какие методы вы можете впоследствии вызывать для объекта каким-либо образом. Ваш PetrolMotor имеет метод fire(), поэтому вы можете вызывать его, несмотря на то, что fire() недоступен в интерфейсе.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...