php基础-面向对象
面向对象和面向过程的区别:优缺点
类 : 具有相同特性和行为的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象,类实际上就是一种数据类型。
在面向对象的编程语言中,“类” 是一个独立的程序单位,它应该有一个类名并包括 “属性” 说明和“方法” 说明两个主要部分。
类的成员
类的成员主要包括 属性 和 方法。
属性 : 又叫成员属性或成员变量 , 其本质就是变量,但是它也是和某个具体的类是绑定起来的。它就是
这个类的特征,比如说狗的体重、身高等等。
方法 : 又叫成员方法 , 其本质就是函数, 但是它也是和某个具体的类是绑定起来的。 它是这个类的一些
固有的行为,比如说狗的奔跑、吃饭、睡觉等等。
对象的成员
既然对象是类的单独的一个个体 , 那么这个对象也会有该类的属性和方法:
对象的状态(属性) : 一个对象用数据值来描述它的状态。
对象的操作(方法) : 用于改变对象的状态,对象及其操作就是对象的行为。
对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中。
思考 : 狗的毛色是属性还是方法? 狗的嗅觉是属性还是方法?狗吃东西是属性还是方法?
面向对象编程的三大特性 封装 , 继承 , 多态
定义属性标语法格式:
访问权限修饰符 属性名[= 默认值];
public $name = '小白';
需要注意的是 , 定义属性的时候 , 访问权限修饰符必须存在(不能省略)。
定义方法语法格式: [访问权限修饰符] 方法/函数标识符 方法名 (参数...) {}
public function eat() { echo "狗狗啃骨头"; }
一个完整的类包含属性和方法。
访问修饰符:
1.public !
public : 被定义为公有的类成员可以在任何地方被访问。
在子类中可以通过 self::属性名(或方法名) 调用public方法或属性,parent::方法名 调用父类方法
在实例中可以能过 $obj->属性名(或方法名) 来调用 public类型的方法或属性
2.protected (了解)
protected : 被定义为受保护的类成员则可以被其自身以及其子类和父类访问。
在子类中可以通过 self::属性名(或方法名) 调用protected方法或属性,parent::属性名(或方法名) 调用父
类方法。
在实例中不能通过 $obj->属性名(或方法名) 来调用 protected类型的方法或属性
3.private (了解)
private : 被定义为私有的类成员则只能被其定
义所在的类访问。
在该类的实例、子类中、子类的实例中都不能调用私有类型的属性和方法
以上主要学习了如何定义一个类,成员调用(访问权限修饰)
构造方法与析构方法
构造方法(construct) :是一种特殊的方法。对象的创建就是通过构造方法来完成,其功能主要是完成对
象的初始化, 它可以有参数,也可以没有参数。当类实例化一个对象时会自动调用构造方法。
构造方法的两大作用: 1. 构造出来一个类的实例 2. 对构造出来的一个类的实例(对象)初始化
构造方法的特点:
①构造方法名和类名相同(php4版),php5版之后的构造方法名可以和类名相同,也可以是
__construct();
②构造方法没有返回值;
③构造方法的主要作用是完成对新对象的初始化,并不是创建对象本身;
④在创建新对象后,系统会自动的调用该类的构造方法,不需要自己写代码调用;
⑤一个类有且只有一个构造方法,在php5后虽然__construct() 和 类名() 可以共存,但是实际上也
只能使用一个;
⑥如果没有给类自定义构造方法,则该类使用系统默认的构造方法;
⑦如果给类自定义了构造方法,则该类的默认构造方法被覆盖;
⑧构造方法的默认访问修饰符是public。
析构函数(destructor) 与构造方法相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系
统自动执行析构函数。析构函数往往用来做“清理善后” 的工作。
析构方法的写法(不用自己写,系统在结束的时候会自己给):
function __construct()
{
echo 'construct'.'<br>';
}
function __destruct()
{
// TODO: Implement __destruct() method.
echo '__destruct'.'<br>';
}
function show(){
echo "show".'<br>';
}
魔术方法 : 我们前面介绍的__construct,这个方法就是一个特殊方法,它会在类被实例化的时候自动调
用。这些特殊方法也往往称之为“魔术方法”,而且也多以 “双下划线” 开头,其目的就是和普通的方法名
进行区分。
注意 : 魔术方法不需要自己手动调用 只要有符合对应魔术方法的情况 , 它自己就会执行 , 魔术方法并不
是为了固定的执行某个功能 , 而是触发后执行自定义的功能。
魔术方法的作用 :是更好的面向对象,增强程序的健壮性,以及更多的技巧性的东西。
注意:在静态方法中可以调用静态成员, 但是无法调用普通成员。
静态成员的特点总结:
静态数据成员和普通数据成员区别较大,体现在下面几点:
- 普通数据成员属于类的一个具体的对象,只有对象被创建了,普通数据成员才会被分配内存。而静
态数据成员属于整个类,即使没有任何对象创建,类的静态数据成员变量也存在。 - 因为类的静态数据成员的存在不依赖与于任何类对象的存在,类的静态数据成员应该在代码中被显
式地初始化,一般要在类内进行。 - 外部访问类的静态成员能直接通过类名来访问。
- 类实例化对象可以访问静态方法,但不能访问静态属性
- 类的静态成员函数无法直接访问普通数据成员(可以通过对象名间接的访问),而类的任何成员函
数都可以访问类的静态数据成员。 - 静态成员和类的普通成员一样,也具有public、protected、private3种访问级别。
类常量(const)
以前定义常量使用 'define' 函数定义 , 这种常量是全局常量 , 在任何地方都可以被访问到 , 而类常量则是
专属于该类的常量。
1.定义类常量
定义类常量的格式:
const 常量名 = 值;
类常量和静态属性类似 , 调用也需要使用 范围解析符 '::' 。
类常量的调用格式:
类名::类常量名;
类全局常量和全局常量的区别:
总结 : 全局常量可以不用使用任何标识符直接在任何地方调用到 , 而类常量必须使用对应的类名称或代
表类名称的关键字来使用。
继承
: 是指建立一个新的派生类,从一个先前定义的类中继承数据和函数,而且可以重新定义或加进新
数据和函数,从而建立了类的层次或等级。而派生类就是从一个类衍生出的类。