目录
一.$this是什么
在PHP中,指向对象的变量是引用变量,该变量里存储的是所指向的对象的内存地址,引用变量传值时候,传递的是对象的
地址,而非复制该对象。
<?php
class test
{}
$A=new test();
$B=$A;
//$B和$A是指向同一个内存地址,只是名字不同,本质并无区别,对象A和对象B是同一个对象
?>
理解了这一点再来看看$this变量:
1.$this是一个伪变量,伪变量不是真正的变量,只是形式上是变量,变量中存储的是固定的值,$this中并没有。
2.哪个对象调用,$this就代表哪个对象。
3.也就是说$this是一个对象,类实例化以后,$this就代表这个对象,是该实例化对象的一个引用。
(其实就跟上面例子里面的$A和$B一样,假设某个对象叫做A,A里面有个$this变量,而这个变量就是A本身)
4.$this->只能在类的内部使用。
定义类的时候无法得知对象名称是什么,为了方便调用类中的方法和变量就要使用伪变量$this.
还是举个例子:
<?php
class test
{
function test()
{
if(isset($this)) //判断$this变量是否存在
{
echo '$this的值为:'.get_class($this); //返回$this所属类的名称,get_class()返回对象所属类
//称名
echo "<br/>";
var_dump($this); //var_dump()函数具体看看$this是什么
}
else
{echo "$this未定义";}
}
}
$class_name=new checkout();
$class_name->test();
?>
输出结果:
$this的值为:checkout
object(checkout)#1 (0) { }
其实此刻,对象$class_name内有一个变量叫做$this,这个$this就是$class_name本身。
在$class_name这个对象诞生的时候,类里面的$this就自动变成了$class_name的引用了。
只不过:$this->只能在类的内部使用。
二.操作符“::”、self、静态方法、静态变量
相对只能在类内部使用的伪变量$this来说,操作符::更加强大。
它可以在没有声明任何实例的情况下访问类中的方法或变量。
//在类的内部使用
parent::变量名/常量名/方法名 (调用父类中变量名/常量名/方法名 )
self::变量名/常量名/方法名 (调用本类变量名/常量名/方法名)
//在类外部使用
类名::变量名/常量名/方法名
class::attribute/function,类的方法无论是静态或者非静态都可以这样子访问,
//不实例化,用类::访问非静态方法是非标准操作,但是你会发现也可以用,暂时不太清楚为什么。
但非静态成员变量无法访问,静态成员变量可以这样做访问,很简单,非静态变量不实例化谁也不知道它是啥,内存中根本没有.
不能通过一个对象来访问其中的静态成员,但可以通过静态方法去访问静态成员。
类中的静态方法只能是操作静态成员,所以静态方法都是用来操作静态成员变量的。而普通方法,则可以调用静态变量。
静态成员不属于具体的哪个对象,是属于类的。
类的静态变量或方法早已经在内存中存在,因此非静态方法、对象对静态成员调用一般都是没有问题的。
三.$this、self的联系和区别
1.self代表类,$this代表对象
2.能用$this的地方一定使用self,能用self的地方不一定能用$this
3.总而言之,self的作用比$this更加广一些,但是一般来说self常用来调用静态成员(还能调用常量、非静态成员变量和函数),其他情况还是用$this比较多。
四.奇怪的地方
有些用法,看教材上原则上都是不允许的,但有时候你试了一下发现也没有问题,比如不实例化访问非静态方法,但最好还是按照定义规矩来用吧。
五.补充一个总结的比较好的文章
https://www.cnblogs.com/kenshinobiy/p/9557294.html
测试代码:
<?php
class User
{
public $name;
public function setName()
{
$this->name="Hello World";
}
public function test()
{
echo "类调用了我,我是test()普通方法";
}
public function testSelf()
{
echo self::test().":self调用了普通方法"; //self::普通方法
}
public static function staticTest()
{
echo "对象调用了我,我是staticTest()静态函数";
}
}
$user=new User();
$user->name="你好";
print_r($user->name);
echo "<br>";
$user->setName();
print_r($user->name);
echo "<br>";
$user->testSelf();
echo "<br>";
User::test();
echo "<br>";
$user::staticTest();
?>