21

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

例子:

我最近看到了这段代码。

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->指一个类的当前实例(对象)(也可能是错误的)。然而,有什么区别呢?

4

7 回答 7

19

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

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

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

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

于 2009-12-22T18:40:11.560 回答
17

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

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

于 2009-12-22T18:40:01.593 回答
4

self在类级别范围内$this使用,而在实例级别范围内使用。

于 2009-12-22T18:39:32.300 回答
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
    
于 2017-05-18T04:08:54.130 回答
2

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

于 2009-12-22T18:39:55.810 回答
2

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

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


您可以看一下静态关键字 (引用几行)

将类属性或方法声明为静态使它们无需实例化即可访问。实例化的类对象不能访问声明为静态的属性(尽管静态方法可以)

...

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


并且,从页面属性 (引用)

在类方法中,属性、常量和方法可以通过使用形式$this->property (其中property是属性的名称)来访问,除非访问的是静态类方法上下文中的静态属性,在这种情况下使用表格 self::$property

于 2009-12-22T18:42:08.067 回答
2

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

于 2015-06-08T08:55:34.473 回答