面向对象(三)三大特性

访问控制(可见性)

对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。被定义为公有的类成员可以在任何地方被访问。被定义为受保护的类成员则可以被其自身以及其子类和父类访问被定义为私有的类成员则只能被其定义所在的类访问。

1、类属性必须定义为公有,受保护,私有之一

受保护属性可以被子类继承或重载,私有属性不能被继承,受保护的和私有的都不能在类外部直接访问

class MyClass
{
    public $public = 'Public';
    protected $protected = 'Protected';
    private $private = 'Private';

    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

$obj = new MyClass();
echo $obj->public; // 这行能被正常执行
echo $obj->protected; // 这行会产生一个致命错误
echo $obj->private; // 这行也会产生一个致命错误
$obj->printHello(); // 输出 Public、Protected 和 Private
class MyClass2 extends MyClass
{
    // 可以对 public 和 protected 进行重定义,但 private 而不能
    protected $protected = 'Protected2';

    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

$obj2 = new MyClass2();
echo $obj2->public; // 这行能被正常执行
echo $obj2->private; // 未定义 private
echo $obj2->protected; // 这行会产生一个致命错误
$obj2->printHello(); // 输出 Public、Protected2 和 Undefined

 2、类中的方法可以被定义为公有,私有或受保护。如果没有设置这些关键字,则该方法默认为公有。

私有方法不能被继承且不能被重载

方法中的参数前面如果有类名约束的话,参数则是该类的一个实例

同一个类的对象即使不是同一个实例也可以互相访问对方的私有与受保护成员。这是由于在这些对象的内部具体实现的细节都是已知的。

class Test
{
  private $foo;

  public function __construct($foo)
  {
    $this->foo = $foo;
  }

  private function bar()
  {
    echo 'Accessed the private method.';
  }

  public function baz(Test $other)
  {
    // We can change the private property:
    $other->foo = 'hello';
    var_dump($other->foo);

    // We can also call the private method:
    $other->bar();
  }
}

$test = new Test('test');

$test->baz(new Test('other'));
/*
string(5) "hello"
Accessed the private method.
*/

一、封装性

  • 把对象的全部成员属性和成员方法结合在一起,形成一个不可分割的独立单位(即对象)
  • 信息隐蔽,即尽可能隐蔽对象的内部细节,只保留有限的对外接口使之与外部发生联系

封装的原则就是要求对象以外的部分不能随意存取对象的内部数据(成员属性和方法)

private、protected、public

如果不让用户在对象的外部设置私有属性的值,但可以获取私有属性的值,或者允许用户对私有属性赋值,但需要限制一些赋值的条件,解决的办法就是在对象的内部声明一些操作私有属性的公有方法。

二、继承性 extends

当扩展一个类,子类就会继承父类所有公有的和受保护的方法。除非子类覆盖了父类的方法,被继承的方法都会保留其原有功能。

除非使用了自动加载,否则一个类必须在使用之前被定义。如果一个类扩展了另一个,则父类必须在子类之前被声明。此规则适用于类继承其它类与接口。

1、继承性就是通过子类对已存在的父类(基类)进行功能扩展

2、增加了代码的可重用性

3、php只支持单继承,即一个类只能直接从另一个类中继承数据,但一个类可以有多个子类

4、在子类重载的方法中调用父类中被覆盖方法的功能。这样就可以在子类重写的方法中继承使用父类中继承过来并被覆盖的方法,然后再按要求多添加一些新功能。格式是parent::方法名

5、在子类中重写的方法的访问权限一定不能低于父类被覆盖的方法的访问权限

三、多态性

多态最直接的定义就是让具有继承关系的不同类对象,可以对相同名称的成员函数进行调用,产生不同的反应效果。

所谓多态性是指一段程序能够处理多种类型对象的能力

在php中,多态性指的就是方法的重写。方法重写是指在一个子类中可以重新修改父类中的某些方法,使其具有自己的特征。重写要求子类的方法和父类的方法名称相同,这可以通过声明抽象类或接口来规范。

3.1多态性的应用

我们通过计算机USB设备的应用来介绍一下面向对象中的多态特性。目前USB设置的种类有十几种,例如USB鼠标、USB键盘、USB存储设备等,这些计算机的外部设备都是通过USB接口连接计算机以后,被计算机调用并启动执行的。也就是计算机正常运行的同时,每插入一种不同的USB设备,就为计算机扩展一样功能,这正是我们所说的多态特征。那么为什么每个USB设备不一样,但都可以被计算机应用呢?那是因为每个USB设备都要遵守计算机USB接口的开发规范,都有相同的能被计算机加载并启用的方法,但运行各自相应的功能。这也正是我们对多态的定义。

假设我们有一个主程序已经开发完成,需要在后期由其他开发人员为其扩展一些功能,但需要在不改动主程序的基础上就可以加载这些扩展的功能模块,其实也就是为程序开发一些插件这就需要在主程序中为扩展的插件程序写好接口规范,每个插件只有按照规范去实现自己的功能,才能被主程序应用到

在计算机中应用USB设备的程序设计如下所示:

//声明一个计算机类,去使用USB设备
class Computer {
	//计算机类中的一个方法可以应用任何一种USB设备
	function useUSB($usb) {
		$usb -> run();
	}
}

/*定义一个USB接口,让每个USB设备都遵守这个规范。也就是子类设备必须重写run方法,
这样才能被计算机应用到,并按设备自己的功能去实现它*/
interface USB {

	function run();
}


//扩展一个USB键盘设备,实现USB接口
class Ukey implements USB {
	//按键盘的功能实现接口中的方法
	function run() {
		echo "运行USB键盘设备<br>";
	}
}

//扩展一个USB鼠标设备,实现USB接口
class Umouse implements USB {
	//按鼠标的功能实现接口中的方法
	function run() {
		echo "运行USB鼠标设备<br>";
	}
}

//扩展一个USB存储设备,实现USB接口
class Ustore implements USB {
	//按存储的功能实现接口中的方法
	function run() {
		echo "运行USB存储设备";
	}
}

$computer = new Computer;

$computer -> useUSB( new Ukey() );//为计算机插入一个USB键盘设备,并运行
$computer -> useUSB( new Umouse() );
$computer -> useUSB( new Ustore() );

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值