抽象和界面在PHP中有什么区别?
可能重复:
PHP:界面和抽象类有什么区别?
嗨,大家好..
据我所知,一个类实现或扩展抽象或接口类必须使用默认方法。 我知道我们可以使用实现关键字来使用多个接口,但我们只能扩展1个抽象。 任何人都可以解释在现实生活中使用哪一个项目和区别? 太感谢了!!!!
差异既有理论又有实践意义:
示例 - 一个界面:
// define what any class implementing this must be capable of
interface IRetrieveData {
// retrieve the resource
function fetch($url);
// get the result of the retrieval (true on success, false otherwise)
function getOperationResult();
// what is this class called?
function getMyClassName();
}
现在我们有一系列要求,这些要求将针对每个实施此类的课程进行检查。 让我们来创建一个抽象类和它的孩子:
// define default behavior for the children of this class
abstract class AbstractRetriever implements IRetrieveData {
protected $result = false;
// define here, so we don't need to define this in every implementation
function getResult() {
return $result;
}
// note we're not implementing the other two methods,
// as this will be very different for each class.
}
class CurlRetriever extends AbstractRetriever {
function fetch($url) {
// (setup, config etc...)
$out = curl_execute();
$this->result = !(curl_error());
return $out;
}
function getMyClassName() {
return 'CurlRetriever is my name!';
}
}
class PhpRetriever extends AbstractRetriever {
function fetch($url) {
$out = file_get_contents($url);
$this->result = ($out !== FALSE);
return $out;
}
function getMyClassName() {
return 'PhpRetriever';
}
}
一个完全不同的抽象类(与接口无关)和一个实现我们接口的子类:
abstract class AbstractDog {
function bark() {
return 'Woof!';
}
}
class GoldenRetriever extends AbstractDog implements IRetrieveData {
// this class has a completely different implementation
// than AbstractRetriever
// so it doesn't make sense to extend AbstractRetriever
// however, we need to implement all the methods of the interface
private $hasFetched = false;
function getResult() {
return $this->hasFetched;
}
function fetch($url) {
// (some retrieval code etc...)
$this->hasFetched = true;
return $response;
}
function getMyClassName() {
return parent::bark();
}
}
现在,在其他代码中,我们可以这样做:
function getStuff(IRetrieveData $retriever, $url) {
$stuff = $retriever->fetch($url);
}
我们不必担心哪些检索器(cURL,PHP或Golden)会被传入,并且他们将如何实现目标,因为所有应该能够以类似的方式行事。 你也可以用一个抽象类来做到这一点,但是你基于类的祖先来限制自己,而不是它的能力。
多重遗传与单一遗传:
执行:
这就是我从头顶上知道的。
看到这个页面:5 PHP中抽象类和接口的主要区别
而这个:相关的StackOverflow答案。
链接地址: http://www.djcxy.com/p/54247.html上一篇: what's the difference between abstract and interface in php?