面向对象
一. 面向对象的概念
- 生活角度:
- 类:人类 杯子
- 对象:小明 小红 水杯 茶杯
- 官方角度
- 类: 具有相同特征的事物的总和
- 对象: 类中某一个具体的事物
- oop: object oriented programming 指面向对象编程
二.定义一个类
- 采用关键字class来定义
- 类名的书写规范: 首字母大写,多个单词之间使用驼峰法, 不能以数字开头,中间可以使用数字,_组合
- 类名下边是大括号
- 严格区分大小写
三.创建对象
- 类定义完之后没有任何意义,就跟函数定义完之后没有意义是一样的.
- 函数定义完之后需要调用.
- 同样的类定义完之后需要产生对象才能使用.
new到的结果就是一个对象
方式一
$jieyin = new Person();
var_dump($jieyin);
方式二
$person = 'Person';
$guangqiang = new $person();
var_dump($guangqiang);
方式三
$yangyang = new $guangqiang();
var_dump($yangyang);
方式四
$gaoqiang = clone $guangqiang;
var_dump($gaoqiang);
总结: 得到对象有四种方法, 我们只需要记住第一种
- 得到新对象
1.通过关键字new得到新对象
2.通过关键字clone得到新对象
总结: 得到不同的新对象是通过以上两种方法,区分新对象是通过标识符[1]来区分
四. 类中的成员属性和成员方法
- 类的组成: 成员属性和成员方法
- 成员属性的定义:
- 采用默认的关键字public来定义
- 定义属性跟定义变量一模一样 $name
- 成员属性的调用:
类外 对象->属性名 注意: 属性前边没有$
类内 $this->属性名 注意: 属性前边没有$ - 成员方法的定义
- 默认采用关键字public, public可以省略
- 怎么定义函数也就怎么定义方法 例子: public function eat(){}
- 方法名: 采用驼峰法或者下划线法来定义
- 成员方法的调用
类外 对象->方法名()
类内 $this->方法名()
[注意]
之前在函数中可输出/有返回值/传递参数
同样的在方法中也可以输出/有返回值/传递参数
五. 魔术方法(构造方法)
- 以__开始,在某时某刻被自动调用的方法,就是魔术方法
- 对于魔术方法: 相应的方法名都有固定的格式
- 构造方法
public function __construct()
{
}
[注意]
- 构造方法是在new对象(实例化对象)的时候执行该方法
- 一般是在实例化对象时给属性进行初始化赋值操作
- 构造方法中可以定义形式参数
- 实际参数在实例化对象的时候传递
六.$this关键字
- 代表当前对象
- $this只能在类内使用
- 类内: t h i s − > 属 性 名 属 性 名 前 边 没 有 this->属性名 属性名前边没有 this−>属性名属性名前边没有
- 类内: $this->方法名()
七. 魔术方法(析构方法)
- 定义:
public function __destruct()
{
}
- 执行: 对象被销毁,或者程序执行结束之后被调用
八. 面向对象的三大特征:
- 封装: 在类中使用不同的方法实现不同的功能就是封装
- 继承: 就相当于咱来继承咱爹的遗产
- 多态(重写):
九. 访问控制修饰符(访问修饰限定符)
public(公共的) | protected(受保护的) | private(私有的) |
---|---|---|
类型 | 类外 | 类内 |
public | 可以 | 可以 |
protected | 不能 | 可以 |
private | 不能 | 可以 |
- 总结:
- 只有public修饰的成员(属性和方法)可以在类外访问,其他的不可以
- 在类内都可以访问
十. 面向对象的三大特性:
- 封装: 一个类就是一个封装
- 继承 [重点]
- 继承需要通过关键extends 来实现继承
- 继承时可以继承成员属性和成员方法
- 通常情况下, 把被继承的类叫做父类,(也叫作基类) , 继承的类叫做子类, (也叫作扩展类)
- 继承可以有继承连
- 继承只能是单继承
- 只有public 和protected修饰的成员可以被继承,而private修饰的成员不能被继承
类型 | 类外 | 类内 | 继承链上的类内 |
---|---|---|---|
public | 可以 | 可以 | 可以 |
protected | 不可以 | 可以 | 可以 |
private | 不可以 | 可以 | 不可以 |
[总结]: private修饰的成员不能被继承
- 多态(重写)
- 定义: 首先要有继承,当子类的成员(属性和方法)重写了父类的成员时,这是我们使用的是子类的成员.
- 重写:
- 完全重写
- 不完全重写: 我既要体现子类的成员,也要体现父类的成员
调用父类的方法:parent::walk(); - 在重写时,普通方法可以重写,同样的魔术方法也可以重写
- 在类内访问:
- 当父类是public时,子类只能是public
- 当父类是protected时,子类只能是public/protected
- 当父类是private时,子类可以是public/protected/private
- public权限最大 protected居中 private权限最小
十一. 类常量
- 定义: 采用关键字const来定义常量
例子: const PIV = 3.14;- 在类外定义常量define()/const
- 在类内只能通过const来定义
- 调用
类外 对象::常量名(类名::常量名)
类内 self::常量名(类名::常量名/$this::常量名) - self:
- self: 表示当前类
- self跟对象没有任何关系,只跟声明的当前类有关
- self只能在类内使用
十二. 静态成员
- 静态成员属性的定义:
public static $name; - 静态成员属性的访问:
调用(访问)- 类外 对象::属性[这种不常用] (类名::属性)
[注意]属性前边必须有$ - 类内 self::属性(类名::属性)
[注意]:属性前边必须有$
- 类外 对象::属性[这种不常用] (类名::属性)
- 静态成员方法的定义:
public static function buy()
{
}
- 静态成员方法的访问:
调用(访问)- 类外: 对象::方法名()[不常用] (类名::方法名())
- 类内: self::方法名() (类名::方法名())
十三. 魔术方法
- __construct() 触发时机: 在实例化对象的时候自动被调用
- __destruct() 在对象被销毁或者程序执行结束之后,自动调用