0x00 写在前面
从零学习php,最终目的实现代码审计入门,软件采用sublime text,环境使用phpstudy搭建,需要有简单的html基础和php基础,跟随流沙前辈视频学习记录。
OOP编程即面对对象编程,本篇学习面向对象中的继承。
0x01 构造函数和析构函数
了解继承之前,先初步学习构造函数和析构函数。
参考链接:PHP: 构造函数和析构函数 - Manual
初步了解构造方法和析构方法
test1.php
<?php
header("Content-type:text/html;charset=utf-8");
class Human{
public $name;
public $food;
public function __construct(){ //构造方法使用的时 __construct
echo "这是构造方法</br>";
}
public function eat(){
echo $this->name."吃".$this->food."<br/>"; //方法里调用属性要使用$this
}
public function __destruct(){ //析构方法使用__destruct
echo "这是析构方法</br>";
}
}
$man = new Human(); //实例化对象
$man->name = "老人";
$man->food = "米饭";
$man->eat(); //虽然我们这里只调用了一个eat();但是构造方法和析构方法都会自动调用
$x = new Human(); //实例化对象
$x->name = "小米";
$x->name = "肉";
$man->eat(); //虽然我们这里只调用了一个eat();但是构造方法和析构方法都会自动调用
构造函数相较于析构函数更加常用;构造方法的主要作用是对属性进行赋值。
下面代码显示构造函数的小例子
test2.php
<?php
header("Content-type:text/html;charset=utf-8");
class Human{
public $name;
public $food;
public function __construct($name,$food){ //构造方法使用的时 __construct,
$this->name = $name; //这里对于属性进行一个初始化
$this->food = $food; //这里对于属性进行一个初始化
//echo "这是构造方法</br>";
}
public function eat(){
echo $this->name."吃".$this->food."<br/>"; //方法里调用属性要使用$this
}
}
$p = new Human("小米","米饭"); //对应构造方法的$name,$food
$p->eat();
0x02 类的继承
个人感觉继承的存在主要是用来提高代码使用效率的,比如建立一个模块,成为它的子类直接调用即可,达到低耦合的作用。
参考链接:PHP: 对象继承 - Manual
初步了解继承
test3.php
<?php
header("Content-type:text/html;charset=utf-8");
//继承的关键字是extends
class Father{ //定义一个父类
public function Money(){
echo "100000";
}
}
class Son extends Father{ //使用extends定义一个子类
public function useMoney(){
echo "-1000";
}
//也可以重写父类
/*
public function Money(){
echo "5000"; //如果敲入此代码,那么下面的实例化对象在调用Money()时会输出5000而不是-1000
}
*/
}
$s = new Son(); //实例化一个对象
$s->useMoney(); //调用useMoney
$s->Money(); //因为子类继承了父类,所以也可以使用Money()
访问修饰符用来限定访问位置,即限定条件
public 表示全局,类内外部都能访问
protected 表示受保护的,外部不可以访问
private 表示私有的,只有本类才可访问
public protected private
外部 Y N N
子类中() Y Y N
本类中 Y Y Y
限定条件简单代码
test4.php
<?php
header("Content-type:text/html;charset=utf-8");
//继承的关键字是extends
class Father{ //定义一个类
public $a = "aaaa";
protected $b = "bbbb"; //这是在本类中
private $c = "cccc";
public function show1(){
echo "father show1<br/>";
}
protected function show2(){
echo "father show2<br/>";
}
private function show3(){
echo "father show3<br/>";
}
}
class Son extends Father{
public function show(){
echo $this->a."<br/>";
echo $this->b."<br/>";
echo $this->c."<br/>"; //访问test4.php时会发现是无法输出的,因为限定条件是private
}
}
$s = new Son();
$s->show();
0x02 self 、parent and final
this代表本对象;self代表本类;parent代表父类
self往往用在静态变量、静态方法;parent指向父类
参考链接:PHP中this,self,parent的区别 - 腾讯云开发者社区-腾讯云
parent例子
test4.php
<?php
header("Content-type:text/html;charset=utf-8");
//继承的关键字是extends
class Father{ //定义一个类
public $a = "aaaa";
protected $b = "bbbb"; //这是在本类中
private $c = "cccc";
public function show1(){
echo "father show1<br/>";
}
protected function show2(){
echo "father show2<br/>";
}
private function show3(){
echo "father show3<br/>";
}
}
class Son extends Father{
public function show(){
parent::show1(); //子类中调用父类的方法使用parent
parent::show3(); //因为是show3()是private,所以会报错
}
}
$s = new Son();
$s->show();
final如果修饰了一个类,那么该类无法被继承;如果修饰一个方法,那么该方法无法被重写
参考链接:final关键字在PHP中的使用 - 腾讯云开发者社区-腾讯云