疯狂混乱PHP OOP同时“实现”“扩展”

时间:2011-03-12 22:27:11

标签: php oop

abstract class SF_Model_Acl_Abstract 
    extends SF_Model_Abstract
    implements SF_Model_Acl_Interface, Zend_Acl_Resource_Interface
{
    protected $_acl;
    protected $_identity;
    public function setIdentity($identity)
    {
    if (is_array($identity)) {
        ......
        ......

你能帮我解释一下它如何“implements”同时“extends”吗?
它只是将3级组合在一起吗?

我完全糊涂了!

5 个答案:

答案 0 :(得分:17)

extends用于继承,即继承类中的方法/字段。 PHP类只能从一个类继承。

implements用于实现接口。它只需要类具有在已实现的接口中定义的方法。

示例:

interface INamed { function getName($firstName); }
class NameGetter { public function getName($firstName) {} }
class Named implements INamed { function getName($firstName) {} }
class AlsoNamed extends NameGetter implements INamed {}
class IncorrectlyNamed implements INamed { function getName() {} }
class AlsoIncorrectlyNamed implements INamed { function setName($newName) {} }

此代码在第5行引发致命错误,因为接口上的方法未正确实现(参数丢失)。 它也会在第6行引发致命错误,因为接口上的方法根本没有实现。

答案 1 :(得分:5)

是的,PHP可以使用 implements 实现多个界面,但它只能使用 extends 继承一个类

答案 2 :(得分:5)

实施和扩展是两种不同的鞋子。

Extends告诉编译器/解释器该类派生自另一个类。 Implements告诉编译器/解释器,类必须实现在接口中定义的契约。

查找接口,因为它们是OOP中多态性的支柱。当你从中派生时,Extends基本上实现了超类的公共(和半公共,受保护)接口。

答案 3 :(得分:2)

extends:可以使用和/或覆盖任何父方法。

implements:必须拥有所有接口方法:每个接口的方法必须至少在实现的类中声明。

答案 4 :(得分:1)

它只是实现接口,它描述了所需的方法,因此其他方法有一个定义的接口可以使用,参见http://php.net/manual/en/language.oop5.interfaces.php