加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

在PHP中使用“this”和“self”

发布时间:2020-12-13 16:46:20 所属栏目:PHP教程 来源:网络整理
导读:Use $this to refer to the current object. Use self to refer to the current class. In other words,use $this-member for non-static members,use self::$member for static members. http://board.phpbuilder.com/showthread.php?10354489-RESOLVED-php

Use $this to refer to the current object. Use self to refer to the
current class. In other words,use $this->member for non-static
members,use self::$member for static members.

http://board.phpbuilder.com/showthread.php?10354489-RESOLVED-php-class-quot-this-quot-or-quot-self-quot-keyword

class Demo
{
    private static $name;
    private $age;

    public function __construct($name,$age) 
    {
        self::$name = $name;
        $this->age=$age;
    }   

    public function show()
    {       
        echo "Name : ",self::$name,"<br/>";   //Accessing by self
        echo "Name : ",Demo::$name,"<br/>";   //Accessing by class name 
        echo "Age  : ",$this->age,"<br/>";    
    } 
}

$demo = new Demo("Tiny",13);
$demo->show();

这会产生以下输出.

Name : Tiny
Name : Tiny
Age : 13

前面代码段中self :: $name和Demo :: $name有什么区别?

class Person1
{
    private $name;
    private $address;

    public function __construct($name,$address)
    {
        $this->name = $name;
        $this->address = $address;
    }

    public function show()
    {
        echo "Name    : ",$this->name,"<br/>";    
        echo "Address : ",$this->address,"<br/>";  //Accessing by this
    }
}

$p1=new Person1("xxx","yyy");
$p1->show();

class Person2
{
    private $name;
    private $address;

    public function __construct($name,$address)
    {
        self::$name = $name;
        self::$address = $address;
    }

    public function show()
    {
        echo "Name    : ",self::$address,"<br/>"; //Accessing by self 
    }
}

$p2=new Person1("xxx","yyy");
$p2->show();

在前面的两个类Person1和Person2产生如下相同的输出.

Name : xxx
Address : yyy

有什么区别(如在Preson1类中,show()方法)

$this->name;
$this->address;

和(如在Preson2类中,show()方法)

self::$name;
self::$address;

在这种背景下?

解决方法

在Demo类中使用Demo :: $name和self :: $name实际上是相同的.您可以通过名称访问它,因为变量是静态的和可访问的,就像您可以使用类的名称从不同的类访问公共静态变量一样.

因此,在这种情况下,按名称访问主要是能够从可访问类访问任何公共静态变量的副产品.

第二个输出与第一个输出相同,因为您显然正在创建一个新的Person1对象,而不是Person2对象(请参阅:$p2 = new Person1(“xxx”,“yyy”);)

如果您要创建一个Person2对象,那么您将收到一个错误,因为您无法将值分配给尚未声明的静态变量(您在名称和地址中有对象级变量,但不是静态的).如果您将它们声明为静态,那么由于它使用静态调用,您将从修改后的show方法获得相同的输出.

如果您不确定对象(读取:实例)变量和静态变量之间的区别是什么,那么我建议您参与一些Google搜索,但基本上静态变量存在于类级别,而不是对象级别,并且可以访问来自任何类方法或指定类型的对象(例如,如果你有100个Person2实例,他们都可以访问相同的名称变量,例如),而实例变量对于单个对象本身是唯一的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读