关于php面对对象

2019年10月19日 0 作者 y1nhui

0x001背景

在做php代码审计时,经常会遇到如
$this->cookie_name
这样的代码,每次看到都是一阵头疼。
因为我的oop学习并不是很好,所以每次审这类代码都是一知半解。
这次决定好好把php的oop学一遍,于是有了这篇文章。

0x002 相关概念

面对对象:面对对象是一种编程风格,不同于面对过程的细致具体,它更像是你想吃饭时让提个结果然后让别人做好,无需知道过程,只要起始与结果(无论它中途发送了什么,哪怕是在做布朗运动,只要得出结果便无所谓)。

类: 具有相同属性(特征)和方法(行为)的一系列个体的集合,类是一个抽象的概念
(总感觉其实类就是c里的结构体)

对象:被具象化的类

如:学生的姓名、性别、年龄是类
王二,男,19 就是对象

方法:方法是定义特定功能的代码块,在类中定义方法表示,创建对象之后,对象的特定行为

继承:一个类从另一个已有的类获得其特性,称为继承。

派生:从一个已有的类产生一个新的类,称为派生。

0x003 类的声明与实体化

Class Exp{ //这个是类名
public $a;//这个是属性_(:з」∠)_
public $b;
public $c;
}

↑就是这样
注:这里是可以不加public,加public只是为了可以继承(:з」∠)

实体化:
$exp1 = new Exp();
定义了就要调用。
<font color="red">类外部调用属性:</font>
$对象名->属性名//属性名不需要带$
如:
$exp2=$exp1->a;
<font color="red">类内部调用属性:</font>
$this->属性名;
如:
$this->b = $m;

0x004 方法

在类内,有时会见到一些函数
如:

Class Student{
public $name;
public $sex;
public $age;
    public function favorite($subject){
        echo "Student's favourite subject is ".$subject;
    }
}

这里的函数favorite就是一个方法。
先实例化
$student1 = new Student();
调用的方法也比较简单:
$Student1 -> favorite(math);

0x005 类继承

注意:PHP不支持多重继承

<?php
Class Creature{
    public $name;
    public $age;
    public $sex;
}
Class Student extends Creature{
    public $subject;
    public function show(){
        echo 'name is '.$this-> name;
        echo ' age is'.$this -> age;
        echo ' sex is'.$this -> sex;
        echo ' subject is '.$this -> subject;
    }
}

$student1 = new Student();

$student1 -> name = 'y1nhui';
$student1 -> age = '18';
$student1 -> sex = 'man';
$student1 -> subject = 'PHP';

$student1 -> show();

运行一下

如图,虽然在Student内我并没有定义name等,但是成功继承下来了。

在类内,经常可以看到对变量的修饰符
除了前面的<font color="red"> public:公共的</font>
还有:
<font color="red">protected:受保护的
private:私有的</font>
望词生意,public即可以在任意地访问,protected只有在类内及当前类的上下级继承关系类内访问而private只有类内可以访问。
同时,在类外可以访问静态属性,方法:
类名::属性名
在类内则是:
statis::属性名

<font color="red">注:在这里应有一段对parent的解读,但是我找到的案例似乎只是将父类内的方法在子类内继承出来,但是继承本身便会继承方法,暂时没弄懂,故不写</font>
重写:及在子类中进行变量覆盖…就像在函数内改写输入值一般,在函数内会变,但主函数值不受影响。
最终类:final class
将类封死,让后来者无法对类进行继承。
形如:
final class a{

}

最终方法 fina method
封死方法,使下级类无法改写其内容。
形如:
final function a{

}