面向对象程序设计(Object Oriented Programming,简称OOP)是一种计算机编程架构。面向对象思想的核心:计算机模拟现实世界,解决现实世界的问题。注意:面向对象思想很重要,其次是编程语言的语法。相比于面向过程,两者思想方式不同,面向过程注重功能,怎么一步一步去实现,其程序基本单位大多是函数组成的;而面向对象注重对象,是谁去做这个事情,也就是行为以及状态,其程序基本单位是对象,对象是通过类的实例化产生的。自PHP5起完全重写了对象模型以得到更佳性能和更多特性,PHP5具有完整的对象模型。但是PHP并不是一个纯面向对象的语言,它既可以采用传统面向过程进行编程,也可以使用面向对象设计程序。
目录
【7】封装性-关键词(public,protected,private)
【9】访问控制-关键词(public,protected,private)
【13】关键字this,self,parent,static
【16】接口interface与实现接口implements
【1】类的基本定义-关键词(class)
问什么要定义类,想要对应的实例对象,通过规范类的属性和方法从而获取符合要求的对象。
想要对象前,要有类定义,每个类的定义都是以关键词Class开头,后面类名,后面跟着一对花括号,里面包含有类的属性与方法的定义。那么类名实际上和变量名、函数名这些命名规则很相似,都需要遵守PHP中自定义名称的规则,如果由多个单词组成,一般每个单词字母开头都大写,类名最好也要见名知其意。一般类的声明从类的属性和类的方法来考虑,不过也可以什么也没有。
类的属性,就相当于这个类的变量,就是成员属性,举个例子,人类的属性就有姓名,年龄等属性,所以这个属性一般描述这个类的基本特征;属性声明是由关键字 public,protected或者 private开头,设定其属性的访问控制可见性,然后跟一个普通的变量声明来组成。PHP5为了向后兼容仍然可以用var声明属性,被认为是public修饰。PHP属性中的变量可以初始化,但是初始化的值必须是常数,这里的常数是指 PHP 脚本在编译阶段时就可以得到其值,而不依赖于运行时的信息才能求值。
类的方法,就相当于这个类的函数,也就是成员方法,例如人类可以学习,说话等行为,所以这个方法一般描述这个类的行为。也就是这个类的属性和方法都是和这个类有关的,不要定义一些和类无关的,虽然程序不会报错,但是不符合面向对象思想。方法的声明也是由关键字 public,protected或者 private开头,设定其方法的访问控制可见性,后面跟一个函数。
//类的基本定义
class Person{#定义类,用class后面 类名
public $name;#定义人类的属性,姓名
public function study(){#定义人类的方法,学习
echo 'OOP';
}
}
【2】类实例化对象-关键词(new)
面向对象程序基本单位就是对象,对象是通过类实例化产生的,所以明白,先有类定义才有对象。利用关键词new后面跟上类名,如果实例化的时候需要传入参数(可能是构造函数传参)可以带上小括号,当然也可以省略。另外如果定义的类属于一个命名空间,那么需要是使用完整的名称。
$tacks1 = new Person;#创建一个Person的对象 引用名为$tacks1;
$tacks2 = new Person();#再创建一个Person的对象,引用名为$tacks2;
$class = 'Person'; #还记得我们之前说的可变变量,利用一个变量存放类名
$tacks3 = new $class;#也可以进行船舰
var_dump($tacks1,$tacks2,$tacks3);
/*
object(Person)[1]
public 'name' => null
object(Person)[2]
public 'name' => null
object(Person)[3]
public 'name' => null
*/
一个类可以实例化多个对象,并且对象之间是互相独立的,相当于再内存中开辟了三份空间存放每个对象。但是这三个对象的类型都是同一个类型Person类。
对象类型的数据是一种占用空间比较大的类型,而且长度总是不确定的,一般对象被创建后都是被存放到堆内存中的,但是对象的引用名称是放在栈里的。例如($tacks1 = new Person;),等号左边为对应的引用;右边是真正的实例对象,放在堆空间中。这样在程序运行的时候,栈中的数据可以直接进行存取,堆中的数据则是通过对象的引用名称进行访问。
【3】访问成员属性以及方法 -访问符(->)
我们知道怎么创建对象了,那么如何去访问这些对象的成员属性和成员方法。一般可以通过对象的引用名后面加上一个特殊的运算符号"->"来完成对象成员的访问。
可以看一下,下面的例子,我定义一个Person的类,其属性eyes默认就直接赋值为2,还有一个study()成员方法。我通过new实例化后,利用->访问其属性和方法。
class Person{
public $eyes = 2;
public function study(){
echo 'I study OOP!';
}
}
$tacks = new Person;
echo $tacks->eyes,'<br/>';
$tacks->study();
【4】特殊对象的引用-关键词(this)
我们知道在类外利用实例化对象去访问其属性和方法,但是在对象内部我们如何使用自己的属性或者方法?这里我们可以用到$this,可以在对象内部来访问,相当于代表自己。
class Person{#定义一个类
public $name;
public function intro(){
echo 'I study OOP!'.$this->getName();#调用自己的getName()方法
#echo 'I study OOP!',$this->getName();#调用自己的getName()方法
}
public function getName(){
echo 'My name is '.$this->name.'<br/>';#调用对象自己的name属性
}
}
$tacks = new Person;
$tacks->name = 'Tacks';//对对象tacks的属性name进行赋值
$tacks->intro();//调用对象的intro方法
这里输出结果有点小奇怪,按道理应该先输出I study OOP,但是结果是先执行了getName()。上面我用的.连接符,如果改用逗号就是我正常的结果。
//My name is Tacks
//I study OOP!
【5】构造方法(__construct())
我们看到,上面一个例子中,实例化对象后,还需要自己手动对属性进行赋值。那么实际上每个类中都会有一个叫做构造方法特殊的成员方法,上面咱们并没有声明,实际上默认会存在一个没有参数列表并且内容为空的构造方法。这个构造方法,在每次创建对象的时候,也就是new一个实例化对象,会自动调用构造方法,同样它也算是类的方法,但是无法用对象直接进行调用。它主要的工作就是为了完成实例化对象前的一些操作。
声明构造方法和普通声明方法类似。我们用__construct()进行声明。具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。那么我们就可以在对象实例化前对属性进行赋值操作,注意如果需要传入参数,那么实例化类的时候,后面要加小括号传入参数。
另外为了向后兼容方法名与类名一样也是表示构造方法,但是我们不常用这种同名的,因为万一类名改变了,构造方法的类名也要统一修改。 而且后期如果使用了命名空间,这种声明构造方法将不会被使用。因此不建议使用与类名一样的方法。
class Person{
public $name;
public function __construct($name){
$this->name = $name;//实例化对象的前进行赋值。
}
public function intro(){
echo 'I study OOP! My name is '.$this->name;
}
}
$tacks = new Person('Tacks');#注意要加小括号向构造函数进行传入参数。
$tacks->intro();//I study OOP! My name is Tacks
【6】析构方法(__destruct())
与构造方法对应的就是析构方法,PHP 5 同样引入了析构方法的概念,这类似于其它面向对象的语言,如 C++。析构方法会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。声明的话用__destruct()。

本文详细介绍了PHP面向对象编程的基础概念和技术要点,包括类的定义、对象实例化、成员属性及方法的访问、构造与析构方法、封装性、继承性、访问控制、类常量、静态成员、final关键字、抽象类、接口、多态性等。
最低0.47元/天 解锁文章
4416

被折叠的 条评论
为什么被折叠?



