抽象类的特性
1、定义为抽象的类不能被实例化。 
2、如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。 
3、被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。 
4、继承一个抽象类的时候,子类必须定义父类中的所有抽象方法(这些方法的访问控制必须和父类中一样(或者更为宽松)。)
demo
abstract class abstractclass{
 // 强制要求子类定义这些方法
    abstract protected function getvalue();
    abstract protected function prefixvalue($prefix);
    // 普通方法(非抽象方法)
    public function printout() {
        print $this->getvalue() . "\n";
    }
class concreteclass1 extends abstractclass{   //父类定义了俩个抽象方法,如子类只实现了其中一个,则报如下错误//fatal error: class concreteclass1 contains 1 abstract //method and must therefore be declared abstract or //implement the remaining methods //(abstractclass::prefixvalue)
    protected function getvalue() {
        return "concreteclass1";
    } 
   // 且子类的访问权限不能低于父类,如果将如下子类的访问方式改为private则会报如下错误
    //fatal error: access level to //concreteclass1::prefixvalue() must be protected (as in //class abstractclass) or weaker
    public function prefixvalue($prefix) {
        return "{$prefix}concreteclass1";
    }
}
//当实例化一个抽象类时,fatal error: cannot instantiate //abstract class abstractclass
//$obj = new abstractclass();
// 但是我们可以这么使用##########################################################
abstract class foo{
     static function bar()
     {
         echo "test\n";
     }
 }
foo::bar();##########################################################
$obj = new concreteclass1();
echo $obj->getvalue();
5、子类可以定义一个可选参数(也就是必须要有默认值),而父类抽象方法的声明里没有,则两者的声明并无冲突。
abstract class abstractclass{
    // 我们的抽象方法仅需要定义需要的参数
    abstract protected function prefixname($name);
}
class concreteclass extends abstractclass
{
    // 我们的子类可以定义父类签名中不存在的可选参数
    // 如果这里的$separator没有默认值,则会报fatal error: 、、//declaration of concreteclass::prefixname() must be //compatible with that of abstractclass::prefixname()
    public function prefixname($name, $separator = ".") {
        if ($name == "pacman") {            $prefix = "mr";
        } elseif ($name == "pacwoman") {            $prefix = "mrs";
        } else {            $prefix = "";
        }        return "{$prefix}{$separator} {$name}";
    }
}
$class = new concreteclass;
echo $class->prefixname("pacman"), "\n";
echo $class->prefixname("pacwoman"), "\n";
6、抽象类可以没有抽象方法,反过来有抽象方法的类一定要声明为抽象类
abstract class a{
     public function show(){
         echo 'a';
     }
 } class b extends a{
     public function hello(){
         echo 'b';         
         parent::show();
     }
 } 
 $obj = new b; 
 $obj->hello(); // ba
7、抽象类定义的顺序
// 正确的定义顺序
abstract class horse extends animal {
     public function get_breed() { return "jersey"; }
 } 
 class cart extends horse {
     public function get_breed() { return "wood"; }
 }
 // 错误的定义顺序,将会导致horse类找不到
 class cart extends horse {
     public function get_breed() { return "wood"; }
 } 
 abstract class horse extends animal {
     public function get_breed() { return "jersey"; }
 }
8、抽象方法可以为静态方法
abstract class foo
{
     abstract static function dump();
 } 
 class bar extends foo{
     static function dump(){var_dump("bar");}
 }
bar::dump(); // string(3) "bar"
9、一个抽象类继承另一个抽象类时,抽象方法不需要声明为抽象的
//fatal error: can't inherit abstract function //class1::somefunc() (previously declared abstract in //class2)abstract class class1 { 
   abstract public function somefunc(); 
 } 
 abstract class class2 extends class1 { 
   abstract public function somefunc(); 
 } 
//下面的是正确的
abstract class class1 { 
   abstract public function somefunc(); 
 } 
 abstract class class2 extends class1 { 
 }
以上就是php抽象类特性实例详解的详细内容。
   
 
   