PHP 面向对象基础知识

面向对象(OOP) object oriented programming

1.什么是面向对象?
世间万物都是对象,抽象的也是对象,可见的不可见的都是对象。
面向对象就是以人类的思维方式去构建代码,让读者能够更好的理解代码。

面向对象的好处:代码的 (可读性,可用性,扩展性,稳定性,可维护性)

2.什么是类?
定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作。
数据的形式即是属性。对数据的操作即是方法。

3.什么是对象?
是类的实例。

4.面向对象的三要素:封装、继承、多态

访问修饰符

1)public 公共的
所有的位置都可以使用。
2)protected 受保护的
只有类本身和他的子类可以使用
3)private 私有的
只有类本身可用

魔术方法:一共16种
构造方法:__construct()
会在类实例化的时候第一个执行。
析构方法:__destruct()
会在类销毁的时候执行。
__call 方法,在访问不存在的方法时候执行。
callStatic方法,在访问不存在的静态方法时执行。
get 在访问一个不存在的属性时执行。
set 在设置一个不存在的属性时执行。
autoLoad 自动加载方法。
魔术常量:
1)
__ LINE__当前的行号 报错的时候用的最多。
2)
__ FILE __ 当前文件的完整的路径和文件名。
3)
__ DIR __ 当前文件所在的路径
4)
__ FUNCTION __ 当前函数的名称
5)
__ CLASS __ 当前的类名
6)
__ TRAIT __ trait 的名字(什么是trait后面我们会专门讲一下这个)
7)
__ METHOD __ 类的方法名
8)
__ NAMESPACE __ 当前的命名空间

PHP中继承是个通过extends 关键字来实现,一个类只能继承一个类。一个类可以被多个类继承。如果想多继承的时候就只能是链式继承。这样才能够实现类似多继承。PHP在5.3.0版本为了提供一个更好的解决方案,引入了trait类。trait类就是为了解决多继承问题的。有了trait类,在类中就可以使用use来将trait类引入到类中,这样就可以访问trait类中的内容了。

PHP在继承的问题中还会涉及到一个重写的问题。就是当父类的方法在子类中出现时。表示子类重写了父类的方法。那么当trait类中的方法在优先级方面要高于父类,要低于当前类。那么意味着,如果一个类继承了父类的方法setName,引入了trait中也有setName方法,那么这时候实例化当前类,使用setName则会去访问trait中的setName 方法。

静态(static):修饰符,静态方法或者属性是和类相关的方法,不属于任何一个对象(实例)。静态方法不能调用非静态属性和方法,不能使用关键字this.静态方法和属性可以用类名::来访问,对于方法来说,可以使用实例化的对象加箭头的方式来访问类,对于属性是不可以的。静态方法中可以使用self或者static来访问静态的方法和静态的属性。

his、self、parent这个三个关键字:
This是指向当前对象(在静态方法中不能够使用this),self是指向当前类,主要用来访问静态变量和方法,在静态方法中访问,parent是指向了父类。

接口:interface 定义了类的实现方法的一种特殊的类

接口中只有没有方法体的方法名和常量。接口不可以被实例化,只有实现接口的类才可以被实例化。接口的方法都是公共的。

一个类要实现一个接口就必须将接口的所有方法都实现了。一个类可以实现多个接口。实现用implements关键字。

抽象类:PHP 5 支持抽象类和抽象方法。定义为抽象的类不能被实例化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。

重写:就是子类的方法名和父类的相同,这样的关系就被称为是重写。
如果父类的方法有final修饰符时,则不能够重写。

接下来考虑一个问题,为什么要让构造方法私有化:
如果一个类中他的构造方法是私有的,那么意味着他不可以被正常的实例化,那这样做又有什么作用呢?如果一个类不能够被实例化,那么这个类里面的方法和属性就不可以被外界使用,这样的话就没有任何的作用。

这一种设计模式(单例):在实际应用当中,有很多的类不希望用户不停的实例化(例如数据库连接),如果限制代码实例化,就通过将构造函数私有化来实现。当然__clone 方法也需要私有化,保证当前类不能被克隆。那么如何实例化或者得到类的实例化呢?
就需要在类中写一个静态方法,通过静态方法来获取类的实例。如何去判断类的实例是否被实例化过。就需要一个静态变量将类的实例保存起来。只要判断静态变量的内容就可以确定类是否被实例,同时当类被实例化后也可以返回类的实例的地址。对应的单例模式的代码如下:

class Db{
 	private function __construct(){
	//这里的构造函数要用私有的
	}
	private function __clone(){
	//克隆方法也要设置成私有的
	}
	private static dbInstance; //创建一个私有的静态变量来存储实例化好的类。

	//创建一个公共的获取实例的方法,通过静态的访问方式可以访问到该方法,从而获取到类的实例
	public function getInstance(){
	
		if (!self::$dbInstance instanceof self) {
			self::$dbInstance= new self();
		}
	
		return self::$dbInstance;
	
	}

}

以上的代码就是实现一个类的单例模式。当然这里面还有很多可以扩展的地方。就不一一展开来细说了。这里主要想说一些这个设计模式的最核心的内容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章