php面向对象的特点
一、继承
1、什么是继承?
面向对象的思想和我们的生活是息息相通的。
我们先分析一个生活中的例子:
自行车、折叠车、电动车的关系。
继承是面向对象最重要的特点之一,就是可以实现对类的复用。
通过“继承”一个现有的类,可以使用已经定义的类中的方法和属性。
继承而产生的类叫做子类。
被继承的类,叫做父类,也被成为超类。
PHP 是单继承的,一个类只可以继承一个父类,但一个父类却可以被多个子类所继承。
从子类的角度看,它“ 继承( inherit , extends) ”自父类;而从父类的角度看,它“派生( derive) ”子类。它们指的都是同一个动作,只是角度不同而已。
子类不能继承父类的私有属性和私有方法。
在 PHP5 中类的方法可以被继承,类的构造函数也能被继承。
简单例子:
动物------>狗
class Animal{
public $name='我是动物';
public function getName(){
return $this->name;
}
}
class Dog extends Animal{
public function __construct(){
$this->name='这个是狗狗';
}
}
各位同学尝试以继承的方式实现第二次的分析
在 PHP5 中,可以在类的属性和方法前面加上一个修饰符( modifier),来对类进行一些访问
上的控制。
2.重写
就是父类和子类有个相同的函数,子类可以改写这个函数。
如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖( override),也称为方法的重写。
当对父类的方法进行重写时,子类中的方法必须和父类中对应的方法具有相同的方法名称, 在 PHP5 中不限制输入参数类型、参数数量和返回值类型。(这点和 JAVA 不同)
子类中的覆盖方法不能使用比父类中被覆盖方法更严格的访问权限。
3.This
PHP5 中为解决变量的命名冲突和不确定性问题,引入关键字“$this”代表其所在当前对象。
$this 在构造函数中指该构造函数所创建的新对象
在类中使用当前对象的属性和方法,必须使用$this->取值。
方法内的局部变量,不属于对象,不使用$this 关键字取值。
现在我们知道了如何访问对象中的成员,是通过”对象->成员”的方式访问的,这是在对象的外部去访问对象中成员的形式, 那么如果我想在对象的内部,让对象里的方法访问本对象的属性, 或是对象中的方法去调用本对象的其它方法这时我们怎么办?因为对象里面的所有的成员都要用对象来调用,包括对象的内部成员之间的调用,所以在PHP里面给 我提供了一个本对象的引用$this, 每个对象里面都有一个对象的引用$this来代表这个对象,完成对象内部成员的调用, this的本意就是“这个”的意思。$this就是对象内部代表这个对象的引用
4.Parent
当子类继承父类的方法,子类覆盖父类,如果要调用父类的这个方法,使用parent::
PHP5 中使用 parent::来引用父类的方法。
parent:: 可用于调用父类中定义的成员方法。
parent::的追溯不仅于直接父类。
4、继承使用extends关键字
extends
一个类可以在声明中用 extends 关键字继承另一个类的方法和属性。PHP不支持多重继承,一个类只能继承一个基类。
被继承的方法和属性可以通过用同样的名字重新声明被覆盖。但是如果父类定义方法时使用了 final,则该方法不可被覆盖。可以通过 parent:: 来访问被覆盖的方法或属性。
当覆盖方法时,参数必须保持一致否则 PHP 将发出 E_STRICT 级别的错误信息。但构造函数例外,构造函数可在被覆盖时使用不同的参数。
继承已为大家所熟知的一个程序设计特性,PHP 的对象模型也使用了继承。继承将会影响到类与类,对象与对象之间的关系。
比如,当扩展一个类,子类就会继承父类所有公有的和受保护的方法。除非子类覆盖了父类的方法,被继承的方法都会保留其原有功能。
继承对于功能的设计和抽象是非常有用的,而且对于类似的对象增加新功能就无须重新再写这些公用的功能。
Note:
除非使用了自动加载,否则一个类必须在使用之前被定义。如果一个类扩展了另一个,则父类必须在子类之前被声明。此规则适用于类继承其它类与接口。
继承示例
<?php
class foo
{
public function printItem ( $string )
{
echo 'Foo: ' . $string . PHP_EOL ;
}
public function printPHP ()
{
echo 'PHP is great.' . PHP_EOL ;
}
}
class bar extends foo
{
public function printItem ( $string )
{
echo 'Bar: ' . $string . PHP_EOL ;
}
}
$foo = new foo ();
$bar = new bar ();
$foo -> printItem ( 'baz' ); // Output: 'Foo: baz'
$foo -> printPHP (); // Output: 'PHP is great'
$bar -> printItem ( 'baz' ); // Output: 'Bar: baz'
$bar -> printPHP (); // Output: 'PHP is great'
?>
构造函数可以被继承
二、封装
函数也是一种封装,封装(隐藏)的是实现程序的细节的描述。
类封装隐藏的是当前信息的类容
文件夹也是一个封装,隐藏的是文件
1、什么是封装?
定义:封装就是把对象的属性和行为结合成一个独立的相同单位,并尽可能隐蔽对象的内部细节
优点:
信息隐蔽,封装即隐藏。
封装的原则在软件上的反映是:要求使对象以外的部分不能随意存取对象的内部数据(属性),从而有效的避免了外部错误对它的“交叉感染”,使软件错误能够局部化,大大减少查错和排错的难度。
类的封装性带来的优点:隐藏类的实现细节,让使用者只能通过事先定义好的方法来访问数据,可以方便的加入逻辑控制,进行数据检查,限制对属性的不合理操作。便于修改增强代码的可维护性
如:
//计算三角形的面积函数
public function area($bottom, $height){
return $bottom*$height/2;
}
如上的面积函数,我们只要把对应的参数底边长度和高度传递到该函数中,就可以得到计算的面积结果,至于具体的实现步骤和过程可以忽略,而由实现该面积计算功能的函数去处理。
PHP 中通过将数据封装、声明为私有的(private),再提供一个或多个公开的( public)方法实现对该属性的操作,以实现下述目的:
隐藏一个类的实现细节;
防止对封装数据的未经授权的访问。使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作;
有利于保证数据的完整性;
便于修改,增强代码的可维护性;
三、多态
1、定义
对象的多态性是指在父类中定义的属性或行为被子类继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一个属性或行为在父类及其各个子类中具有不同的语义。
多态这个概念,在 Java 中指的是变量可以指向的对象的类型,可是变量声明类型的子类。对象一旦创建,它的类型是不变的,多态的是变量。
在 PHP5 中,变量的类型是不确定的,一个变量可以指向任何类型的数值、字符串、对
象、资源等。我们无法说 PHP5 中多态的是变量。
我们只能说在 PHP5 中,多态应用在方法参数的类型提示位置。
一个类的任何子类对象都可以满足以当前类型作为类型提示的类型要求。
所有实现这个接口的类,都可以满足以接口类型作为类型提示的方法参数要求。
简单的说,一个类拥有其父类、和已实现接口的身份。
多态的实现
1 通过实现接口实现多态
2 通过继承实现多态