一、什么是面向对象?
面向对象编程,也就是我们常说的OOP,其实是面向对象的一部分。面向对象一共有3个部分:面向对象分析(OOA)、面向对象设计(OOD)、面向对象编程(OOP)。我们现在将要学习的就是面向对象的编程,而面向对象编程中两个首要了解的也是很重要的概念就是类和对象。
类与对象
万物皆对象,世间的万物我们都可以看成是对象,因为他们都有各自的属性。比如:人有身高,体重,年龄,性别等等这些属性,也可以唱歌,跳舞,跑步等等行为。如果把人看成一个类的话,那么身高,体重,年龄,性别这些就是人这个类的属性,而唱歌,跳舞,跑步就是人这个类的行为。
大家可以尝试着去看看身边的事物,我们都可以把它看成一个类,多举例子,可以加深对类和对象概念的理解。
类的定义
类是对某个对象的定义。它包含有关对象动作方式的信息,包括它的名称、方法、属性和事件。实际上它本身并不是对象,因为它不存在于内存中。当引用类的代码运行时,类的一个新的实例,即对象,就在内存中创建了。虽然只有一个类,但能从这个类在内存中创建多个相同类型的对象。类是通过class关键字来定义的。
基本语法:
class 类名{
//属性、方法
}
注意事项:
1.定义一个类(只能用class定义)
2.定义类的属性public(public是修饰符,共有三个,是public,protected,private,这里我们暂时只用public)
举个例子:
定义一个汽车类,属性有车的颜色和价格
class car{
public $color; //定义属性
public $price;
}
php类的实例化方法
类的实例化又叫创建一个对象或者实例化一个对象或者把类实例化。
简单的来举个例子:
我们定义一个人的类,并把这个类实例化。
class Preson { //定义了一个Preson类
public $name; //定义类的属性(姓名,性别,年龄等等)==定义成员变量
public $age;
public $gender;
const SKILLS = '哈撒尅'; //声明一个常量
public function Run(){ //声明成员方法
echo "人在塔在";
}
// public .....
}
//new翻译是新的,意思就是创建一个新的人,并把这个新的对象赋值给$Preson1,这个就是实例化
$Preson1 = new Preson(); //实例化类
$Preson1->name = "张三";
$Preson1->age = 22;
$Preson1->gender = "女";
$Preson1->Run();//调用成员方法
echo $Preson1->name.' '.$Preson1->age.' '.$Preson1->gender;
//如果想输出第二个实例,直接输出就OK了,只要改一个变量名
$Preson2 = new Preson(); //实例化类
$Preson2->name = "小亮";
$Preson2->age = 25;
$Preson2->gender = "男";
二、面向对象的三大特性
1.封装性
简单形象的解释就是,把功能放在一个盒子里,要用到这个功能的时候,打开盒子,取出就可以使用。
2.继承性
子类自动继承一个或多个父类中的属性与方法,并可以重写或者添加新的属性或方法。
这个特性简化了类和对象的创建,提高了代码的可重用性。
3.多态性
指的是一个类可以创建多个对象,获取不同的结果。
三、构造函数
构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们,即构造函数的重载。
可能上面的描述大家还是不能很清楚的了解,我们就举例子向大家讲解下。
可以看到,上述例子中类实例化后赋值过程比较繁琐,如果变量很多的话,工作量将会非常大,很麻烦。所以,我们引入了构造方法。所以构造函数的作用就是用来初始化对象的。该方法可以没有参数,也可以有多个参数。定义构造函数也很简单,__construct(),值得注意的是函数construct前面是两个下划线"_".
了解了构造函数之后,我们用构造函数来重写上面的例子:
class Preson{
public $name; //定义变量
public $age;
public $sex;
public $height;
function __construct($name,$age,$sex,$height){
$this->name = $name; //为变量赋值
$this->age = $age;
$this->sex = $sex;
$this->height = $height;
}
public function PlayBaskteBall(){ //声明成员方法
if($this->height>175 || $this->age < 22){
return $this->name . "可以打篮球";
}else{
return $this->name . "不具备打球的条件";
}
}
}
$Preson1 = new Preson("大白","20","女","180"); //实例化类
echo $Preson1->PlayBaskteBall(); //调取成员方法
//输出结果为:大白可以打篮球
构造方法是初始化对象时使用的,如果没有构造方法,那么PHP会自动生成一个。自动生成的构造方法没有任何参数,没有任何操作。
四、析构函数
析构函数的作用和构造函数的作用正好相反,是对象被销毁时被调用,作用是释放内存。定义析构函数的格式为:__destruct(),和构造函数一样的是,前面也是两个下划线"_"。
我们用个例子更加深刻了解析构函数的用法。
class Preson{
public $name; //定义变量
public $age;
public $sex;
public $height;
function __construct($name,$age,$sex,$height){
$this->name = $name; //为变量赋值
$this->age = $age;
$this->sex = $sex;
$this->height = $height;
}
function __destruct(){
echo "对象被销毁了";
}
}
$Preson1 = new Preson("大白","20","女","180");
echo $Preson1->name;
echo $Preson1->name;
//运行的结果为:大白对象被销毁了
运行结束后,对象被销毁了。
析构函数使用注意事项:
php使用的是一种“垃圾回收”机制,自动清除不再使用的对象,释放内存,就是说即使不使用unset函数,析构方法也会自动被调用,这里只是明确一下析构函数在何时被调用。一般情况下是不需要手动创建析构方法的。
五、静态方法
不是所有的变量和方法都要通过创建对象来调用。可以通过给变量和方法加上static关键字来直接调用。
调用静态成员的语法格式为:
关键字::静态成员
关键字可以是:
(1)self,在类内部调用静态成员时所使用。
(2)静态成员所在的类名,在类外调用类内部的静态成员时所使用。
注意:在静态方法中,只能调用静态变量,而不能调用普通变量;而普通方法则可以调用静态变量。
静态方法实例讲解:
静态方法实例1:
class Math{
static function squared($input){
return $input*$input;
}
}
echo Math :: squared(3);
//运行结果为:9
上面是个简单的实例,值得注意的是,在静态方法中,不能使用$this关键字,因为可能会没有可以引用的对象实例。因为静态方法可以不需要实例化对象。
使用静态成员,除了可以不需要实例化对象外,另一个作用就是在对象被销毁后,仍然保存被修改的静态数据,以便下次继续使用。这个概念比较抽象,下面举个例子具体分析。
静态方法实例2:
header("content-type:text/html;charset=utf-8");
class Play{
static $num = 0;
function showNum(){
echo '这是你第' . self :: $num . '次玩LOL';
self :: $num++ ;
}
}
$play1 = new Play();
$play1 -> showNum();
echo '<br/>';
$play2 = new Play();
$play2 -> showNum();
echo '<br/>';
echo '这是你第' . Play::$num .'次玩LOL';
/*运行结果:
这是你第0次玩LOL
这是你第1次玩LOL
这是你第2次玩LOL*/
上述实例中,我们先定义了静态变量$num,然后再类中声明一个方法,在方法当中调用了静态变量,调用的方法可以在实例中看到,接着是给静态变量加1.依次实例化类的对象,再调用方法。接下来就是我们上面说的:在对象被销毁后,仍然保存被修改的静态数据,以便下次继续使用。
注意事项:
静态方法很好用,不用实例化对象,当类第一次加载的时候就已经给了静态成员空间。但是什么东西都是不能滥用的。因为一旦静态成员声明的过多,空间一直被占用着,那么会影响系统的运行速度和功能,所以切记:东西虽好,可不能贪多哦!
六、$this->用法
在成员方法中,调用成员方法的方法是对象名加方法名,格式就是“对象名->方法名”。但是在定义类的时候,我们往往不知道对象名是什么,所以就没法用对象名,这时,我们就要用到伪变量 t h i s 。 什 么 是 this。 什么是 this。什么是this?
t h i s 的 意 思 就 是 本 身 , 在 this的意思就是本身,在 this的意思就是本身,在this中有个指针,谁调用它,他就指向谁,它只能再类内部使用。
$this用法实例:
我们来举个例子,让大家可以更加清楚的看到这个$this的含义指向。
header("content-type:text/html;charset=utf-8");
class Preson{ //定义类
public $name;
public $age;
public function __construct($Name,$Age) //构造函数
{
$this -> name = $Name;
$this -> age = $Age;
echo '<br/>';
var_dump($this); //打印出$this
}
public function showInfo(){ //成员方法
echo "个人信息:";
echo '<br/>' . "名字是:" . $this -> name . '<br/>' . "年龄是:" . $this -> age;
}
}
$preson = new Preson("小草",25); //实例化
var_dump($preson); //打印出$this
$preson -> showInfo();
echo '<br/>';
$preson = new Preson("大树",30); //实例化
var_dump($preson); //打印出$preson
$preson -> showInfo();
总结
面向对象这个概念重在理解,面试的话这些基本的知识点应该就够用了!