用户名:  密码:   
您当前的位置:首页 > 网页设计 >  PHP > 

第14讲 类,对象,封装,继承,多态性,成员变量,方法,常量,$this-和,限定类成员访问权,finalabstractinterfaceclone关键字,instanceof,__construct()、__destruct()

上次修改时间: 2016-03-04 14:55:41      来源:网络总结      作者:钢铁长陈
上一页      路径:DSD\Learn\PHP相关\PHP入门到精通笔记\      下一页

类,对象,封装,继承,多态性,成员变量,方法,常量,$this->和::,限定类成员访问权,final/abstract/interface/clone/关键字,instanceof,__construct()、__destruct()

14.1类,对象,封装,继承,多态性的概念,
14.2定义类,成员方法/变量/常量,构造方法和析构方法,继承和多态的实现,$this->和::,限定类成员访问权限
14.3final/abstract/interface/clone/关键字,对象比较==/===,对象类型检测操作符instanceof,双下划线开头魔术方法如__construct()、__destruct(),__clone()

14.1 面向对象的基本概念  类,对象及其封装,继承,多态性
总结:类是抽象的概念,对象是实例化的类,是实际存在的
1) 面对对象指面向对象编程(OOP),包括三个部分,面向对象的分析(OOA,Object Oriented Analysis),面向对象的设计(OOD,Object Oriented Design),面向对象的编程
面向对象编程(OOD,Object Oriented Design)
2) 面向对象两个重点概念是类和对象。
3) 类: 程序中用类将实际某项功能的代码进行分类管理。类是属性和方法的集合,可把世间万物通过不同的属性和方法进行归类,如人类有身高,体重,胖瘦及肤色等属性,吃饭,学习,走路等活动方法
4) 对象:类是有某项功能的抽象模型,实际应用要对类进行实例化,就引入了对象的概念。黄种人是人这个类的实例对象
5) 面向对象编程的三大特点
封装性:只保留有限的接口与外部联系,开发人员只要知道类如何使用即可,不需关心类是如何实现的
继承性:派生类(也叫子类)自动继承一个或多个基类(父类)的属性和方法,可并重写或添加新的属性和方法,PHP只支持单继承
 即一个派生类有且只能有一个父类,不支持多继承。
多态性:同一类的不同对象,用同一方法可得到不同结果,人走路可以走出不同的结果

14.2 PHP与对象 定义类,类成员方法,成员变量,类常量,构造方法和析构方法,继承和多态的实现,$this->和::,限定类成员访问权限
1) 定义类:用class关键字
 class MyObject{
  //...
 }
2) 成员方法:指类中定义的函数,函数和成员的区别:函数是实现某个独立的功能的代码,成员方法是实现类中的一个行为,是类的一部分
注:函数是独立的代码单元,成员方法是类的函数,是实现类的一个行为
 class MyObject{
  function getObjectName($name) { //声明成员方法
   echo "商品名称为:".$name;  //方法实现的功能
  }
 }
3) 类的实例化类并调用类中方法:使用类中的方法时,要先用new关键字来申明一个对象。例:
 对象名=new 类名(); //实例化类
 对象名 -> 成员方法 //调用类的方法,在对象名和方法名间加->符号
4) 成员变量的定义和调用,成员变量是指类中的变量(也叫属性或字段):
 关键字 成员变量名 //定义成员变量格式
 对象名 -> 成员变量 //调用成员变量,类似调用方法
5) 类常量:指类中的常量,不会改变的量,用const定义常量,调用输出时不需要先实例化对象
 const PI=3.14159; //定义常量不需要关键字
 类名::常量名  //调用变量在类名和常量名间加域操作符(两个冒号),注:不需要先实例化对象
6) 构造方法和析构方法:类实例化一个对象,初始化对象……。
 void __construct([mixed args [, ...]]) //构造方法格式,注:construct前是两下划线
……。。……。……。……这里没懂
 void __destruct (void) //析构方法格式,和构造方法相反,对象销毁时用来释放内存
例子:,
 class MyObject{
  public $object_name; //商品名
  public $object_price; //商品价格
  public $object_num; //商品数量
  public $object_agio;  //商品折扣
  function __construct($name,$price,$num,$agio) {
   $this -> object_name = $name;
   $this -> object_price = $price;
   $this -> object_num =$num;
   $this -> object_agio = $agio;
  }
  function setObjectName($name) { //声明方法setObjectName()
   $this -> object_name = $name;  //设置成员变量值
  }
  function getObjectName() {    //声明方法getObjectName()
   return $this -> object_name;
  }
 }
 $c_book = new Myobject('Western-style clothes',1500,5,8); //实例化对象
 echo $c_book -> getObjectName();  //调用方法
7) 继承和多态的实现:继承用extends关键字来声明,格式:
 class subClass extends superClass { //subClass为派生类名称,superClass为基类名
 ...
 }
