PHP面试之面向对象

本文详细介绍了面向对象编程的基础知识,包括类与对象的概念,面向对象的三大特性(封装性、继承性、多态性),以及构造函数、析构函数、静态方法的用法。通过实例展示了如何定义类,创建对象,以及使用构造函数进行对象初始化。此外,还阐述了静态方法和`$this->`的用法,强调了静态成员在内存中的持久存在。面向对象是编程中重要的思想,理解和掌握这些基础知识对于编程实践至关重要。
摘要由CSDN通过智能技术生成


一、什么是面向对象?

面向对象编程,也就是我们常说的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。 什么是 thisthis?

t h i s 的 意 思 就 是 本 身 , 在 this的意思就是本身,在 thisthis中有个指针,谁调用它,他就指向谁,它只能再类内部使用。

$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();

总结

面向对象这个概念重在理解,面试的话这些基本的知识点应该就够用了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值