<?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]