Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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_Zend Framework - Fatal编程技术网

如何使用PHP摘要?

如何使用PHP摘要?,php,oop,zend-framework,Php,Oop,Zend Framework,你为什么要用这样的摘要?它是否加快了工作速度,或者它的具体用途是什么 // file1.php abstract class Search_Adapter_Abstract { private $ch = null; abstract private function __construct() { } abstract public funciton __destruct() { curl_close($this->ch

你为什么要用这样的摘要?它是否加快了工作速度,或者它的具体用途是什么

// file1.php
abstract class Search_Adapter_Abstract {
    private $ch = null;
    abstract private function __construct()
    {
    }       
    abstract public funciton __destruct() { 
      curl_close($this->ch);
    }
    abstract public function search($searchString,$offset,$count);
}

// file2.php
include("file1.php");
class abc extends Search_Adapter_Abstract
{
    // Will the curl_close now automatically be closed?

}

在这里扩展摘要的原因是什么?这让我很困惑。现在我能从中得到什么?

因此,您可以实现不同的搜索适配器,并且所有适配器都必须实现该搜索方法

基本上,您得到的是每个扩展“Search\u Adapter\u Abstract”的类都可以用作搜索适配器。行为会发生变化(因为方法搜索的实现方式不同),但您可以保证“搜索”方法具有该签名。

您可以使用抽象类来定义和部分实现扩展类应该执行的常见任务。既然没有一个例子说明它是困难的,请考虑如下:

如果没有抽象类,则必须使用相同的方法和实现定义两个基本类。由于OOP的全部目的是防止代码重复,这是完全错误的:

class Car {
  public $brand = 'mercedes';

  public function gasPerMile($weight) 
  {
    // Useless calculation, purely for illustrating
    $foo = $weight * 89 / 100;
    return $foo;
  }

  public function carSpecificFunction() 
  {
    // Only present in class Car
  }
}

class Truck {
  public $brand = 'MAN';

  public function gasPerMile($weight) 
  {
    // Useless calculation, purely for illustrating
    $foo = $weight * 89 / 100;
    return $foo;
  }

  public function truckSpecificFunction() 
  {
    // Only present in class Truck
  }
}
现在您有了一些公共属性和方法,它们在两个类中重复。为了避免这种情况,我们可以定义一个抽象类,从中扩展
Car
Truck
。这样,公共功能就保存在一个地方,扩展类将实现卡车或汽车的特定属性和方法

abstract class Vehicle {
  abstract public $brand;

  public function gasPerMile($weight) 
  {
    // Useless calculation, purely for illustrating
    $foo = $weight * 89 / 100;
    return $foo;
  }
}
这样,您可以确保至少扩展
车辆的每个类都必须指定一个品牌,并且所有扩展类都可以使用通用的
gaspermie()
方法


当然,这是一个简单的例子,但希望它能说明为什么抽象类是有用的。

这不是一个流行的答案,但仍然

abstract
interface
private
以及其他从Java借来的关键字在PHP中都是元素,除了让作者显得更“严肃”和“专业”之外,没有任何实际用途

说明:这些关键字是编译时契约,对程序的运行方式没有影响,只是作为编译器的辅助工具。。。假设你有一个。在编译语言(如Java或C#)中,您无法实际部署违反约定的程序,例如,不实现
抽象方法。你根本没有把它编译好。这是一件好事,因为您可以非常快速地修复某些类型的bug,而无需测试和调试

相反,PHP没有编译器,在运行时执行所有契约检查。这是一件坏事,因为您需要测试和调试以手动查找违反合同的情况。考虑以下事项:

class Abs {
    abstract function implementMe();
}

if ($_GET['x'] == 'foo')
    include "GoodClass.php";

if ($_GET['x'] == 'bar')
    include "BadClass.php";
其中“BadClass”扩展了“Abs”,但没有实现“implementMe”方法。这个脚本可以被部署,并且可以正常运行,直到有人用“?x=bar”调用它,然后-bang!-你的程序突然崩溃了。更糟糕的是,这将是一个“致命”错误,因此您甚至无法以合理的方式处理它


也就是说,
abstract
和朋友在PHP中不仅没有用处,而且非常有害。它们不仅不能帮助你寻找虫子,而且它们还是更多故障的潜在来源。走开。

可能重复:@marek sebera这是一个很好的链接,有很好的解释。我不明白。。。那个片段有用吗?!据我所知,抽象方法无法定义(即,您可以在抽象类中编写
抽象公共函数smth();
,在另一个类中编写
公共函数smth(){}
,但不能定义
抽象公共函数smth(){}
),抽象方法不能是私有的,因为它们不能在同一个类中定义。对于这个代码段,我所看到的只是由于这些错误而引发的致命错误。是什么使它对于抽象类来说是特定的?接口不是用于此目的吗?对于抽象类,您还可以提供其他实现的方法甚至变量。接口必须只有抽象方法。看看,但这难道不使得用另一个搜索实现替换搜索实现比使用搜索接口更复杂吗?难道不明白“复杂化”和“替换”的意思吗?你的意思是覆盖吗?你的意思是在另一个类中切换搜索适配器吗?在这两种情况下,我都没有看到这样的并发症。要在两种搜索方法之间切换,只需在搜索适配器抽象的两种不同实现之间切换即可。正如它现在设计的那样,Search_Adapter_Abstract和具有相同签名的“Search”方法的接口之间的区别只涉及多重继承。在上面的链接中解释了不同之处。由于技术原因,一个实现可能无法与抽象基类一起工作。如果不使用接口,而是强制执行(抽象)基类,那么就注定要失败。在你的回答中,你认为抽象类有助于保持事物的去耦合,我只是说接口更好地帮助去耦合。你能在抽象类中加入一些自动调用其私有变量的东西吗?e、 g:abstract public function uu destruct(){curl_close($this->ch);}不,私有属性在扩展类中不可用,因此应该将它们设置为公共或受保护。此外,如果添加
abstract
关键字,则只能定义该方法,而不能执行任何操作。如果希望函数在抽象类中执行某些操作,则应省略
abstract
关键字。这就是我们需要的单元测试、验收测试和其他测试;-)你不是认真的吧,你这个恶作剧的人。。。?这就是合同的全部要点。你必须履行合同,否则你会感到异常和错误的痛苦。契约可以强制类型,它们可以确保逻辑在整个应用程序的各个点都符合您期望的标准。如果在将应用程序部署到生产环境之前没有对其进行测试,那么这就由您来承担。在PHP中,这些检查是在运行时执行的,这是您必须面对的事实