`

PHP类实例教程:abstract类和abstract方法

阅读更多

可以使用abstract来修饰一个类或者方法。

用abstract修饰的类表示这个类是一个抽象类,用abstract修饰的方法表示这个方法是一个抽象方法。

抽象类不能被实例化。

抽象方法是只有方法声明,而没有方法的实现内容。

abstract 抽象类

可以使用abstract来修饰一个类。

用abstract修饰的类表示这个类是一个抽象类。

抽象类不能被实例化。

这是一个简单抽象的方法,如果它被直接实例化,系统会报错。

 

<?php
//定义一个抽象类
abstract class User
{
	public function __toString() {
		return get_class($this);
	} 
}
//实例化这个类会出现错误
echo new User();
?>
 下面例子的 NormalUser 继承自 User类,就可以被实例化了。

 

 

<?php
//定义一个抽象类
abstract class User
{
	public function __toString() {
		return get_class($this);
	} 
}
//实例化这个类会出现错误
echo new User();
class NormalUser extends User
{
}
$a = new NormalUser();
echo "这个类" . $a . "的实例";
?>
 单独设置一个抽象类是没有意义的,只有有了抽象方法,抽象类才有了血肉。下面介绍抽象方法。

 

abstract 抽象方法

用abstract修饰的类表示这个方法是一个抽象方法。

抽象方法,只有方法的声明部分,没有方法体。

抽象方法没有 {} ,而采用 ; 结束。

一个类中,只要有一个抽象方法,这个类必须被声明为抽象类。

抽象方法在子类中必须被重写。

下面是一个抽象类,其中有两个抽象方法,分别是 setSal() 和 getSal()。用来取回 $sal 员工的工资。

 

<?php
abstract class User
{
	protected $sal = 0;
	//这里定义的抽象方法。
	//注意抽象方法没有方法体,而且方法结束使用 ; 号。
	abstract function getSal();
	abstract function setSal();
	//定义它的__tostring方法
	public function __toString() {
		return get_class($this);
	} 
} 
?>
 既然User类不能被直接继承,我们写一个NormalUser类继承自User类。当我们写成如下代码时,系统会报错。 这个错误告诉我们,在 User类中有两个抽象方法,我们必须在子类中重写这两个方法。

 

 

<?php
abstract class User
{
	protected $sal = 0;
	//这里定义的抽象方法。
	//注意抽象方法没有方法体,而且方法结束使用 ; 号。
	abstract function getSal();
	abstract function setSal();
	//定义它的__tostring方法
	public function __toString() {
		return get_class($this);
	} 
}
class NormalUser extends User
{
}
?> 
 下面例子,重写了这两个方法,虽然方法体里面 {} 的内容是空的,也算重写了这个方法。注意看重写方法的参数名称,这里只要参数数量一致就可以,不要求参数的名称必须一致。
<?php
abstract class User
{
	protected $sal = 0;
	//这里定义的抽象方法。
	//注意抽象方法没有方法体,而且方法结束使用;号。
	abstract function getSal();
	abstract function setSal();
	//定义它的__tostring方法
	public function __toString() {
		return get_class($this);
	} 
}
class NormalUser extends User
{
	function getSal() {
	}
	function setSal($sal) { 
	}
}
	//这样就不会出错了。
?>
 下面19-21行,三种写重写的方式都会报错。

 

19行,缺少参数。

20行,参数又多了。

21行,参数类型不对。(这种写法在以后章节介绍)

一个类中,如果有一个抽象方法,这个类必须被声明为抽象类。

下面这个类不是抽象类,其中定义了一个抽象方法,会报错。

<?php
class User
{
	protected $sal = 0;
	//这里定义的抽象方法。
	//注意抽象方法没有方法体,而且方法结束使用;号。
	abstract function getSal();
	abstract function setSal();
	//定义它的__tostring方法
	public function __toString() {
		return get_class($this);
	} 
}
	//这个类中有两个抽象方法,如果这个类不是抽象的。会报错
?>

 抽象类继承抽象类

抽象类继承另外一个抽象类时,不用重写其中的抽象方法。

抽象类中,不能重写抽象父类的抽象方法。

这样的用法,可以理解为对抽象类的扩展

下面的例子,演示了一个抽象类继承自另外一个抽象类时,不需要重写其中的抽象方法。

<?php  
abstract class User  
{  
    protected $sal = 0;  
    abstract function getSal();  
    abstract function setSal($sal);   
}  
abstract class VipUser extends User  
{  
}  
?>  

 抽象类在被继承后,其中的抽象方法不能被重写。

如果发生重写,系统会报错。

<?php
abstract class User
{
	protected $sal = 0;
	abstract function getSal();
	abstract function setSal($sal); 
}
abstract class VipUser extends User
{
	abstract function setSal(); 
}
?>

 抽象类继承抽象类,目的对抽象类的扩展。

<?php
abstract class User
{
	protected $sal = 0;
	abstract function getSal();
	abstract function setSal($sal); 
}
abstract class VipUser extends User
{
	protected $commision = 0;
	abstract function getCommision();
	abstract function setCommision();
}
?>

 在PHP5.1中,抽象类中支持静态抽象方法。下面这个例子,看到静态抽象方法可以声明。实现这个方法时,必须是静态的方法。

静态抽象方法

在PHP5.1中,抽象类中支持静态抽象方法。下面这个例子,看到静态抽象方法可以声明。实现这个方法时,必须是静态的方法。

<?php
abstract class User
{
	protected static  $sal = 0;
	static abstract function getSal();
	static abstract function setSal($sal); 
}
class VipUser extends User
{
	static function getSal() {
		return self::$sal;
	}
	static function setSal($sal) {
		self::$sal = $sal;
	}
}
VipUser::setSal(100);
echo "you sal is " . VipUser::getSal();
?>
//这里的抽象方法好像没有问题 

 

转自:http://blog.csdn.net/klinghr/article/details/5212952

分享到:
评论
2 楼 fufu0414 2015-05-04  
            
1 楼 fufu0414 2015-05-04  
[list]
  • [url][img][img][img][list]
  • [*][list]
  • [*][*][list]
  • [*][*][*][list]
  • [*][*][*][*][list]
  • [*][*][*][*][*][list]
  • [*][*][*][*][*][*][*]
  • [*][*][*][*][*][/list]
  • [*][*][*][*][/list]
  • [*][*][*][/list]
  • [*][*][/list]
  • [*][/list]
  • [/list][/img][/img][/img][/url]
  • [/list]

    相关推荐

      PHP中文教程:面向对象编程的介绍

      2. **对象(Object)**:对象是类的实例,具有类定义的属性和方法。通过`new`关键字,我们可以根据类创建新的对象。 3. **封装(Encapsulation)**:封装是将数据和操作数据的方法绑定在一起,对外部环境隐藏内部...

      php多态和抽象类,php教程

      抽象类是一种不能被实例化的特殊类,它通常用来作为其他类的基类,提供共同的属性和方法。在PHP中,使用`abstract`关键字声明一个类为抽象类,并可以定义抽象方法(没有方法体的方法)。子类继承抽象类时,必须实现...

      php面向对象(类)教程

      10. **静态成员**:在PHP中,`static`关键字可以用来声明静态属性和方法,它们不属于类的实例,而是属于类本身。这意味着无需创建对象即可访问它们。 通过学习以上知识点,你将能够更好地理解PHP中的面向对象编程,...

      PHP高级教程php详解

      对象是类的具体实例,可以访问类中的属性和方法。 3. 访问控制:PHP提供了public、private和protected三种访问修饰符。public属性和方法可以在任何地方访问,private仅限于本类内部,而protected允许子类访问。 4....

      PHP100视频教程20:PHP面向对象开发的学习(四)

      首先,我们要理解**类**是对象的模板,它定义了一组属性和方法,这些属性描述了对象的状态,而方法则定义了对象的行为。在PHP中,我们可以使用`class`关键字来创建类。例如: ```php class Car { public $color; /...

      PHP100视频教程24:PHP面向对象开发的学习(八).rar

      5. **继承**:一个类可以继承另一个类的属性和方法,这样可以避免代码重复,提高代码的复用性。使用`extends`关键字实现继承。 6. **封装**:封装是将数据和操作数据的方法绑定在一起,形成一个独立的单元,以保护...

      PHP100视频教程22:PHP面向对象开发的学习(六).rar

      使用`abstract`关键字声明抽象类和方法。子类必须实现所有抽象方法才能被实例化。 **魔术方法**是PHP提供的一组特殊方法,如`__construct`(构造方法)、`__destruct`(析构方法)、`__get`和`__set`(用于访问私有...

      php ob PHP面向对象教程

      继承允许一个类(子类)从另一个类(父类)继承属性和方法。这提高了代码的复用性并简化了设计。在PHP中,使用关键字"extends"实现继承: ```php class Student extends Person { // 子类可以访问父类的公共和受...

      PHP100视频教程19:PHP面向对象开发的学习(三).rar

      PHP中的`abstract`关键字用于声明抽象类和方法,`interface`关键字用于定义接口。 此外,**访问修饰符**也是PHP OOP中不可忽视的部分。`public`成员对所有类可见,`private`成员只能在定义它们的类中访问,`...

      PHP5面向对象开发教程第一章-PHP5面向对象基础

      总结来说,PHP5的面向对象特性包括类、对象、继承、接口、抽象类和方法以及封装。通过这些概念,开发者可以构建出更加模块化、易于维护的代码结构。在实际开发中,理解和熟练运用这些基础概念对于提高PHP应用程序的...

      PHP100视频教程23:PHP面向对象开发的学习(七).rar

      - 继承允许一个类(子类)从另一个类(父类)继承属性和方法。这减少了代码重复,提高了代码的复用性。在PHP中,使用`extends`关键字实现继承。 5. **多态** - 多态性允许子类重写父类的方法,使得相同的方法名在...

      PHP5学习对象教程(CHM)

      6. **抽象类与抽象方法**:`abstract`关键字可以声明一个抽象类或方法,抽象类不能实例化,必须由其他类继承并实现其所有抽象方法。 7. **命名空间(Namespace)**:PHP5.3引入了命名空间,用于组织和避免全局作用...

      PHP面向对象之刀客教程01

      对象是类的实例,具有类中定义的属性和方法。例如,你可以创建一个名为`Person`的类,包含`name`和`age`属性,以及`sayHello`方法。 2. 封装:这是面向对象的核心特征之一,它隐藏了对象内部的实现细节,只对外提供...

      PHP100视频教程21:PHP面向对象开发的学习(五).rar

      在PHP中,类是创建对象的蓝图或模板,它定义了一组属性(Variables)和方法(Functions),这些属性和方法构成了对象的行为。例如,你可以创建一个名为"Person"的类,包含姓名、年龄等属性,以及说话、走路等方法。 ...

      php面向对象初步入门教程pdf版

      - **对象(Object)**: 对象是类的实例,具有类所定义的属性和方法。 - **封装(Encapsulation)**: 封装是将数据和操作这些数据的方法绑定在一起,形成一个独立的实体,对外只暴露有限的接口。 - **继承...

      php5面向对象教程【技术文档】

      7. 抽象类(Abstract Class)与抽象方法:抽象类不能被实例化,只能作为其他类的基类。抽象方法没有实现,必须由子类提供。 ```php abstract class AbstractClass { abstract public function someAbstractMethod...

      php5学习对象教程

      1. 类(Class):类是创建对象的蓝图,定义了一组属性(成员变量)和方法(成员函数)。在PHP5中,我们使用`class`关键字来定义一个类,例如: ```php class MyClass { public $property; function __construct() ...

      PHP5 OOP思维导图

      继承允许一个类(子类)从另一个类(父类)继承属性和方法,实现代码复用。使用`extends`关键字实现继承: ```php class ChildClass extends ParentClass { // 子类添加的属性和方法 } ``` **4. 多态** 多态是指...

      PHP5面向对象开发教程第三章-PHP5面向对象高级类特性

      在PHP5中,抽象类通过关键字`abstract`定义,它不能被实例化,而是作为其他类的基类。抽象方法是抽象类中的一个没有实现的方法,用`abstract`关键字声明,必须在子类中实现。这样强制要求子类必须提供具体实现,确保...

    Global site tag (gtag.js) - Google Analytics