PHP$this、self、parent

本文详细介绍了PHP中$this、self、parent的用法和区别。$this是一个伪变量,代表调用该方法的对象。self用于访问类的静态成员,而parent用于调用父类的方法。此外,还探讨了不实例化访问非静态方法的特殊情况。最后推荐了一篇深入总结的文章。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一.$this是什么

二.操作符“::”、self、静态方法、静态变量

三.$this、self的联系和区别

四.奇怪的地方

五.补充一个总结的比较好的文章


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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值