关于oop:self和$ this->之间的区别在哪里?

Where's the difference between self and $this-> in a PHP class or PHP method?

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

例子:

我最近看到了这个代码。

1
2
3
4
5
6
7
8
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->指的是类的当前实例(对象)(也可能是错误的)。但是,有什么区别?


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

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

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

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


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

换句话说,使用self表示静态,而这表示非静态成员或方法。


  • 这个->不能访问静态方法或静态属性,我们使用self来访问它们。
  • $this->处理扩展类时,self会引用当前的作用域u extended,self总是引用父类,因为它不需要实例来访问类方法或让它直接访问类。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <?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

  • self用于类级作用域,而$this用于实例级作用域。


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

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

    您可以查看静态关键字(引用几行):

    Declaring class properties or methods
    as static makes them accessible
    without needing an instantiation of
    the class. A property declared as
    static can not be accessed with an
    instantiated class object (though a
    static method can)

    ...

    Static properties cannot be accessed
    through the object using the arrow
    operator ->.

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

    Within class methods the properties,
    constants, and methods may be accessed
    by using the form $this->property
    (where property is the name of the property) unless the access is to a
    static property within the context of
    a static class method, in which case
    it is accessed using the form
    self::$property.


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


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