PHP 类或 PHP 方法中 self 和 $this-> 的区别在哪里?

Posted

技术标签:

【中文标题】PHP 类或 PHP 方法中 self 和 $this-> 的区别在哪里?【英文标题】:Where's the difference between self and $this-> in a PHP class or PHP method? 【发布时间】:2010-12-29 05:33:34 【问题描述】:

self$this->php 类或 PHP 方法中的区别在哪里?

例子:

我最近看到了这段代码。

public static function getInstance() 

    if (!self::$instance) 
        self::$instance = new PDO("mysql:host='localhost';dbname='animals'", 'username', 'password');;
        self::$instance-> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    return self::$instance;

但我记得$this-> 指的是一个类的当前实例(对象)(也可能是错误的)。但是,有什么区别呢?

【问题讨论】:

复制:***.com/questions/151969/php-self-vs-this 非常适合您的资源 - programmerinterview.com/index.php/php-questions/… 可悲的是没有人告诉你静态:: 在答案中 【参考方案1】:

$this 指的是类的实例,这是正确的。但是,还有一种叫做静态的东西,对于该类的所有实例都是相同的。 self:: 是这些属性和函数的访问器。

此外,您通常不能从静态方法访问实例成员。意思是,你不能这样做

static function something($x) 
  $this->that = $x;

因为静态方法不知道您指的是哪个实例。

【讨论】:

self:: 对象内部指的是同一继承级别的属性/方法,其中$this-> 指的是对象继承的方法。换句话说, self:: 更精确。在初始化对象内部,它也不是静态调用,除非您处理显式定义的静态属性/方法。这个“答案”从上到下都是错的。 @AnrDaemon 我不知道你多大了,但在你事后获得学位之前,这个答案是 100% 正确的。我不知道 PHP 后来做了什么,因为当开发人员开始公然无视质量或经验数据来做出决定时,我就放弃了使用它。那可能是在这个答案之前。同样,这个答案在所有其他面向对象的语言中都适用,就其自身而言。如果它不在 PHP 中,那么 PHP 是错误的,而不是我。感谢您的意见,它已被记录并丢弃。 @TorValamo 不,您的回答是正确的。评论者可能对 javascript 中“this”的使用感到困惑,它将查找保持在当前上下文中。【参考方案2】:

$this 指当前对象,self 指当前类。类是对象的蓝图。所以你定义了一个类,但是你构造了对象。

换句话说,将 self 用于静态,将 this 用于非静态成员或方法。

【讨论】:

【参考方案3】:

self 用于类级别范围,而$this 用于实例级别范围。

【讨论】:

【参考方案4】:
    this->无法访问静态方法或静态属性,我们使用self来访问它们。

    $this-> 处理扩展类时会引用你扩展的当前作用域,self 总是引用父类,因为它不需要实例来访问类方法或直接访问类。

    <?php
    class FirstClass
      function selfTest()
        $this->classCheck();
        self::classCheck();
       
      function classCheck()
        echo "First Class";
      
    
    class SecondClass extends FirstClass
        function classCheck()
          echo "Second Class";
        
    
    $var = new SecondClass();
    $var->selfTest(); //this-> will refer to Second Class , where self refer to the parent class
    

【讨论】:

【参考方案5】:

self 指调用对象的类。 $this 指的是对象本身。

【讨论】:

哦,有道理!谢谢老哥!【参考方案6】:

$this 用于引用类当前实例的方法和属性。

self 我们用于引用静态方法和属性,由类的所有实例共享(甚至可以在任何实例之外访问)

你可以看看Static Keyword(引用几行)

声明类属性或方法 因为静态使它们可以访问 无需实例化 班上。声明为的属性 静态不能访问 实例化的类对象(虽然 静态方法可以)

...

无法访问静态属性 使用箭头穿过对象 运算符 ->.

而且,从页面Properties (引用)

在类方法中的属性, 常量和方法可以被访问 使用$this-&gt;property 的形式 (其中property 是属性的名称) 除非访问权限是 上下文中的静态属性 静态类方法,在这种情况下 使用表单访问它 self::$property.

【讨论】:

【参考方案7】:

$this用于调用类的实例,其中self::多用于调用类内的常量变量。

【讨论】:

以上是关于PHP 类或 PHP 方法中 self 和 $this-> 的区别在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

php父类中访问子类的静态属性

laravel根目录的PHP文件中怎么引用门面类或辅助函数?

PHP $this,self,static 的区别

php中static和self调用静态方法区别

php中static self区别与总结

php类知识 self $this都只能在当前类中使用