Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.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 OOP接口的实际使用_Php_Oop - Fatal编程技术网

PHP OOP接口的实际使用

PHP OOP接口的实际使用,php,oop,Php,Oop,我是OOP新手,并学习使用接口的多态性。有一个流行的多形性示例,即根据形状计算面积 守则: <?php interface Shape { public function calcArea(); } class Circle implements Shape { private $radius; public function __construct($radius) { $this -> radius =

我是OOP新手,并学习使用接口的多态性。有一个流行的多形性示例,即根据形状计算面积

守则:

<?php

interface Shape {
          public function calcArea();
}

class Circle implements Shape {
      private $radius;

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

      public function calcArea() {
             return $this -> radius * $this -> radius * pi();
      }
}

class Rectangle implements Shape  {
      private $width;
      private $height;

      public function __construct($width, $height) {
            $this -> width = $width;
            $this -> height = $height;
      }

      public function calcArea() {
             return $this -> width * $this -> height;
      }
}
$circ = new Circle(3);
$rect = new Rectangle(3,4);

echo $circ -> calcArea();
echo '<br />';
echo $rect -> calcArea();

?>

这是完全不使用接口的相同代码:

<?php

class Circle {
      private $radius;

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

      public function calcArea() {
             return $this -> radius * $this -> radius * pi();
      }
}

class Rectangle  {
      private $width;
      private $height;

      public function __construct($width, $height) {
            $this -> width = $width;
            $this -> height = $height;
      }

      public function calcArea() {
             return $this -> width * $this -> height;
      }
}
$circ = new Circle(3);
$rect = new Rectangle(3,4);

echo $circ -> calcArea();
echo '<br />';
echo $rect -> calcArea();

?>

两者都可以正常工作,但接口实际上没有任何用处!到目前为止,OOP似乎只是增加了更多不必要的复杂性。就像不使用开关或if条件一样,我们使用类和公共接口。实际上,我发现在一个单独的类中使用IF或switch条件(只要不重复相同的代码)比在另一个类中使用IF或switch条件更容易

OOP的唯一好处似乎是在设计API时。因此,API的最终用户实际上可以直接访问所需的方法,而无需调用大量不需要的代码

不过,从开发人员的角度来看,对某个类的任何修改实际上也可能需要对代码的其他部分进行修改。此外,开发人员无论如何都必须查看代码的其他部分才能理解它是如何工作的。此外,HTML中的内联PHP也将存在,因此对某个方法的任何修改都可能需要更改所声明对象的实例


我错过什么了吗

我认为这个问题更适合我

无论如何:您的最小示例是-最小。是的,在这种情况下,使用接口会被认为是过火了,但是有许多用例,在这些用例中实现/指定接口是有意义的

如果您正在开发开放源代码,您可能希望指定一个接口,即使您是当时唯一的开发人员,只是为了确保未来的贡献者可以轻松访问您的代码,并可以为您的项目提供自己的扩展/添加

但是,即使是在你的最简单的例子中,也有一些用例:想象一个应用程序,其中应用程序的某个部分通常处理
形状
对象。想象一下,这并不重要,要处理的实际形状是什么

使用该接口时,您必须为所有派生类实现该方法。这允许可伸缩性和可维护性


另外,请看同一主题。

这是一个很好的问题,我看到人们一遍又一遍地问这个问题。因此,我将尝试为您简化它,(最后是接口部分)

首先,您不必到处使用OOP,大多数wordpress核心代码都是用过程化php编写的(不确定当前版本),这不是一件坏事。大多数情况下,它确实简化了新程序员的工作,这就是使用面向对象编程(OOP)的全部意义,即在抽象之上增加抽象,因此当程序员在处理特定功能时,他不必担心其他方面。例如,如果我想存储注册表单中的图像,我将有两个类。一个用于用户,一个用于图像。下面是它的样子

/*********** User Class ***********/

        Class User
        {
          public function storeUser($request, Image $image)
          {
             // Fetch Image from the form request and pass it to the

             $image = $request->input('image');
             $image->uploadImage($image, $imagePath);

             // Now upload other user attributes
          }
        }

/ ********* Image Class **********/

        Class Image
        {
          public function uploadImage($image, $imagePath){
             // Code to UploadImage
          }
        }
我通常有一个名为users的类和一个名为storeUser的方法,在其中我会将用户添加到数据库中。现在我还有另一个名为Image的类,它有一个名为uploadImage的方法

你也可以用一个功能做同样的事情,但是如果你想要另一个功能,比如说当用户更新他的个人资料时,删除旧图像并上传一个新图像。为此,您必须包含另一个函数,该函数包含uploadimage的所有代码和一些其他代码来删除以前的图像

但现在你在重复你自己,避免枯燥的原则(不要重复你自己)。但是假设您有另一个deleteUserImage函数,该函数将删除图像,然后依次调用upload函数

如果这就是你想做的,你实际上是在潜意识中使用OOP,但使用的方式非常混乱,因为类只是函数和变量的集合。但您缺少许多其他功能,如作用域、静态、其他一些很酷的东西和我最喜欢的$this:)

您添加的抽象的数量可能取决于您的截止日期、未来的可伸缩性等。您不必完全疯狂地使用抽象,但一个简单的经验法则是您拥有的抽象越多,您的代码就越易于管理和灵活

假设您已经用php和mysql创建并启动了应用程序,但该应用程序的流行程度超出了您的预期。突然间,您拥有了数百万用户,但是你的mysql服务器不支持这么多的用户,你想转移到另一个数据库,比如postgres或cassandra,但是你所有的mysql查询都和php代码混在一起了,除了从头开始创建一切,没有什么不费吹灰之力的方法可以做到这一点。这是包括twitter和facebook在内的许多大型组织都经历过的一个常见问题。但是如果你用抽象创建了你的应用程序,所有的查询都在一个类中,你的控制器在另一个类中。您只需修改几个文件中的驱动程序和查询,就可以开始同时使用另一个数据库

现在让我们回到最初关于接口的问题。您可能认为接口只是浪费时间,因为它只是一个将在类中实现的所有方法的列表,对吗?至少在我开始OOP的时候我觉得是这样。但事实证明我很愚蠢,因为当时我不知道

SOLID实际上是有史以来为编程编写的5条最佳原则的缩写,它们相互支持得非常好。实体中的“O”代表“开放和封闭原则”,它的意思是,方法对于更改是封闭的,但是对于扩展是开放的。在si中