前言

前面我们介绍了面向对象相关的内容,我们了解到访问对象的成员必须通过对象的引用来完成.如果在对象的内部,在对象的成员方法中访问自己对象中的成员属性,或者访问自己对象内其他成员方法时怎么处理呢?

答案只有一个,不管是在对象的外部还是在对象内部,访问对象中的成员都必须使用对象的引用变量,但是对象创建完成以后,对象的引用名称无法在对象的方法中找到. 如果在对象的方法中再次使用new关键字创建一个对象则是另一 个对象,调用的成员也是另一个新创建对象的成员。而且对象一旦被创建,在对象中的每个成员方法里面都会存在一个特殊的对象引用“$this . 成员方法属于哪个对象,$this引用就代表哪个对象,专门用来完成对象内部成员之间的访问. this的本意就是“这个”的意思,就像每个人都可以使用第一人称代词 “我"代表自己一样. 比如,别人想访问你的年龄,就必须使用“张三的年龄”的形式,相当于在对象外部使用引用名称“张三”访问它内部的成员属性“年龄”.  如果自己想说出自己的年龄,则使用“ 我的年龄”的形式,相当于在对象的内部使用引用名称“我”访问自己内部的成员。

代码实践:是骡子是马拉出来溜溜

接着我们通过具体例子来介绍相关的使用情况, 比如,在类Person中声明了两个方法say()和run(),通过类Person实例化的三个实例对象$person1、$person2和$person3中都会存在say()和run()这两个成员方法,则每个对象中的这两个成员方法各自存在一个$this 引用。在对象$person1的两个成员方法中的$this引用代表$person1,在对象$person2的两个成员方法中的$this引用代表$person2,在对象$person3的两个成员方法中的$this引用代表$person3,可以明显看出,特殊的对象引用$this 就是在对象内部的成员方法中,代表着“本对象”的一个引用,但只能在对象的成员方法中使用。不管是在对象内部使用$this访问自己对象内部的成员,还是在对象外部通过对象的引用名称访问对象中的成员,都需要使用特殊的运算符号来完成访问。下面我们通过代码实例来介绍$this的使用,定义一个Animals类,在声明类Animals时,成员方法eat()中使用$this 引用访问自己对的内部的所有成员属性。然后调用每个对象中的eat()方法和run()方法,让每动物都能向别人介绍自己的名字、年龄和喜欢吃的事物。具体代码如下所示:

【web 开发】PHP 特殊的对象引用之 "$this"_成员方法

<?php
class Animals{//定义一个动物类
	var $name; //定义动物名称
	var $age; //动物年龄
	var $food; //动物年龄
	
	//定义动物吃饭的成员方法
	function eat(){
		echo '我是一只' . $this->name . ', 已经' .  $this->age . '岁了,我喜欢吃' . $this->food . '<br>'; //使用$this访问类中的成员属性
		echo '我是一只' . $this->name . ', 我喜欢跑跑跳跳<br>';//使用$this访问类中的成员属性
	}
	
	//定义动物跑动的方法
	function run(){
		echo '我是一只' . $this->name . ', 我喜欢跑跑跳跳<br>';//使用$this访问类中的成员属性
	}
}

//实例化Animals类
$animal1 = new Animals();
$animal2 = new Animals();
$animal3 = new Animals();

//给类中的成员属性赋值
$animal1->name = '小猫';
$animal1->age = 2;
$animal1->food = '鱼干';


//给类中的成员属性赋值
$animal2->name = '小羊';
$animal2->age = 5;
$animal2->food = '草';


//给类中的成员属性赋值
$animal3->name = '小兔子';
$animal3->age = 3;
$animal3->food = '胡萝卜';

//通过实例化的对象访问类中的eat()方法
$animal1->eat();
$animal2->eat();
$animal3->eat();

//通过实例化的对象访问类中的run()方法
$animal1->run();
$animal2->run();
$animal3->run();

执行结果如下图:

【web 开发】PHP 特殊的对象引用之 "$this"_引用名_02

总结

在上面的代码中,$animal1,$animal2,$animal3三个对象中都有eat()和run()这两个成员方法,如需访问哪个对象中的成员方法eat(),方法中的$this引用就代表的是访问哪个对象,并且通过$this访问自己内部相应的成员属性.如果想在对象的成员方法eat()中调用自己的另一个成员方法run()方法也是可以的,同样是在eat()方法中使用$this->run()的方式来完成对象的访问.