Abstract
Abstract Classes focus on a kind of things similarity.
People are considered of type mammal and as such would not be considered of type vehicle.
Interface
Interfaces focus on collation of similar function.
For example: You are a human being and are of type mammal. If you want to fly then you will need to implement a flying Interface. If you want to shoot while flying, then you also need to implement the gun Interface.
See the examples below:
abstract class Mammal { protected $age_; //below are functions I think all mammals will have,including people abstract public function setAge($age); abstract public function getAge(); abstract public function eat($food); } class Person extends Mammal { protected $job_; //Person's feature public function setAge($age){ $this->age_ = $age; } public function getAge(){ return $this->age_; } public function eat($food){ echo 'I eat ' ,$food ,'today'; } //People only attribute public function setJob($job){ $this->job_ = $job; } public function getJob(){ echo 'My job is ' , $this->job_; } } //Now a person wants to fly, but they are typically not able to do so. //So we implement an interface interface Plane{ public function Fly(); } //I also want shoot enemy interface Gun{ public function shoot(); } class Person2 extends Mammal implements Plane,Gun{ protected $job_;//Person feature public function setAge($age){ $this->age_ = $age; } public function getAge(){ return $this->age_; } public function eat($food){ echo '<br/>I eat ' ,$food ,' today<br/>'; } //Only a person has this feature. public function setJob($job){ $this->job_ = $job; } public function getJob(){ echo 'My job is ' , $this->job_; } //----------------------------------------- //below implementations from interfaces function. (features that humans do not have). //Person implements from other class public function fly(){ echo '<br/>I use plane,so I can fly<br/>'; } public function shoot(){ echo 'I use gun,so I can shoot<br/>'; } } $People = new Person(); echo '<pre>'; print_r( get_class_methods('People')); echo '</pre>'; echo '<pre>'; print_r( get_class_methods('People2')); echo '</pre>'; $People2 = new Person2(); $People2->setAge(24); echo $People2->getAge(); $People2->eat('egg'); $People2->setJob('PHP devepop'); echo $People2->getJob(); $People2->fly(); $People2->shoot();
Bar inherits Bazand would like to pass it to some methodsomeMethod(Foo $foo). Which solution (abstract or interface) could you use?