一.类
- 面向对象:oop :是有下往上,要先把类写好,然后在写流程的时候提取类使用
- 以前学习的代码是一行一行往下执行的,所以是由上往下
- 类,有两个部分组成:成员属性(变量)和成员方法(函数)
- 根据类创建出来的对象,就是对象,每个对象都是独一无二的
- 我们写类的时候,一个类,要给一个文件,而且文件名,要和class类名一样,
访问修饰符,有三个:
public 公用的
protected 受保护的,在外面不能直接访问
private 私有的PHP的oop面向对象开发,它的三大特性:封装,继承,多态
require_once 加载,可以加载引入类使用
1.封装
-创建类
class A
{
// 成员属性
// 公开的,外部可以访问
public $name;
public $id = 123; // 给默认值
// 受保护的,在外面不可以访问,但是可以继承
protected $salary;
// 私有的,只能本类(我)自己调用,子类都继承不了的
private $password;
// 构造方法,专门给受保护的属性,给与重新赋值,构造方法也是可以继承的
public function __construct($a, $b, $c, $d)
{
$this->name = $a;
$this->id = $b;
$this->salary = $c;
$this->password = $d;
}
// 可以通过 __construct 方法里,把其他属性通过用户传过来
public function bldy()
{
return "我的名字叫:{$this->name},我的id是:{$this->id},我的工资是:{$this->salary},我的密码是:{$this->password}";
}
// 方法在本类里调用 用 $this 代表本类和英文里的 my一个意思
public function dy()
{
return $this->bh() . ',另外:' . $this->sy();
}
// 成员方法 可以公开的
public function gk()
{
return '这里可以写很多代码,进行功能处理,和函数一样,也可以写返回的数据类型';
}
// 成员方法,受保护的
protected function bh()
{
return '这个方法是受保护的,可以继承';
}
// 成员方法,私有的
private function sy()
{
return '私有的,子类是继承不了的';
}
- 引用类
require_once 'A.php'; // 引用创建的 A 类
// 这个类创建出来,给不能访问的属性,添加默认值
$obj = new A('晋阳', '123', '5000', '123456');
echo $obj->name; // name 是公开的,所以可以输出
echo '<hr>';
echo $obj->id;
echo '<hr>';
echo $obj->salary; // 受保护的,在外部不能调用,所以报错
echo '<hr>';
echo $obj->password; // 私有的,只能自己使用,所以报错
echo '<hr>';
echo $obj->bldy(); // 受保护的和私有的在外部不能访问,但是可以自己调用出来
echo '<hr>';
echo $obj->dy(); // 在本类中可以用$this调用方法
2.继承
- 子类继承父类的功能,那子类就有父类的功能可以少写很多代码,
- 继承的关键词:extends
- 子类继承父类是所有属性,除了私有的继承不了,
- 子类还可以在父类的基础上进行功能扩展
- 如果子类方法的名字,和父类的名字冲突了,就相当于重写
- 子类中变量重写可以在构造方法里进行重写赋值
- 当子类重写父类的方法时,如果还想用父类的方法,可以用 parent:: 进行调用
传值的属性,是先传给子类,如果子类里面有构造方法先使用了它,它就优先用子类的构造方法,替换掉父类的构造方法
创建子类
require_once 'A.php';
// B 类,继承 A类
class B extends A
{
// 可以在父类的基础上进行扩展
// public $age;
// 可以重写构造方法,对属性进行重新赋值
// public function __construct($age)
// {
// $this->age = $age;
// }
// 受保护的属性在子类里也可以调用,但是要在子类里面使用
public function get_salary()
{
return '父类的工资是:' . $this->salary;
}
// 子类和父类都有 bldy 重复了,可以用 parent:: 调用父类的 bldy
public function bldy()
{
return parent::bldy() . ',这是从B类里传出来的';
}
}
blay在子类调用
3.类的自动调用
- 函数:spl_autoload_register 自动加载
- 自动调用类的时候,会自动找到对应的文件名
- 实现自动加载,所有文件名和类名要保持一致,
- class 后面的类名,要和文件名一样,自动加载才能找到进行调用
- 创建类的自动加载
spl_autoload_register(
function ($className) {
// $className 是new的B这个名字,这个名字是类名,不是文件名
require_once $className . '.php';
}
);
4.不能继承
- 不给重写,关键词:final 加在public前面,让这个方法不能重写,只能用我这个,或者修改名字
把 final 写在 class 前面那么这个类就不能被继承
不能继承
// final 写在 class前面这个类就不能被继承
final class C
{
public $name;
public $id;
protected $salary;
private $password;
public function __construct($a, $b, $c, $d)
{
$this->name = $a;
$this->id = $b;
$this->salary = $c;
$this->password = $d;
}
// final 写在方法前面,那么这个方法就不能被修改
final public function bldy()
{
return "我的名字叫:{$this->name},我的id是:{$this->id},我的密码是:{$this->password},我的工资有:{$this->salary}";
}
}
5.静态成员
- 静态成员的关键词:static 可以给属性(变量),也可以给方法
- 静态成员用 self:: 代表本类
- 静态成员可以给属性默认值.但是不能给方法默认值,
- 如果这个属性和方法是静态的,就不要用原始的访问方式了
静态成员访问方式,用类名::属性名,类名::方法名()
一个类,不用实例就能使用里面的属性和方法.
- 没有对象也能使用静态成员
- 静态成员,变量访问,变量要加 $ 符号
静态成员由本类掉用,为所有实例共享
静态类
class Shop
{
// 静态属性
public static $title;
public $price;
public $num1 = 1;
public static $num2 = 2;
public function __construct($t, $p)
{
$this->title = $t;
$this->price = $p;
$this->num1++; // 普通变量,都是从头开始计算
// self:: 代表静态成员的本类
self::$num2++; // 静态成员,只要是调用了,就会增加1
}
// 静态方法
public static function cartoon()
{
return '使用' . Shop::$title;
}
}
调用
Shop::$title = '苹果13Pro'; // 赋值
echo Shop::$title;
echo '<hr>';
echo Shop::cartoon();
echo '<hr>';
echo Shop::$num2;
输出