复习OOP三大特性:封装、继承、多态[PHP]

<?php
/**
 * Created by PhpStorm.
 * User: hao
 * Date: 2016-08-12
 * Time: 16:31
 */
/*对OOP编程三大特性的理解:封装、继承、多态*/
header("Content-type: text/html; charset=utf-8");
/*先理解类和对象的关系*/
//类,就是把一类事物共有的属性和行为提取出来,形成一个物理模型
//对象就是类的一个实例
//类是对象的集合(类是对象的抽象模型),对象是类的一个实例
//========================================================//
/*封装*/
//封装,就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,
//对不可信的进行信息隐藏,只有被授权的操作(方法)才能对数据进行操作。
/*PHP--访问修饰符*/
//既可以修饰方法也可以修饰属性(变量),方法如果没有访问修饰符则默认是public,成员属性必须指定访问修饰符.
// public 表示全局,本类内部,类外部,子类都可以访问
// protected 表示受保护的,只有本类或子类可以访问
// private 表示私有的,只有本类内部可以访问
class People {
    //成员属性
    public $name ;
    protected $age ;
    private $salary ;
    public function __construct($name = "public",$age = "protected",$salary = "private")
    {
        $this->name = $name;
        $this->age = $age;
        $this->salary = $salary;
    }
    public function showme(){
        //访问者三个属性, 在本类内部所有都可以访问
        echo  $this->name. $this->age . $this->salary;
    }
    //定义setAge和getAge方法
    public function setAge($age_val){
        $this->age =  $age_val;
    }
    public function getAge(){
        return $this->age;
    }

}
$hao = new People('hao',22,3000);
echo $hao->showme();//调用内部方法可以正确输出
//echo $hao->age;//直接访问hao的age属性,没有权限,报错
//Fatal error: Cannot access protected property people::$age in
/*可以通过内部public函数来操作protected和private属性*/
$hao->setAge('25');
echo $hao->getAge();
//========================================================//
/*继承*/
//通过"继承"一个现有的类,可以使用已经定义的类中的方法和属性(不能继承父类的私有属性和私有方法)
//继承而产生的类叫做子类。被继承的类,叫做父类,也被成为超类。
//PHP是单继承的,一个类只可以继承一个父类,但一个父类却可以被多个子类所继承。
//子类不能继承父类的私有属性和私有方法。在PHP5中类的方法可以被继承,类的构造函数也能被继承。
//实现代码的简洁,可维护性,重用性!
class Animal{
    public $name;
    protected $age;
    private $weight;
    public function getWeight()
    {
        return $this->weight;
    }
    public function setWeight($weight)
    {
        $this->weight = $weight;
    }
    public function getage()
    {
        return $this->age;
    }
    public function setAge($age)
    {
        $this->age = $age;
    }
    public function showanimal(){
        echo $this->name.$this->age.$this->weight;
    }
}
//Dog继承Animal
class Dog extends  Animal{
    //Dog的方法
    public function lovefood(){
        echo "骨头";
    }
}
//实例化Dog
$xiaohei = new Dog();
$xiaohei->name = '黑贝';
$xiaohei->setAge('3岁');//直接调用父类的方法
$xiaohei->setWeight('10kg');//直接调用父类的方法
$xiaohei->showanimal();
$xiaohei->lovefood();
//---------------------------------------------------------//
/*构造函数的继承*/
//PHP的构造函数继承必须满足以下条件:
//1.当父类有构造函数的声明时,子类也必须有声明,否则会出错。
//2.在执行父类的构造函数时,必须在子类中引用parent关键字。
echo "<br />";
class Parent_class{
    public function __construct($name)
    {
        echo '父辈'.$name.'!!!!';
    }
}

class Boy extends Parent_class {
    public function __construct($name)
    {
        parent::__construct($name);
        echo 'this is Boy';
    }
}
$wang = new Boy("这里");
echo "<br />";
//在子类中父类的构造函数会不会执行,分两种情况:
//1,如子类不定义构造函数 __construct(),则父类的构造函数默认会被继承下来,且会自动执行。
//2,如子类定义了构造函数 __construct(),因为构造函数名也是__construct(),所以子类的构造函数实际上是覆盖(override)了父类的构造函数。这时执行的是该子类的构造函数。
//   这时如果要在子类里执行父类的构造函数,必须执行类似以下语句:
//   parent::__construct();
//========================================================//
/*多态*/
//"多种状态"在面向对象语言中,接口的多种不同的实现方式即为多态
//重载是类的多态的一种实现
//PHP手册Note:
//PHP中的"重载"与其它绝大多数面向对象语言不同。
//传统的"重载"是用于提供多个同名的类方法,但各方法的参数类型和个数不同。
// 摘自网上的例子:【示例】例举了采用多态的方式改写上例。其代码如下所示。代码如下:
interface Animal {
    public function run();
}
class Dog implements Animal {
    public function run() {
        echo 'dog run';
    }
}
class  Cat implements Animal{
    public function run() {
        echo 'cat run';
    }
}
class Context {
    private $_animal;
    public function __construct(Animal $animal) {
        $this->_animal = $animal;
    }
    public function run() {
        $this->_animal->run();
    }
}
$dog = new Dog();
$context = new Context($dog);
$context->run(); // dog run

$cat = new Cat();
$context = new Context($cat);
$context->run();//cat run 
// 对于不同的动物,其跑的方式不一样, 
//当在环境中跑的时候,根据所传递进来的动物执行相对应的跑操作。 
class employee{ //定义员工父类
    protected function working(){ //定义员工工作,需要在子类的实现
        echo "本方法需要在子类中重载!";
    }
}
class painter extends employee{ //定义油漆工类
    public function working(){ //实现继承的工作方法
        echo "油漆工正在刷漆!<br />";
    }
}
class typist extends employee{ //定义打字员类
    public function working(){
        echo "打字员正在打字!<br />";
    }
}
class manager extends employee{ //定义经理类
    public function working(){
        echo "经理正在开会!<br />";
    }
}
function printworking($obj){ //定义处理方法
    if($obj instanceof employee){ //若是员工对象,则显示其工作状态
        $obj->working();
    }else{ //否则显示错误信息
        echo "Error: 对象错误!";
    }
}
printworking(new painter());//显示油漆工的工作
printworking(new typist());//显示打字员的工作
printworking(new manager());//显示经理的工作  

原创文章,转载请注明: 转载自HSBLOG

本文链接地址: 复习OOP三大特性:封装、继承、多态[PHP]