Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于PHP中接口工作方式的查询_Php_Oop - Fatal编程技术网

关于PHP中接口工作方式的查询

关于PHP中接口工作方式的查询,php,oop,Php,Oop,考虑以下代码: interface MotorInterface { public function start(); } class Car { private $motor; public function __construct(MotorInterface $motor) { $this->motor = $motor; } public function start() { return $this->motor->fi

考虑以下代码:

interface MotorInterface
{
 public function start();
}

class Car
{
  private $motor;

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

  public function start() {
    return $this->motor->fire();
  }
}
我对作为依赖项注入时接口如何工作有些困惑。您可能已经注意到,我在
Car
类中将
MotorInterface
接口作为依赖项传递。接口只指定一个原型。但是现在考虑一下:

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());

它工作并显示
点火
。但是,我从未在
MotorInterface
中原型化过
fire()
方法。它是如何工作的?

PHP并没有限制您可以对对象调用什么方法

引述:

类型声明允许函数在调用时要求参数为特定类型

您注入了一个
PetrolMotor
,它是一个
电机接口
。这将满足类型提示。这就是类型提示所做的一切。从技术上讲,它并不限制您以后可以以任何方式调用对象的方法。您的
PetrolMotor
具有
fire()
方法,因此您可以调用它,尽管接口中没有
fire()


然而,类型提示确实会影响大多数IDE中的内省,这会导致IDE抱怨该方法在接口中不可用

PHP不限制可以对对象调用什么方法

引述:

类型声明允许函数在调用时要求参数为特定类型

您注入了一个
PetrolMotor
,它是一个
电机接口
。这将满足类型提示。这就是类型提示所做的一切。从技术上讲,它并不限制您以后可以以任何方式调用对象的方法。您的
PetrolMotor
具有
fire()
方法,因此您可以调用它,尽管接口中没有
fire()


然而,类型提示确实会影响大多数IDE中的内省,这会导致IDE抱怨该方法在接口中不可用

将接口视为项目的工作规范,它是一系列代码必须具备的东西,以便能够以最基本的形式“工作”

例如,对于一个用户来说,有一件事是你最需要的;登录,所以,我们可以这样看它

<?php

interface iUser
{
    function login($uname, $pword);
}
现在,这并不意味着您可能不希望在接口之外有更多的功能,因为它与接口无关,但在您的类中,例如,您可以有一个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);
}

您可以看到,即使是同一个接口也可以用于多个解决方案

将一个接口视为一个项目的工作规范,它是一个代码必须具备的东西列表,以便能够以最基本的形式“工作”

例如,对于一个用户来说,有一件事是你最需要的;登录,所以,我们可以这样看它

<?php

interface iUser
{
    function login($uname, $pword);
}
现在,这并不意味着您可能不希望在接口之外有更多的功能,因为它与接口无关,但在您的类中,例如,您可以有一个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);
}

您可以看到,即使是同一个界面也可以用于多种解决方案

,因此,您不需要原型化方法
fire
,而是将其放在
PetrolMotor
中。现在从
PetrolMotor
中删除
fire
方法并获得一个异常。但是我注入了只有一个方法(原型)的接口,为什么
car
类能够选择甚至没有定义的
fire()
。这种行为是如何工作的?注入的不是接口,而是实现该接口的类的对象。除了在接口中定义的方法之外,类还可以有其他方法。很抱歉浪费您的时间,这确实是一个愚蠢的问题,我本来就不应该问这个问题。。。。我是embarrassed@keaton016-我不认为有什么“愚蠢的问题”,只有你不知道答案的问题,因此,尽管这是一个非常广泛的问题(从技术上来说是可以标记的),但这并不意味着它是坏的,相反,在我看来,我认为这是一个好问题,尽管如此,享受我的+1!所以,您不需要原型化方法
fire
,而是将其放在
PetrolMotor
中。现在从
PetrolMotor
中删除
fire
方法并获得一个异常。但是我注入了只有一个方法(原型)的接口,为什么
car
类能够选择甚至没有定义的
fire()
。这种行为是如何工作的?注入的不是接口,而是实现该接口的类的对象。除了在接口中定义的方法之外,类还可以有其他方法。很抱歉浪费您的时间,这确实是一个愚蠢的问题,我本来就不应该问这个问题。。。。我是embarrassed@keaton016-我不认为有什么“愚蠢的问题”,只有你不知道答案的问题,因此,尽管这是一个非常广泛的问题(从技术上来说是可以标记的),但这并不意味着它是坏的,相反,在我看来,我认为这是一个好问题,尽管如此,享受我的+1!