一、基本概念
- 类:属性和方法的集合
- 对象:是类进行实例化后的产物
- 三大特点:
1.封装性(信息隐藏)
2.继承性:派生类(子类)自动继承一个或多个基类(父类)中的属性和方法,并可以重写或添加新的属性或方法
3.多态性:同一类的不同对象,使用同一个方法可以获得不同的结果。
二、
1.类的定义
<?php
class 类名 { #用大括号将内容括起来,注意大括号的位置,大括号{前有一个空格
成员属性;
成员方法;
}
?>
2.对象的创建(实例化类)
$对象名 = new 类名 ([参数1,参数2...]) ;
- new 表示创造一个新的对象,通过 new 关键字 实例化对象
- 创建对象成功后,就可以通过 $对象->成员方法/ $this -> 成员方法 来访问/调用类中的对象(类中的函数被称为成员方法);this ->表示调用本类中的成员方法/变量,后面的变量名没有$符号的
- 系统会给每个对象分配
this
,代表当前对象this
只能在类内部方法中使用,不能在类定的的外部使用。 - 若不需要传递参数,可省略类名后的括号
- 使用“->”符号连接对象和方法名来调用方法,后面要带圆括号
- 类中的变量,也称为成员变量
定义成员变量和成员方法:关键字(修饰符) 成员变量名
关键字可以使用public ,private, protected, static 中的任意一个(访问与类对象的访问一致)
//声明一个类
class Book{
public $name='PHP学习'; //定义成员变量
public function getName(){ //构造函数
return $this->name;
}
}
//实例化一个对象
$book = new Book();
//访问类的对象成员
echo $book->name;//输出 PHP学习(name的值已经给出,不需再加括号())
//访问类的对象方法
echo $book->getName();//输出 PHP学习
3.构造函数和析构函数
- 构造函数是在初始化对象时使用的,如果类中没有构造方法,PHP 会自动生成一个构造函数,自动生成的构造方法是没有参数的
访问修饰符:private、protected、public 默认 public
构造方法:
修饰符 function __construct(参数列表){ //两个下划线_
//初始操作
}
例:
<?php
class hobby {
public $food; //定义成员变量
public $sports;
public function speak() { //声明成员方法
echo "I like".$this->food."and I don't like".$this->sports."。<br>";
}
}
$p1=new hobby(); //实例化类,并传递参数
$p1->food="eat shaokao"; //执行类中的方法
$p1->sports="run";
$p1->speak();
?>
- 析构函数的作用和构造方法方法刚好相反,是对象被销毁时被调用的,作用是释放内存
没有任何变量引用这个对象时,该对象就成为垃圾,PHP会自动将其在内存中销毁,垃圾处理机制
function__destruct(){ //两个下划线_
//清理操作
}
定义:在到某个对象的所有引用都被删除
或者当对象被显式销毁
时执行,说白了就是对象调用结束前
场景:析构函数是在对象被销毁前, 给程序员一个机会,去释放该对象分配的相关资源的, 比如数据库链接, 比如你打开的文件,比如绘图的句柄
例:
<?php
class Person{
public function show() {
echo 'How are you?<br>';
}
//声明析构方法,在对象销毁前自动调用
function __destruct(){
echo '对象被销毁';
}
}
$p1=new Person(); //实例化类,创建对象
$p1->show(); //调用类的对象
?>
4.类常量
- 定义类常量的格式:
const 常量名 = 常量值
- 常量输出的格式:
类名::常量名
注:两个冒号“::”称为作用域操作符,使用这个操作符可以在不创建对象的情况下调用类的常量、变量、方法。
三、继承和多态的实现
1.继承
派生类(子类)自动继承一个或多个基类(父类)中的属性和方法,并可以重写或添加新的属性或方法
语法格式:
class subClass extends superClass{
...
}
//subClass为子类名称,superClass为父类名称
注:
1)父类的 private
修饰的属性和方法,在子类中不能使用
2)子类最多只能继承一个
父类(指直接继承)
3)在创建某个子类对象时,默认情况下会自动调用其父类的构造函数
4)如果在子类中需要访问其父类的方法(构造方法/成员方法
方法的访问修饰符是(public/protected
),可以使用 父类::方法名(或者 parent::方法名 )
来完成
5)如果子类(扩展类)中的方法和父类(基类)方法相同,我们称为方法重写
2.多态
存在两种形式:覆盖和重载
- 所谓覆盖就是在子类中重写父类的方法,而在两个子类的对象中虽然调用的是父类相同的方法,但返回的结果是不同的。
- 所谓
重载
,就是函数或者方法有相同的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者重载方法。
四、“::”的使用
这个操作符可以在不创建对象的情况下调用类的常量、变量、方法。
格式:
关键字::变量名/常量名/方法名
关键字:1)parent:可以调用父类中的成员变量、成员方法、常量
2)self:可以调用当前类中的静态成员和常量
3)类名:可以调用本类中的变量、常量、方法
例:
<?php
class book{
const name = 'computer' //声明常量name
function__construct(){ //构造方法
echo'图书为:'.book::name.''; //类名::常量 >>图书为computer
}
}
class abook extends book{ //book类的子类
const name='foreign language'; //声明常量name
function__construct(){
parent::__construct(); //patrnt::方法名 调用父类的构造方法
echo'图书为:'.self::name.''; //self::常量名 >>图书为foreign language
}
}
$obj = new abook(); //实例化对象
?>
五、关键字
public、prive、protected、static、final
1.public(公共成员)
在程序中任何位置都能被其他的类和对象调用
对于成员方法,若没有写关键字,则默认为public
2.prive(私有成员)
只能在所属类中被调用和修改
3.static
声明类属性或方法为 static(静态),就可以不实例化类而直接访问。
静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。
由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。
静态属性不可以由对象通过 -> 操作符来访问。
4.Final
如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。