类就:模型,例如“人”、学生
对象:类的实例,具体的事物,例如:张三
属性:对象具有的静态特征
方法:对象具有的动态行为
类名:以大写字母开头,后接字母或下划线
(1)基本语法:以class关键字开头 类名{…}
中间拥有属性或方法
属性和方法之前有类型限定符:
private:私有属性、 protected:保护成员、在类的外部进行访问 public:公有属性
一般情况下,
属性常用private或protected修饰 方法常用public修饰
编码规范:private或protected属性或方法名前加一个_
注意:类的外部不能访问private或protected成员
(2)类内访问成员的方法:
使用$this->成员名,形式在类的内部访问成员属性或成员方法
(3)private或protected属性,应该为它提供一些get 和 set 方法
getter 和 setter 称为获取器和设置器
(4)构造方法:
基本作用:
1、把对象的创建和成员属性的初始化合并到一起;
使用方法:
在类的内部创建一个__construct()方法,称之为构造方法
一般情况下,构造方法设置为 public 类型
工作原理:在 new 对象时,将会自动调用当前的累的构造方法
1、基本语法:
使用new运算符
如果类定义构造方法,需要传递相应的构造参数
2、使用对象:
只能访问类的 public 成员
使用 对象名->成员名 形式访问类的成员
(1)创建的对象相当于C语言中的通过指针变量动态分配内存
对象名存储在栈区,对象的实际内容存储在堆区
(2)创建一个对象,就在内存堆区开辟一块区域
(1)访问整个对象
对象赋值:本质上是把 = 右边对象名中存储的堆区地址复制给 = 左边的对象名,给一个对象起一个昵称
如何保证对象是拷贝式赋值(保证 $p1 和 $p3 指向不同区域)?
在对象赋值时,在 = 右边加上 clone 关键字
输出对象:不能直接输出,需要做一些处理
如何允许直接输出对象?
在类中,为类添加一个方法__toString()
(2)访问对象成员
使用 对象名->成员名 形式(只能访问public类型成员)
对下个支持 foreach 迭代
只能迭代 public 类型
只能迭代成员属性,不能迭代方法
(1)本质:
逻辑上:常量成员的作用,是类作用域内的常量(相当于php中的全局常量)
适用场合:一般情况下用来表示一些特殊的值,方便后续使用(保证值的统一性,方便程序员记忆)
物理上(内存存储上):
内存分区(文字常量区、栈区、堆区、代码区、全局静态区)
类的常量属性在内存中位于文字常量区,所以我们在使用的时候,需要使用 类名::常量名 访问常量成员
在类的内部,self关键字代表当前类的名字
常量成员存在于文字常量区。
(2)常量成员的使用:
只能定义常量属性,不能有常量方法。
定义时要使用 const 关键字,必须为其赋初值
常量成员名不需要加 $ 符号
使用方法:(通过类的作用域运算符)
类外访问常量:类名::常量名
类内访问变量:self:: 常量名
static
关键字的成员为静态) (1)本质:类所有实例对象共享的全局变量或全局函数(不依赖于类实例对象,而只属于类体)。
逻辑上(作用):
静态成员包括静态成员属性 和 静态成员方法
静态成员相当于类这个作用域范围内的全局变量或者全局函数
物理上(内存存储角度):
静态成员是类的所有实例对象共享的 =>
静态成员在内存肯定不位于堆区
静态成员在内存中位于全局静态区
(2)静态成员的使用:
定义:基本语法:访问限制符 static 静态成员名(属性、方法)
使用:
类内使用: self : : 静态成员名(属性,方法)
类外使用: 类名 : : 静态成员名(属性、方法)
通过类名访问,更有意义;任何时候都可以使用;
(3)实例:编写一个类对象的计数器(记录当前在内存中该类实例对象的个数)
添加一个静态属性 private static $count=0;
创建类的实例对象时,要动态地修改 $count 值
注意:在静态方法内部只能访问静态属性成员,不能访问非静态属性成员(不能出现 $this
形式)。因为静态方法是类共享使用的。
(1) has-a
关系:类 A 对象中包含了类 B 的实例对象(类A的对象 has-a
类B的实例对象)
简单理解为一个大范围包含多个小范围(含有关系)
1、定义时:
若类 A 成员属性中包含类 B 对象,类 A 对象赋值时,即使使用 clone 关键字,也并没有真正为类 A 完全对象独立的内存单元。
这种复制或者拷贝形式,一般称之为“浅拷贝”;与之相对应的是“深拷贝”,即完全建立对象的一个副本,实现思想在后期魔术方法中
2、访问时:
(2) is-a
关系(类的继承关系):类 B 对象本质上 is-a
类 A 实例(本质上是)
继承相当于是在原有事物上扩展了一些内容(属性或方法)
继承以后的新事物本质上而言是一种特殊的原事物
原始类“扩展”一些内容(属性或方法)而得到的新类,“继承”关系:本质上而言,“继承”是一种 `is-a` 关系。
新类 is-a
原始类
父类:"基类"或“超类”
子类:“派生类”
class 子类名 extends 父类名 {.........}
public
、protected
以及 private
成员private
成员。可以通过父类的 get
方法来访问父类的 private
成员parent:: 成员名
形式,用来调用父类成员。final
关键字,表示该类不能被继承。 堆区中子类的内存空间大小包含了父类和子类空间大小的之和。
注意:在PHP中,继承是但继承形式。即子类只能继承一个父类。