Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.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_Interface_Abstract Class_Factory Pattern_Abstraction - Fatal编程技术网

PHP使用抽象类还是接口?

PHP使用抽象类还是接口?,php,interface,abstract-class,factory-pattern,abstraction,Php,Interface,Abstract Class,Factory Pattern,Abstraction,在这段代码中,使用抽象类代替接口更好,还是像现在这样好?若然,原因为何 /** contract for all flyable vehicles **/ interface iFlyable { public function fly(); } /* concrete implementations of iFlyable interface */ class JumboJet implements iFlyable { public function fly() {

在这段代码中,使用抽象类代替接口更好,还是像现在这样好?若然,原因为何

/** contract for all flyable vehicles **/
interface iFlyable {
    public function fly();
}

/* concrete implementations of iFlyable interface */
class JumboJet implements iFlyable {
    public function fly() {
        return "Flying 747!";
    }
}

class FighterJet implements iFlyable {
    public function fly() {
        return "Flying an F22!";
    }
}

class PrivateJet implements iFlyable {
    public function fly() {
        return "Flying a Lear Jet!";
    }
}

/** contract for conrete Factory **/
/**
* "Define an interface for creating an object, but let the classes that implement the interface
* decide which class to instantiate. The Factory method lets a class defer instantiation to
* subclasses."
**/
interface iFlyableFactory {
    public static function create( $flyableVehicle );
}

/** concrete factory **/
class JetFactory implements iFlyableFactory {
    /* list of available products that this specific factory makes */
    private  static $products = array( 'JumboJet', 'FighterJet', 'PrivateJet' );

    public  static function create( $flyableVehicle ) {
        if( in_array( $flyableVehicle, JetFactory::$products ) ) {
            return new $flyableVehicle;
        } else {
            throw new Exception( 'Jet not found' );
        }
    }
}

$militaryJet = JetFactory::create( 'FighterJet' );
$privateJet = JetFactory::create( 'PrivateJet' );
$commercialJet = JetFactory::create( 'JumboJet' );

界面更加灵活。通过这种方式,并不是所有flies都必须从同一基类继承(php不支持多重继承)

所以

有时不需要灵活性

抽象类还可以提供函数定义,如果多个飞行类需要相同的fly()方法,则可以减少代码重复


希望这能帮助您了解您的选择

界面更灵活。通过这种方式,并不是所有flies都必须从同一基类继承(php不支持多重继承)

所以

有时不需要灵活性

抽象类还可以提供函数定义,如果多个飞行类需要相同的fly()方法,则可以减少代码重复


希望这能帮助您理解您的选择

这可能更适合codereview.stackexchange.com这也将是基本的意见基础,但我会给出一个意见(不是答案)。我认为你的例子过于简单,无法确定哪一个更好。例如,如果所有飞行器都可能存在共同的行为,这些行为可能有助于更好地重用代码(即改变高度、改变航向、起飞、着陆),并且只有在某些情况下才具有覆盖行为,那么,抽象类可能比接口更可取。这可能更适合codereview.stackexchange.com。这在很大程度上也将成为意见库,但我将给出一个意见(不是答案)。我认为你的例子过于简单,无法确定哪一个更好。例如,如果所有飞行器都可能存在一些共同的行为,这些行为可能有助于更好地重用代码(例如,改变高度、改变航向、起飞、降落),并且只在某些情况下重写行为,那么抽象类可能比接口更可取。这很有意义。Thnaks@David Chan很有道理。Thnaks@David Chan
class bird extends animal implements flyable
class plane extends machine implements flyable
class cloud implements flyable