0x00 写在前面
从零学习php,最终目的实现代码审计入门,软件采用sublime text,环境使用phpstudy搭建,需要有简单的html基础和php基础,跟随流沙前辈视频学习记录。
OOP编程即面对对象编程,面向对象语言需要想到 封装、继承和多态,至于这三者是什么东西,个人还在摸索中。
0x01 面向对象实例
之前个人因学习php反序列化也接触过类、属性、方法等东东;但个人技术有限,又不能很好的讲述出对于这些东东的深层作用,所以保持敬畏,不误人子弟,不作讲解。
参考链接:PHP: 基本概念 - Manual
三个例子的区别主要在于下面调用的部分。第一个例子
test.php
<?php
header("Content-type:text/html;charset=utf-8");
//类:class
class Person{ //定义一个类名为Person
//属性 理解为变量
//修饰符有三种 public protected private
public $name="人"; //属性前面不加默认为private
public $age="20";
public $add="www";
//方法 理解为函数
public function eat(){ //方法前面不加默认为public
echo "吃饭";
}
public function sleep(){
echo "睡觉";
}
public function add($a,$b){
echo $a+$b;
}
}
//类可以实例化为对象
//类 ->对象
$xiaoming = new Person(); //实例化对象xiaoming
echo $xiaoming->name;
echo "</br>";
echo $xiaoming->eat();
echo "</br>";
echo $xiaoming->add(1,2);
第二个例子展示调用属性但重新赋值
test1.php
<?php
header("Content-type:text/html;charset=utf-8");
//类:class
class Person{ //定义一个类名为Person
//属性 理解为变量
//修饰符有三种 public protected private
public $name="人"; //属性前面不加默认为private
public $age="20";
public $add="www";
//方法 理解为函数
public function eat(){ //方法前面不加默认为public
echo "吃饭";
}
public function sleep(){
echo "睡觉";
}
public function add($a,$b){
echo $a+$b;
}
}
//类可以实例化为对象
//类 ->对象
$xiaoming = new Person(); //类创建后,可以使用 new 运算符来实例化该类的对象:实例化对象为xiaoming
$xiaoming->name="小明"; //调用name,但直接给其赋值
$xiaoming->age="18";
echo $xiaoming->name;
echo "</br>";
echo $xiaoming->age;
第三个例子展示$this的作用,方法里调用属性,要使用$this,否则会报错,这点需要理解局部变量和全局变量。
test2.php
<?php
header("Content-type:text/html;charset=utf-8");
//类:class
class Person{ //定义一个类名为Person
//属性 理解为变量
//修饰符有三种 public protected private
public $name="人"; //属性前面不加默认为private
public $age="20";
public $add="www";
public $food="米饭";
//方法 理解为函数
public function eat(){ //方法前面不加默认为public
echo $this->name."吃".$this->food;
//方法里调用属性,使用$this 直接输出echo $name."吃".$food;会报错
}
public function sleep(){
echo "睡觉";
}
public function add($a,$b){
echo $a+$b;
}
}
//类可以实例化为对象
//类 ->对象
$xiaoming = new Person(); //类创建后,可以使用 new 运算符来实例化该类的对象:
$xiaoming->eat();
0x02 static 和const
static声明类属性或方法为静态,就可以不实例化类而直接访问。可以在实例化的类对象中通过静态访问。
static可以修饰属性也可以修饰方法。修饰属性就为静态属性;修饰方法就为静态方法。
参考链接:PHP: 静态(static)关键字 - Manual
下面继续运行例子了解static的使用
<?php
header("Content-type:text/html;charset=utf-8");
//类:class
class Person{ //定义一个类名为Person
//属性 理解为变量
//修饰符有三种 public protected private
public $name="人"; //属性前面不加默认为private
public $age="20";
public $food="食物";
static public $location="地球"; //当使用static修饰属性时,这个属性这时就不属于某个实例化对象而是属于这个类
//方法 理解为函数
public function eat(){ //方法前面不加默认为public
echo "吃饭";
}
public function sleep(){
echo "睡觉";
}
public function add($a,$b){
echo $a+$b;
}
static public function sport(){ //在静态方法中只能调用静态属性,也就是说这里只能调用location
//echo "运动";
echo Person::$location="ww"; //调用location
}
}
//类可以实例化为对象
//类 ->对象
$x = new Person(); //实例化对象x
echo Person::$location; //要想使用需要用类调用,::用于连接
//正常调用echo $x->location; 会报错的
Person::sport();
类常量const
常量是一个定值,可以输出但不可以修改
参考链接:PHP 类常量 - const - PHP 基础教程 - 简单教程,简单编程
运用实例
<?php
header("Content-type:text/html;charset=utf-8");
//类:class
class Person{ //定义一个类名为Person
//属性 理解为变量
//修饰符有三种 public protected private
const PI=3.1415926; //定义一个常量PI
public $name="人"; //属性前面不加默认为private
public $age="20";
public $food="食物";
static public $location="地球"; //当使用static修饰属性时,这个属性这时就不属于某个实例化对象而是属于这个类
//方法 理解为函数
public function eat(){ //方法前面不加默认为public
echo "吃饭";
}
public function sleep(){
echo "睡觉";
}
public function add($a,$b){
echo $a+$b;
}
static public function sport(){ //在静态方法中只能调用静态属性,也就是说这里只能调用location
//echo "运动";
echo Person::$location="ww"; //调用location
}
public function testConst(){
echo Person::PI; //const也是用类调用,类比static
//echo $a->testConst(); 这样调用是错误的
}
}
//类可以实例化为对象
//类 ->对象
$a = new Person(); //实例化对象x
echo $a->testConst();
//如果说想要修改PI的值, Person::PI=3.153; 发现会报错,因为常量看可以输出,但不能修改
0x03 总结
通过学习类、属性、方法、实例化等名词含义及作用,掌握statci和const的区别,对OOP编程有一个初步了解。