类是面向对象的核心,它是一种数据类型
类由属性(成员变量)和方法组成
classname::class:输出命名空间和类名
$this指针引用当前的类的内部
修饰符
public:默认是public,公共的属性和方法 ,任何人和类都可以访问
private:私有的,只可以在类的内部进行访问,私有的属性和方法不会被继承(私房钱,只有自己使用)
protectd:受保护的,只可以内部和子类访问(案例:家产只可以是你的和你的儿子使用)
在进行类设计的时候,通常将属性设置为私有的将方法设置为公共的从而实现一个数据的封装
共有的方法为内部私有的数据提供外部接口,但接口实现的细节在类外又是不可见的
h5插入视频:
https://jingyan.baidu.com/album/90895e0f2bb82764ec6b0bc0.html?picindex=1
static静态属性和方法:一般用来包含要封装的数据和功能,可以为该类的所有实例所共享
构造函数和析构函数
__construct:构造函数,在创建类时自动执行
__destruct:析构函数,在对象被销毁前运行析构函数将对象从内存中销毁
如果,构造函数中传了参数,对应使用对象的时候也要传入相应的参数
类的继承:关键字''extends''
不支持多继承(相当于只有一个父亲)
继承是单方向的,子类可以使用父类的特性,父类不能使用子类的特性
子类如果有构造函数在使用的时候就会使用自己的构造函数,如果没有就会自动使用父类的构造函数
调用父类方法:
可以使用:$this->方法名;parent::方法名
属性没有子类和父类的区分
方法重载:
重载是指:同一个类中有多个相同名称的方法,通过参数个数和类型来区分方法,现在PHP并不支持这一特性
可以通过继承到达效果,就是在子类定义一个与父类相同的方法在实例化子类时会使用子类的方法,从而到达一个重载的效果
但是不会改变父类的初始值
final关键字:只能用于声明类和方法
使用了final关键字是的类不能被继承,
如果把final修饰方法那么该方法不能被子类重载;
traits机制:代码复用机制,关键字use traits名 使用
从基类继承的成员会被 trait 插入的成员所覆盖。优先顺序是来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法。
多个 trait
通过逗号分隔,在 use 声明列出多个 trait,可以都插入到一个类中。
例子:<?php
class Base {
public function sayHello() {
echo 'Hello ';
}
}
trait SayWorld {
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}
class MyHelloWorld extends Base {
use SayWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
?>
总结:从基类继承的成员被插入的 SayWorld Trait 中的 MyHelloWorld 方法所覆盖。其行为 MyHelloWorld 类中定义的方法一致。优先顺序是当前类中的方法会覆盖 trait 方法,而 trait 方法又覆盖了基类中的方法。
www.php.net官网,实时更新
抽象类:关键字:abstract
定义一个抽象类时,需要用abstract修饰
一个抽象类中至少包含一个抽象方法.抽抽象方法也是用abstract修饰
抽象方法只提供方法的声明,不提供方法的具体实现
包含抽象方法的类必须是抽象类;
抽象类不能用于创造对象,所以只能通过继承来使用
继承抽象类的子类,必须重载抽象类中的所有抽象方法才能被实例化;
继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,
而不能定义为私有的。此外方法的调用方式必须匹配,即类型和所需参数数量必须一致。
接口
概念:接口是一个特殊的抽象类,使用interface取代class
接口中的方法全部是抽象方法,在接口中不能使用属性,只能使用const定义常量
接口之间的继承也是使用extends
类继承接口需要使用关键字implements,一个子类可以实现多个接口的继承
一个子类可以同时继承一个父类和多个接口
类的魔术方法:以__开头的都是魔术方法
克隆对象:clone
概念:建立一个与原对象拥有相同属性和方法的对象,一般是使用在一个类用实例化两个类似的对象的情况
克隆后对象拥有被克隆的对象的全部属性,需要改变这些属性可以使用__clone,这个方法在一个对象将被调用时自动调用
可以定义确切的复制行为或执行的操作
方法的重载:有一个魔术方法__call实现方法的重载,必须传入两个参数,第一个是被调用的方法名,第二个包含了传递给改方法的参数数组
__get()获取属性值__set()设置属性值