面向对象OOP

1.1类的描述

类与对象的关系:在程序中,先有类,再有对象;对象是类的实例
面向对象的三大特性:封装、继承和多态
优点:1、可维护性 2、重用性 3、扩展性 4、灵活性

1.2定义格式

[修饰符] class 类名{
	[成员属性]
	[成员方法]
}

[修饰符] class 类名 [extends 父类] [implements 接口1[,接口2...]]{
   【成员属性】定义变量   
   【成员方法】定义函数
}

1.3封装(访问控制)

public(公有) protected(受保护) private(私有)
本类 Y Y Y
子类 Y Y N
类外 N N N

方法和变量的访问

 [伪变量 $this]
 描述:代表的是对象,表示的是自己(注意:只能出现在方法中)
 我们可以在任意一个方法中访问自己的属性和方法
 class new{
 	 public $name='john';
 	 public function say(){}
	 public function eat()
	 {
			echo $this->name . '在吃鸡';// 通过$this访问自己的属性与方法
			$this->say();// 调用自己的方法
	 }
 }

2.0构造函数和析构函数


2.1. 构造方法(构造函数):
	当我们通过new关键字来创建一个对象时,第一个自动执行的方法称为构造方法。
	方法名__construct();  主要用于初始化对象。
	(在php4.0时可使用与类名重名的方法作为构造方法)
	
2.2. 析构方法:当这个对象被销毁时最后自动调用的方法,称为析构方法。
	 __destruct(); 目的是释放资源(如关闭连接、文件,释放资源)

3.0继承


5.1. 继承:extends
	假如B类继承A类,那么就继承了A中所有非私有属性和方法(函数)。
	其中A叫父类(基类)。 B叫子类(派生类)
	 class B extends A{ 
		....
	 }
	注意:在php中类只支持【单一继承】,就是一类只能继承一个父类。

    parent关键字:若子类出现覆盖父类的方法,那么有时还想调用被覆盖掉了的方法,
    我们就是用关键字【parent::父类方法】还有使用类名
    ------------------------------------------------------------------
    parent 	表示的是类,代表的是父类
	self    表示的是类,代表的是自己
	$this 	表示的的对象,代表的是自己
	class A{
		public function __construct(){
			//....
		}
	}
	class B extends A{
		public function __construct(){
			parent::__construct();//注意要调用一下父类的构造方法
			//....
		}
	}

4.0. final、static和const


4.1 final关键字:主要用于修饰类与成员方法(函数)
   使用final关键字修饰类,表示这个类不可以有子类。(一般是没有必要有子类的,防止有子类的覆盖)
   使用final关键字修饰的方法,不可以在子类中被覆盖(重写)。
   目的:一是为了安全,二是没有必要
   
*4.2 static关键字:表示静态的意思: 用于修饰类的属性和方法
   *static关键字修饰方法称为静态方法,可以不用new(实例化)就可以直接使用方法:如 类名::方法名
   注意:静态方法在实例化后的对象也可以访问  //$对象名->静态方法名
	  
   static关键字修饰属性称为静态属性,可以不用new(实例化)就可以直接访问属性:如 类名::属性名
   注意:静态属性在实例化后的对象不可以访问; //$对象名->静态属性名
   注意:静态属性是共享的。也就是new很多对象也是共用一个属性
   *在静态方法中不可以使用非静态的内容。就是不让使用$this
   在类的方法中可以使用其他静态属性和静态方法,不过要使用self关键字:
   如 【self::静态属性名】或【self::静态方法名】
   (>PHP5.3)在一个类的方法中若没有出现$this的调用,默认此方法为静态方法。
			 
*4.3. const关键字: 在类中修饰成员属性,将其定义成常量(不可修改的),
	一般要求常量名都是大写的,没有“$”符 没有其他修饰符(public)
	在其他方法中使用常量: 【self::常量名】
	定义格式:  const 成员常量名="值"; 
    使用:在类的方法中:   echo self::成员常量名;
         在类的外部:     echo 类名::成员常量名;

4.4. 检测当前对象是否是属性指定的类
	instanceof 用于确定一个 PHP 变量是否属于某一类 class 的实例:
	is_a — 如果对象属于该类或该类是此对象的父类则返回 TRUE

5.0类型约束


	类型约束可以使用的类型是:数组或对象。
	若指定的一个类名,那么可传入本类及子类的对象进去。
	可以使用的约束类型:(复合类型)数组array,类名、抽象类名、接口名
	class MyClass
	{
		/**
		 * 测试函数
		 * 第一个参数必须为类OtherClass的一个对象
		 */
		public function test(OtherClass $otherclass) {
			echo $otherclass->var;
		}
		
		/**
		 * 另一个测试函数
		 * 第一个参数必须为数组 
		 */
		public function test_array(array $input_array) {
			print_r($input_array);
		}
	}

6.0其他魔术方法:


1. 对象复制clone 克隆一个对象,因为对象属于引用类型,普通的“=”号属于引用赋值,
	所有需要clone来复制一份。
	魔术方法:__clone() 当执行clone克隆时会自动调用的方法。

2. __toString()方法:魔术方法,当我们直接要输出一个对象时,如echo $a,print $a,
	那么会自动调用的方法。
	注意:__toString()方法必须返回一个字串类型的值。


3. *自动加载类函数__autoload(类名): 
	当new 实例化一个对象时,这个类若不存在,则自动调用此函数,并将类名存入参数
	我可以使用这个实现类的自动加载。

7.0对象序列化(串行化)


serialize() -- 串行化
unserialize() -- 反串行化

php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示。
unserialize()函数能够重新把字符串变回php原来的值。 
序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。

8.0抽象类


当类中有一个方法,他没有方法体,也就是没有花括号,直接分号结束。
如 public abstract function fun();
像这种方法我们叫抽象方法,必须使用关键字abstract定义,
包含这种方法的类必须是抽象类也要使用关键字abstract加以声明。

抽象类的特点:
不能实例化,也就new成对象
若想使用抽象类,就必须定义一个类去继承这个抽象类,并定义覆盖父类的抽象方法(实现抽象方法)。
其实抽象类对于子类(实现类),有一个约束的作用,
含有抽象方法的类肯定是抽象类,但是不是所有的抽象类都必须包含抽象方法。

9.0接口


假如一个抽象类中所有的方法都是抽象的,那么我们可以使用另外一种方式定义:接口
接口使用关键字interface来定义,接口中只能有常量与抽象方法。
 // 格式:
 interface 接口名{
	[常量定义]
	[抽象方法定义] //注意不要有abstract关键字
 } 

 // 实现方式
 class 类名 implements 接口名,接口名2{
	//...
 }

10.0多态


多态(使用方式):对于同一个方法,传入不同对象,实现了不同的效果,这个就是多态的意思。
需要使用的技术:继承或实现,方法的覆盖(重写)。

猜你喜欢

转载自blog.csdn.net/qq_38671214/article/details/86640529