1.构造方法
- 当使用new关键字,创建一个类的对象时,第一个自动调用的方法,就是构造方法
- 构造方法的名称是固定的,__construct()
- 构造方法可以有参数,也可以没有
- 构造方法的作用:对象初始化
- 构造方法只能定义一个
- 构造方法一定没有返回值,不要使用return语句
//定义手机类
class Mobile{
//私有的手机属性:在实际项目中,属性一般都是private、protected权限
//在项目中,成员属性一定没有值
//在类中没有真正的数据,数据都来源于类外的传递
private $name;
private $band;
private $price;
private $city;
//公共的构造方法
public function __construct($name2,$band2,$price2,$city2){
$this->name=$name2;
$this->band=$band2;
$this->price=$price2;
$this->city=$city2;
}
//公共的自我显示的方法
public function showInfo(){
$str="name:{$this->name}<br>";
$str.="band:{$this->band}<br>";
$str.="price:{$this->price}<br>";
$str.="city:{$this->city}<br>";
return $str;
}
}
//创建手机类对象
$obj=new Mobile("1+","7pro",3100,"厦门");
echo $obj->showInfo();
2.析构方法
- 当销毁一个对象前,自动调用的方法,就是析构方法
- 析构方法名称是固定的:__destruct()
- 析构方法一定没有参数,析构方法一定是成员方法
- 析构方法的作用:垃圾回收。如:断开数据库连接
//例:定义一个学生类
class Student{
//私有的静态的保存的人数的属性
private static $count=0;
//构造方法
public function __construct(){
self::$count++;
}
//公共的析构方法
public function __destruct(){
self::$count--;
}
//获取在线人数
public function ggetCount(){
return self::$count;
}
}
//对象实例化
$obj1=new Student;
$obj2=new Student;
$obj3=new Student;
$obj4=new Student;
$obj5=new Student;
echo "当前有".$obj1->ggetCount()."个人在线!";//得到5个人
个人理解:代码执行完毕后,最后析构方法将$count减为初始静态属性0;
3.引用传地址
将其他数据类型变成引用传地址
//1.引用传地址:数组
$arr=array('1001','卡古拉',70);
$school='深圳大学';
//定义一个函数,给数组添加新元素
//函数参数引用传地址时,“&”要加在形参前
function addElement(&$arr2,$school2){
$arr2[]=$school2;
}
//调用函数
addElement($arr,$school);
//打印
print_r($arr);
4.类的封装性
4.1作用
- 将敏感数据保护起来,不被外界访问
- 将一个总功能封装成一个类。如:数据库工具类,把数据库所有功能封装到类中,因此在数据库类外不用mysql_开头的函数
- 类的封装性实现,就是通过权限控制符来实现
- 在项目中,所有成员属性,一般都是private、protected权限
4.2举例:封装图书类
//例:定义一个图书类
class Book{
//类常量定义
const COMPANY="<h2>RStar</h2>";
//私有的静态的数量属性
private static $count=0;
//私有的图书属性
private $name;
private $author;
private $price;
private $publish;
//构造方法,对象初始化
public function __construct($arr){
$this->name=$arr['name'];
$this->author=$arr['author'];
$this->price=$arr['price'];
$this->publish=$arr['publish'];
self::$count++;
}
//受保护的水平线
protected static function showLine(){
return "<hr/>";
}
//公共的自我显示的方法
public function showInfo(){
$str=self::COMPANY;
$str.=self::showLine();
$str.="name:{$this->name}";
$str.="<br>author:{$this->author}";
$str.="<br>price:{$this->price}";
$str.="<br>publish:{$this->publish}";
$str.="<br>count:".self::$count;
return $str;
}
}
//创建第1个图书对象
$arr=array(
'name'=>'魔兽编年史',
'author'=>'暴雪',
'price'=>'200',
'publish'=>'暴雪',
);
$obj1=new Book($arr);
echo $obj1->showInfo();
//创建第2个图书对象
$arr=array(
'name'=>'不列颠百科全书',
'author'=>'暴雪',
'price'=>'200',
'publish'=>'暴雪',
);
$obj2=new Book($arr);
echo $obj2->showInfo();
5.类的继承性
5.1.相关概念
- 得到父类除private权限外的所有成员属性和方法
- 继承是为了实现项目的升级和拓展
- 如果项目需要升级和拓展功能:不能直接修改原类,需创建一个子类,并继承父类
class Student{
//私有的成员属性
private $name;
private $age;
//构造方法
public function __construct($name2,$age2){
$this->name=$name2;
$this->age=$age2;
}
//公共的自我显示方法
function showInfo(){
echo "{$this->name}年龄为{$this->age}岁";
}
}
//继承学生类
class ChildStudent extends Student{
}
$obj=new ChildStudent("神乐",70);
$obj->showInfo();
var_dump($obj);
6.类的多态
6.1概念
- 类的多态就是 方法重载和方法重写
- 函数重载:在一个脚本文件中,定义2个同名函数;PHP不支持
- 方法重载:在同一个类中,定义2个同名方法;PHP不支持
- 方法重写:父类有一个方法,在子类用同样的名称再定义一次
- 功能升级:父类有的功能,子类的功能更完善。通过方法重写来实现
6.2方法重写的要求
- 子类中重写的方法的名称,要与父类一致
- 子类中重写的方法的参数个数,要与父类一致
- 子类中重写的方法的类型,要与父类一致==(同为静态或成员方法)==
- 子类中重写的方法的权限,不能低于父类方法的权限(public>protected>private)
- 重写前提:先继承,再重写
class Student{
//受保护的静态成员方法
protected static function readMe($a,$b){
return "{$a}的年龄是{$b}岁";
}
}
//继承学生类
class ChildStudent extends Student{
//重写父类的方法
public static function readMe($name,$age){
$str='<h2>子类重写</h2>';
$str.=parent::readMe($name,$age);
echo $str;
}
}
//直接使用类名调用静态方法
ChildStudent::readMe('kakura',70);
6.3构造方法重写
- 所有方法都可以重写,但是构造方法重写,没有参数要求
//定义商品类(基础类)
class Shop{
private $name;
private $price;
//受保护的构造方法
protected function __construct($name2,$price2){
$this->name=$name2;
$this->price=$price2;
}
//受保护的自我显示的方法
protected function showInfo(){
$str="商品名称:{$this->name}";
$str.="<br>商品价格:{$this->price}";
return $str;
}
}
//定义手机类,并继承商品类
class Mobile extends Shop{
//私有的手机属性
private $band;
private $city;
//公共的构造方法
public function __construct($name2,$price2,$band2,$city2){
//向父类构造方法,并传递参数
parent::__construct($name2,$price2);
$this->band=$band2;
$this->city=$city2;
}
public function showInfo(){
$str = parent::showInfo();
$str.="<br>手机品牌:{$this->band}";
$str.="<br>手机产地:{$this->city}";
return $str;
}
}
//创建手机类对象
$obj=new Mobile("1+",3000,"oppo","golden");
echo $obj->showInfo();