类是一个具备某种功能的抽象模型,是一个抽象的概念,只有在被实例化之后才能使用。对象是类进行实例化后的产物,是一个实体。类是对象的模板,对象是类的实例。
创建类、添加类成员与实例化类
权限修饰符 class 类名{//定义类
权限修饰符 $属性名;//定义类属性
权限修饰符 function 方法名([参数]){}//定义类方法
}
$变量名=new 类名([参数]);//实例化类
$变量名->属性名;//访问类属性
$变量名->属性名=值;//为类属性赋值
$变量名->方法名([参数]);//访问类方法
- 定义类时可省略权限修饰符,但定义属性与方法时必须加上权限修饰符
- 在类中声明的变量称为属性,在类中声明的函数称为方法
- 类需要实例化之后才能使用,一个类可以实例化多个对象,每个对象都是独立的
- 在类中实例化自身时可使用
self()
代替类名()
,避免修改类名时需要重复修改代码 - 访问类的属性和方法使用
->
,在类中调用自身的属性和方法可使用$this->
操作符
构造方法
function __construct([参数]){
//方法体
}
- 方法名前带
__
的为系统预定义的魔术方法,无需用户调用,在满足一定条件下会被自动调用 - 构造方法在类被实例化后第一个自动调用的方法,如果没有特别声明,会默认生成一个没有任何参数且内容为空的构造方法
- 一个类只能有一个构造方法
权限修饰符
public
,公共成员,可以在类内部、类外部和子类中被访问private
,私有成员,只能够在类内部被访问protected
,受保护成员,能够类内部和子类中被访问
类的继承
class 类名 extends 父类名{
}
- 一个类只能继承一个父类
- 子类继承父类就可以访问父类的公共和受保护成员,子类中创建与父类名称相同的方法,即为重写父类的方法
- 通过
parnet()::
来访问父类的方法
Trait
trait 名称{
权限修饰符 $属性名;//定义属性
权限修饰符 function 方法名([参数]){}//定义方法
}
use 名称;//使用trait
- trait是针对于PHP的单继承而产生的,实现代码复用,相当于将trait中的代码直接插入使用trait的类中
- 一般在父类中使用,尽量不在最底层的子类中使用
- trait不能被实例化,只能通过
use
关键字来使用 - 优先级:当前类同名方法>trait同名方法>从父类继承的同名方法
示例
<?php
trait TropicalFruits{
public $litchi='我是荔枝';//公共成员
private $mango='我是芒果';//私有成员
protected $pineapple='我是菠萝';//受保护成员
public function setFruitName($litchi,$mango,$pineapple){
$this->litchi=$litchi;
$this->mango=$mango;
$this->pineapple=$pineapple;
echo $this->litchi.','.$this->mango.','.$this->pineapple;
}
}
class Fruit{
public $fruit='我是水果';
public function __construct($fruit){//构造方法
echo $this->fruit;
$this->fruit=$fruit;
}
public function eat(){
echo '每个水果有不同的食用方式';
}
use TropicalFruits;//使用trait
}
class Apple extends Fruit{
public function eat(){//重写父类eat()方法
echo '食用方式:洗净后,使用水果刀切块食用';
}
}
$apple=new Apple('我是苹果');
echo '<hr />';
echo $apple->fruit;
echo '<hr />';
$apple->setFruitName('荔枝','芒果','菠萝');
echo '<hr />';
$apple->eat();