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

时间:2009-12-22 18:37:46

标签: php oop this

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->引用了类的当前实例(对象)(可能也是错误的)。但是,有什么区别?

7 个答案:

答案 0 :(得分:17)

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

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

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

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

答案 1 :(得分:10)

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

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

答案 2 :(得分:3)

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

答案 3 :(得分:3)

  1. 这 - >无法访问静态方法或静态属性,我们使用self来访问它们。
  2. $这 - >处理扩展类时会引用你扩展的当前作用域,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
    

答案 4 :(得分:2)

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

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


您可以查看Static Keyword (引用几行)

  

声明类属性或方法   因为静态使它们可以访问   无需实例化   班级。声明为的财产   静态无法访问   实例化的类对象(尽管是   静态方法可以)

     

...

     

无法访问静态属性   使用箭头通过对象   运营商 - &gt;。


并且,从页面Properties (引用)

  

在类方法中的属性,   可以访问常量和方法   使用表格$this->property   (其中property是属性的名称)除非访问权限是a   上下文中的静态属性   一个静态类方法,在这种情况下   它是使用表单访问的   self::$property

答案 5 :(得分:1)

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

答案 6 :(得分:1)

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