php面向对象

1、面向对象(OOP)

类就:模型,例如“人”、学生
对象:类的实例,具体的事物,例如:张三
属性:对象具有的静态特征
方法:对象具有的动态行为
类名:以大写字母开头,后接字母或下划线

1.1 创建一个类

(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.2 创建对象

1、基本语法:
使用new运算符
如果类定义构造方法,需要传递相应的构造参数

2、使用对象:
   只能访问类的 public 成员
   使用 对象名->成员名 形式访问类的成员

2、 使用对象

2.1 对象创建的内存本质

(1)创建的对象相当于C语言中的通过指针变量动态分配内存
对象名存储在栈区,对象的实际内容存储在堆区
(2)创建一个对象,就在内存堆区开辟一块区域

2.2 访问对象

(1)访问整个对象
对象赋值:本质上是把 = 右边对象名中存储的堆区地址复制给 = 左边的对象名,给一个对象起一个昵称
如何保证对象是拷贝式赋值(保证 $p1 和 $p3 指向不同区域)?
在对象赋值时,在 = 右边加上 clone 关键字

输出对象:不能直接输出,需要做一些处理
	如何允许直接输出对象?
	在类中,为类添加一个方法__toString()

(2)访问对象成员
使用 对象名->成员名 形式(只能访问public类型成员)

对下个支持 foreach 迭代
	只能迭代 public 类型
	只能迭代成员属性,不能迭代方法

3、类的静态成员和常量成员

3.1 类的常量成员

(1)本质:
逻辑上:常量成员的作用,是类作用域内的常量(相当于php中的全局常量)
适用场合:一般情况下用来表示一些特殊的值,方便后续使用(保证值的统一性,方便程序员记忆)

	物理上(内存存储上):
        内存分区(文字常量区、栈区、堆区、代码区、全局静态区)
        类的常量属性在内存中位于文字常量区,所以我们在使用的时候,需要使用 类名::常量名 访问常量成员
        在类的内部,self关键字代表当前类的名字
        常量成员存在于文字常量区。

(2)常量成员的使用:
只能定义常量属性,不能有常量方法。
定义时要使用 const 关键字,必须为其赋初值
常量成员名不需要加 $ 符号

使用方法:(通过类的作用域运算符)
    类外访问常量:类名::常量名

    类内访问变量:self:: 常量名

3.2 类的静态成员(带有 static 关键字的成员为静态)

​ (1)本质:类所有实例对象共享的全局变量或全局函数(不依赖于类实例对象,而只属于类体)。

​ 逻辑上(作用):

​ 静态成员包括静态成员属性 和 静态成员方法

​ 静态成员相当于类这个作用域范围内的全局变量或者全局函数

​ 物理上(内存存储角度):

​ 静态成员是类的所有实例对象共享的 => 静态成员在内存肯定不位于堆区

​ 静态成员在内存中位于全局静态区

​ (2)静态成员的使用:

​ 定义:基本语法:访问限制符 static 静态成员名(属性、方法)

使用:

​ 类内使用: self : : 静态成员名(属性,方法)

​ 类外使用: 类名 : : 静态成员名(属性、方法)

​ 通过类名访问,更有意义;任何时候都可以使用;

​ (3)实例:编写一个类对象的计数器(记录当前在内存中该类实例对象的个数)

​ 添加一个静态属性 private static $count=0;

​ 创建类的实例对象时,要动态地修改 $count 值

​ 注意:在静态方法内部只能访问静态属性成员,不能访问非静态属性成员(不能出现 $this 形式)。因为静态方法是类共享使用的。

4、类与类之间的关系

4.1 类与类之间的关系:

​ (1) has-a 关系:类 A 对象中包含了类 B 的实例对象(类A的对象 has-a 类B的实例对象)

​ 简单理解为一个大范围包含多个小范围(含有关系)

​ 1、定义时:

​ 若类 A 成员属性中包含类 B 对象,类 A 对象赋值时,即使使用 clone 关键字,也并没有真正为类 A 完全对象独立的内存单元。

​ 这种复制或者拷贝形式,一般称之为“浅拷贝”;与之相对应的是“深拷贝”,即完全建立对象的一个副本,实现思想在后期魔术方法中

​ 2、访问时:

​ (2) is-a 关系(类的继承关系):类 B 对象本质上 is-a 类 A 实例(本质上是)

5、类之间的继承关系

5.1 继承

  • 继承概念

继承相当于是在原有事物上扩展了一些内容(属性或方法)
​继承以后的新事物本质上而言是一种特殊的原事物

  • 继承本质

原始类“扩展”一些内容(属性或方法)而得到的新类,“继承”关系:本质上而言,“继承”是一种 `is-a` 关系。

新类 is-a 原始类

  • 相关概念

​ 父类:"基类"或“超类”

​ 子类:“派生类”

5.2 PHP中“继承”语法

  • 基本结构:
class 子类名 extends 父类名   {.........}
  • 继承原则:
    1、子类继承父类,子类将会拥有父类的所有成员
    所有成员,包括 publicprotected 以及 private 成员
    在子类中,不能直接访问父类的 private 成员。可以通过父类的 get 方法来访问父类的 private 成员
    2、若子类拥有与父类同名的方法,子类成员将自动覆盖父类的成员。
    在子类中,可以通过 parent:: 成员名 形式,用来调用父类成员。
    ​ 注意:若在方法前加上 final 关键字,表示该类不能被继承。

5.3 “继承”的内存本质

​ 堆区中子类的内存空间大小包含了父类和子类空间大小的之和。

注意:在PHP中,继承是但继承形式。即子类只能继承一个父类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值