8) $this->和::使用,
 $this-> 是伪变量只在类中使用用来调用类中的方法
 :: 该操作符可在未声明任何实例时访问类中的成员方法和成员变量
 格式: 关键字::变量名/常量名/方法名   
 //关键字可以是parent,self,类名,
 //parent 用以调用父类成员变量,方法和常量,
 //self 用来调用当前类静态成员和常量
 //类名 用来调用本类中变量,常量和方法
例子:
 class Book{
  const NAME = 'computer'; //定义常量name
  function __construct() { //构造方法
   echo '本月图书类冠军为:'.Book::NAME.' '; //输出本类中的常量,关键字是类
  }
 }
 class l_book extends book { //给基类book定义一个名为l_book的派生类
  const NAME = 'foreign language'; //声明常量
  function __construct() { //子类的构造方法
   parent::__construct() ; //调用父类的构造方法,因为关键字是parent
   echo '本月图书类冠军为:'.self::NAME.' '; //输出本类的中常量
  }
 }
 $obj = new l_book(); //实例化对象

9) 数据隐藏:限定类成员(变量和方法)的访问权限,public公共成员,private私有成员,protected保护成员本内和子类中被调用
public:公开的,可以类内,类外被其它类和对象调用,子类可以继承和使用父类的公共成员
private:私有的,只能在类内部调用和修改,子类或其它类都不能访问
protected:受保护的,只能在本类和子类中被调用
注:一般为private或protected,是为防止在类外被修改和调用

14.3 PHP对象的高级应用 final最终,abstract抽象,interface接口,clone克隆关键字,对象比较==/===,instanceof操作符对象类型检测,双下划线开头魔术方法如如__construct()、__destruct(),__clone()
1) final关键字:被修饰过的类或方法是最终版本,不能再被继承,不能有子类。如:
 final class class_name { //表该类不能被继承和有子类
  final function method_name() //表该方法不能重写,也可以被覆盖
  //...
 }
2) 抽象类:用abstract关键字声明,只能做其它类的基类,不能被实例化。
  抽象类至少要包含一个抽象方法,方法无方法体,方法功能在子类完成。
 abstract class abstractName{ //声明抽象类,抽象类至少包含一个抽象方法
  abstract function abstractName(); //抽象方法没有方法体,功能实现在子类完成,后一定要有分号
  ...
 }
3) 接口的使用:php只支持单继承,多重继承要使用接口,接口声明用interface关键字,多接口间用逗号连接
 接口类只能包含未实现的方法和成员变量,不能用public外的关键字修饰接口类的成员,方法可不写关键字。例:
 interface InterfaceName{
  function interfaceName1();
  function interfaceName2();
  ...
 }
4) 克隆对象:用clone关键字,相当于对另一个对象进行拷贝。格式:
 $object1 = new Class Name();
 $object2 = clone $object1;
如果要克隆的对象有自己属性和方法,用__clone()方法,以用__clone()方法可以使克隆的对象保持自己的一些行为和属性
__clone()方法,保持自己的行为和属性
例子:
 class MyObject { //定义类
  private $object_type = 'book'; //声明只能在类内使用的私有变量并赋初值book
  public function setType($type){ //声明公共成员方法setType
   $this -> object_type = $type; //给变量object_type赋值
  }
  public function getType() { //声明公共成员方法getType
   return $this -> object_type; //返回变量$object_type的值
  }
  public function __clone() { //声明__clone()方法
   $this ->object_type = 'computer'; //将变量$object_type的值改为computer
  }
 }
 $book1 = new MyObject(); //实例化对象$book1
 $book2 = clone $book1; //
 echo '对象$book1的变量值为:'.$book1 -> getType(); //输出对象book1的值
 echo '<br>';
 echo '对象$book2的变量值为:'.$book2 -> getType();  //输出对象book2的值
 
5) 对象比较:要知道两个对象是克隆还是引用,用比较运算符==或===,两等是比较对象的内容,三等是比较引用地址
$Object2 = $Object1和$Object2 = clone $Object1
例子:
 class MyObject{
  private $name;
  function __construct($name) {
   $this -> name = $name;
  }
 }
 $book = new MyObject('book');
 $cloneBook = clone $book;
 $referBook = $book;
 if($cloneBook == $book) {
  echo '两个对象的内容相等<br>';
 }
 if($referBook === $book) {
  echo '两个对象的引用地址相等<br>';
 }
。。。。。。。。。。。。。。。。。。未明了
6) 对象类型检测:用instanceof操作符可检测当前对象属那个类 ,格式:
 ObjectName instanceof ClassName
7) 魔术方法:以双下划线开头的,如__construct()、__destruct(),__clone()等叫魔术方法,
其它魔术方法:
__set(),__get(),__call(),__sleep(),__wakeup(),__toString(),__autoload()
例:
 class MyObject {
  private $type ='DIY';
  public function __tostring() {  //返回该私有变量的值
   return $this -> type;
  }
 }
 $myComputer = new MyObject();
 echo '对象$myComputer的值为:';
 echo $myComputer;