类可以用 abstract 修饰,表示抽象类,抽象类不能直接被实例化。但是,继承了抽象类的普通类是可以被实例化的。如:
//one.php
<?php
abstract class one
{
function __construct(){
}
}
//new one;
?>
实例化的时候会报Fatal error的错误。
但是继承自这个抽象类的方法就可以被实例化。如:
//index.php
include 'one.php';
class index extends one
{
function __construct(){
parent::__construct();
}
}
$obj = new index;
除了类可以用 abstract 修饰之外,方法也能被 abstruct 修饰,为抽象方法。抽象方法真的是很抽象,它并没有内容,如:
<?php
//one.php
abstract class one
{
function __construct(){
}
abstract public function test();
//允许带参数,但是在子类中重写的时候也必须带上参数,参数名可以不同
//abstract public function test($param);
}
//new one;
?>
如果方法被 abstruct 修饰,那么这个类必须用abstruct,不然就
会报错。也就是说抽象类可以有普通的方法,但是抽象方法必须在抽象类里面定义,并且,如果继承了这个有抽象方法的抽象类,那么在你继承的这个类里面必须重写这个方法,否则依然会报错。如:
<?php
//index.php
include 'one.php';
class index extends one
{
function __construct(){
parent::__construct();
}
//这个方法不重写就会报错
public function test(){
echo 'hello';
}
//如果抽象的父类中该函数有参数,那么重写的时候也要带上参数
public function test($papapa){
echo 'hello';
}
}
$obj = new index;
?>
但是抽象类中的抽象方法似乎不能被定义为静态的,定义了之后就报错。如:
<?php
//one.php
abstract class one
{
function __construct(){
}
abstract public function test($param);
//定义静态抽象方法就报错
static abstract function hello();
}
//new one;
?>
<?php
//index.php
include 'one.php';
class index extends one
{
function __construct(){
parent::__construct();
}
public function test($aa){
echo 'hello';
}
//并不能实现
static public function hello(){
echo 'word';
}
}
$obj = new index;
?>
还有,抽象类是可以继承抽象类的,并且不需要重写父类的抽象方法,它的抽象方法不能和父类的抽象方法同名,他们的关系就像是拓展延伸的关系。如:
<?php
//index.php
include 'one.php';
abstract class two extends one
{
abstract public function test1();
//重写了之后子类无需再重写
/*public function test(){
}*/
}
class index extends two
{
public function test(){
}
public function test1(){
}
}
$obj = new index;
?>
由于平时接触这些也不多,主要都是基于框架开发或者直接在其他系统上二次开发,对这些稍微底层一点的知识理解的不透彻,在我的理解看来,抽象类和方法主要是用在比较底层的被继承的类中,供其他继承的类去拓展。但是是否对于性能是否有改变就不大清楚了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。