【问题标题】:Where's the difference between self and $this-> in a PHP class or PHP method?PHP 类或 PHP 方法中 self 和 $this-> 的区别在哪里?
【发布时间】: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-> 指的是一个类的当前实例(对象)(也可能是错误的)。但是,有什么区别呢?

【问题讨论】:

标签: php oop this


【解决方案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】:
      1. this->无法访问静态方法或静态属性,我们使用self来访问它们。
      2. $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::多用于调用类内的常量变量。

          【讨论】:

            猜你喜欢
            • 2015-08-29
            • 2013-05-28
            • 2012-10-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-03-15
            相关资源
            最近更新 更多