抽象和界面在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?

    下一篇: Difference Between Interface and Class