This example will hopefully help you see how abstract works, how interfaces work, and how they can work together. This example will also work/compile on PHP7, the others were typed live in the form and may work but the last one was made/tested for real:
public functiondoSell();
public functiondoBuy();
}// Define our default abstractionabstract classdefaultProductAbstractionimplementsproductInterface{
private$_bought=false;
private$_sold=false;
abstract public functiondoMore();
public functiondoSell() {/* the default implementation */$this->_sold=true;
echo"defaultProductAbstraction doSell:{$this->_sold}".¶;
}
public functiondoBuy() {$this->_bought=true;
echo"defaultProductAbstraction doBuy:{$this->_bought}".¶;
}
}
classdefaultProductImplementationextendsdefaultProductAbstraction{
public functiondoMore() {
echo"defaultProductImplementation doMore()".¶;
}
}
classmyProductImplementationextendsdefaultProductAbstraction{
public functiondoMore() {
echo"myProductImplementation doMore() does more!".¶;
}
public functiondoBuy() {
echo"myProductImplementation's doBuy() and also my parent's dubai()".¶;parent::doBuy();
}
}
classmyProductextendsdefaultProductImplementation{
private$_bought=true;
public function__construct() {var_dump($this->_bought);
}
public functiondoBuy() {/* non-default doBuy implementation */$this->_bought=true;
echo"myProduct overrides the defaultProductImplementation's doBuy() here{$this->_bought}".¶;
}
}
classmyOtherProductextendsmyProductImplementation{
public functiondoBuy() {
echo"myOtherProduct overrides myProductImplementations doBuy() here but still calls parent too".¶;parent::doBuy();
}
}
echo"new myProduct()".¶;$product= newmyProduct();$product->doBuy();$product->doSell();$product->doMore();
echo¶."new defaultProductImplementation()".¶;$newProduct= newdefaultProductImplementation();$newProduct->doBuy();$newProduct->doSell();$newProduct->doMore();
echo¶."new myProductImplementation".¶;$lastProduct= newmyProductImplementation();$lastProduct->doBuy();$lastProduct->doSell();$lastProduct->doMore();
echo¶."new myOtherProduct".¶;$anotherNewProduct= newmyOtherProduct();$anotherNewProduct->doBuy();$anotherNewProduct->doSell();$anotherNewProduct->doMore();?>
Will result in:
new myProduct()
bool(true)
myProduct overrides the defaultProductImplementation's doBuy() here 1
defaultProductAbstraction doSell: 1
defaultProductImplementation doMore()
new defaultProductImplementation()
defaultProductAbstraction doBuy: 1
defaultProductAbstraction doSell: 1
defaultProductImplementation doMore()
new myProductImplementation
myProductImplementation's doBuy() and also my parent's dubai()
defaultProductAbstraction doBuy: 1
defaultProductAbstraction doSell: 1
myProductImplementation doMore() does more!
new myOtherProduct
myOtherProduct overrides myProductImplementations doBuy() here but still calls parent too
myProductImplementation's doBuy() and also my parent's dubai()
defaultProductAbstraction doBuy: 1
defaultProductAbstraction doSell: 1
myProductImplementation doMore() does more!
*/?>