PHP-OOP面向对象
2.面向对象
1.类简介
主要内容包括 类 和 对象
1.类
class类中主要两种元素,函数(方法),变量(属性)
函数不调用不执行功能,类不实例化为对象无法使用
设计类的时候,需要考虑什么:(一切皆对象)
该类有什么(属性)?
该类会什么(方法)?
注意:
- 类本身是无法执行的,本身是虚构的,不存在的
- 对象才是真正能使用的
类与对象之间的关系
- 类 就是对象的抽象化
- 对象 就是类的实例化
格式
1 | class 类名 |
6.实例
1 | class Beauty |
总结:
1、在使用之前,要先将类实例化为对象,即:类->对象
$对象名 = new 类名;
2、输出属性时,格式为:对象 -> 属性名
echo $obj->name;
3、调用方法时,格式为:对象 -> 方法名()
$obj->skill();
2.伪对象
1.定义
在类的内部,可以使用自己的属性or方法,此时, $this 代表当前对象
称为伪对象
2.实例
1 | class Beauty |
总结:
伪对象$this 代表当前对象, 在哪个类中使用, 就相当于$this = new 当前类名
$this 不需要实例化, 可直接使用.
$this 只能在类内使用
3.连贯操作
若要在执行时连续调用方法,可采用如下格式:
1. $obj->step1()->step2()->step3()...;
2.将连续调用的前面的方法加上return $this
注意:若直接采用1,而不return返回对象,会报错 Call to a member function step2() on null 相当于null->step2()
4.魔术方法
1.定义:
魔术方法,就是在指定条件触发时,会自动调用的方法,这里主要介绍两种
__construct() 构造方法
__destruct() 析构方法
2.构造方法
触发条件:在实例化时,自动触发
使用场合:常用于初始化属性
注意:一般构造都写在方法的最前面,属性的最后面
1 | class Lengend |
3.析构方法
触发条件:当对象被销毁时,自动触发,包括:
1).程序全部执行完,自然销毁
2).对象被主动删除了
3).对象被覆盖了(更换)
使用场合:当对象使用完的一些扫尾操作(fclose、closedir)
注意:一般析构方法都写在方法的最后面
1 | class Lengend |
4.实例化PDO类
PDO 数据抽象层,专门负责数据库操作管理
1 | $dsn='mysql:host=localhost;dbname='test';charset=utf8; |
总结:
1.PDO类::方法
PDO::query( ) 执行一条SQL语句
成功返回PSOStatement,适合查询,失败返回false
PDO::exec( ) 执行一条SQL语句
成功返回受影响的行数,适合增删改,失败返回false
PDO::lastInsertId( ) 获取最近一次插入的ID
成功返回最新的id,失败返回
'0'字符PDO::errorInfo( ) 获取错误信息
2.PDOStatement类::方法
- PDOStatement::fetch( ) 获取结果集中的一条数据(依靠指针)失败返回false
- PDOStatement::fetchAll( ) 获取结果集中的所有数据,参数设置显示格式
- PDO::FETCH_NUM 索引数组格式
- PDO::FETCH_ASSOC 关联数组格式
- PDO::FETCH_BOTH 混合数组格式
3.OOP面向对象
面向对象OOP的三大特性:1.封装性 ;2.继承性 ;3.多态性
1.封装性
定义:将对象的所有成员结合在一起,形成一个不可分割的独立单位
目的:尽可能的隐藏属性 和 方法,只留下部分接口与外部联系
提供以下三种修饰符,来控制与外部的联系
修饰符 本类 继承类 类外 public √ √ √ 公有的 protected √ √ x 受保护的 private √ x x 私有的 想要有高安全性 或者 只想自己使用的,最好设置为private。
2.魔术方法
如果在类外使用私有属性或方法,程序会立即终止并报错
为了避免终止程序,可以使用一些魔术方法做提示,并绕过error错误
__get($x)当访问权限不足或不存在的属性时,自动触发,返回访问属性名
__set($x,$y)当设置权限不足或不存在的属性时,自动触发,返回设置属性名和值
__unset($x)当删除权限不足或不存在的属性时,自动触发,返回要删除的属性名
__isset($x)当判断是否存在的目标权限不足或不存在时触发,返回要判断的属性名
__call($x,$y)当访问权限不足或不存在的方法时,自动触发,返回方法名和实参
__tostring()当echo对象时触发,返回字符串值
3.继承性
定义:子类(-派生类/扩展类)继承父类(基础类/基类)的一些属性和方法
格式
class 子类 extends 父类 {}实例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16class laozi
{
public $name = '老王';
public function skill()
{
echo '喜欢去隔壁转转 <br>';
}
}
class son extends laozi
{
}
$obj = new son; #实例化子类
echo $obj->name; #直接调用子类继承的属性
$obj->skill(); #直接调用子类继承的方法
特点
子类可以继承属性,方法(除了private)
子类可以重写属性,方法
子类可以扩展方法
parent::父级方法名访问级别:
private>protected>public子类继承父类时,修饰符可以保留等级,可以降级,就是不能升级
- 继承方式
- 单继承(一个子级可以继承一个父级)
- 连续继承(爷->父->子->孙 依次继承)
- 多继承(无法在PHP中实现)
4.类静态
1.关键字:
static
2.格式:
static 修饰符 $属性名=属性值;
static 修饰符 function 方法名(){};
3.使用格式:
类名::静态属性名 / 类名::静态方法名()
self 代表当前的类名,只能在类内使用
$this 代表当前的对象
1 | class Beauty |
4.特性:
- 静态属性或方法 不需要实例化就可以直接使用
- 静态方法内部只能使用静态属性或方法
- 静态属性和方法可以继承
5.魔术方法
__callStatic($x,$y)
在访问不存在的静态方法时,自动触发,返回静态方法名和实参
5.类常量
1.格式
const 类常量名=值;
2.使用类常量
类名::类常量
3.特性
- 类常量可以继承,且可以重写一次
- 普通常量可以直接在类内使用(常量没有作用域)
- 类常量不能直接在类外使用,必须要通过类名来使用
1 | const NAME = '黑寡妇'; |
6.最终 final
1.使用:
1 | final class Beauty #final 修饰类,保护不被继承 |
2.特性
- final 可以修饰类和方法,不能修饰属性
- final 修饰类,保护类不被继承
- final 修饰方法,保护方法不被继承方法重写
7.克隆对象 clone
1.格式
副本对象 = clone 样本对象;
2.使用
1 | class Beauty |
3.特性
副本与样本对象完全一样,却互不影响,完全独立
克隆(clone)与复制出来的对象不一样,修改克隆副本对原样本没有任何影响,而修改复制对象则会影响原样本,相同点是删除副本对原样本都没有影响,原因如下:
变量与内存是通过标识来引用的;
删除原样本,只是删除元样本和标识之间 的联系,与复制副本无关;
息息相关的只是内存的内容
4.克隆魔术方法
1.函数:
__clone()
2.作用:
克隆操作时触发,可以为克隆副本重新初始化属性
3.实例
1 | class Demo |
8.串行化/序列化
1.函数
串行化: serialize( )
反串行化: unserialize( )
2.目的
将对象串行化为字符串
3.使用场景
传参,存入文本,存数据库 …
4.实例
1 | $obj=new Game; #创建一个对象 |
5.串行化魔术方法
1.函数:
__sleep( )
serialize串行化时触发,用以返回需要的信息(数组形式)
__wakeup( )unserialize反串行化时触发, 用以重新初始化属性
2.应用:
1 | class Game |
9.魔术方法—自动加载
在真实项目中 , 一个PHP文件内 , 只有一个类 , 没有多余的代码,可以在多PHP相互加载的状态下的纯PHP界面省略定界符
<?= ?>中的后面部分,需要引入的HTML文件使用include / include加载
1.格式
1 | function __autoload($x) |
2.作用 :
在实例化一个不存在的类时 , 自动触发 , 返回要求实例化的类名
3.使用场景 :
使用数据库功能 , 上传文件功能 , 图形验证码功能等….
4.实例:
1 | 一次性加载所有的类文件: |
10.抽象
1.抽象
抽象方法 : 没有方法体( 代码块 ) 的方法
抽象类 : 包含抽象方法的类
1.关键字
abstract
2.特性
- 包含抽象方法的类必须为抽象类
- 抽象类不一定需要包含抽象方法
- 抽象类不能被实例化
- 抽象类必须被子类继承 , 并实现抽象方法
3.目的
强制约束子类继承并实现抽象方法
1 | abstract class Demo #定义抽象类 |
2.接口
1.定义
当类中全部都是抽象方法时,可定义为接口
即接口就是抽象类( 条件 : 内部方法全部为抽象方法 )
2.特性
接口继承是通过 implements 关键字继承的 (不是extends)
接口可以实现多继承( 可以有多个父类,分别实现各个父类继承的抽象方法 )
1 | interface Demo #定义接口Demo |
3.类型约束
PHP支持的函数实参类型约束有数组和对象
格式 : 方法名( 类名 变量 )|方法名( array 变量 )
1 | function demo(array $x) #约束送入的实参只能是数组类型 |
1 | class Demo1 {} |
4.接口多态性
多态性 : 通过同一个接口 [ 抽象类|普通类 ] ,传入不同的设备,从而实现不同的效果
( 普通类没有强制约束子类执行指定方法的特征 , 不推荐使用 )
1 | interface USB #定义接口 |
5.foreach遍历对象
foreach不但能够遍历数组,也可以遍历对象
1 | class Book |
注意: 遍历对象是将对象中的 ( 属性名=>属性值 ) 遍历显示
6.对象相关函数
判断类是否存在
class_exists( '类名' )返回bool值判断某个类下的属性是否存在
property_exists( '类名','属性名' )返回bool值可以检测私有属性,但不显示具体值
获取类中的所有公有属性
get_class_vars( '类名' )返回数组, 包含属性名和属性值获取对象中的所有公有属性
get_object_vars( '对象' )返回数组, 包含属性名和属性值获取类中的所有公有方法
get_class_method( '类名' )返回索引数组, 包含所有方法名获取某个对象的类名
get_class( '对象' )返回字符串, 类名