PHP类或方法中self和$this->有什么区别?

22

在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
重复:https://dev59.com/DXVC5IYBdhLWcg3w51hv - brettkelly
1
非常好的资源 - http://www.programmerinterview.com/index.php/php-questions/php-self-vs-this/ - Sudara
很遗憾,没有人在答案中告诉你关于 static:: 的事。 - Javier S
7个回答

20

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

此外,您通常无法从静态方法中访问实例成员。也就是说,您不能执行以下操作:

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

因为静态方法不知道你正在引用哪个实例。


self::在对象内部指的是相同继承级别的属性/方法,而$this->则指的是继承的对象方法。换句话说,self::更加精确。并且在初始化的对象内部,它也不是一个静态调用,除非您引用了明确定义的静态属性/方法。这个“答案”从头到尾都是错误的。 - AnrDaemon
@AnrDaemon 我不知道你多大了,但在你获得洞察力学位之前,这个答案是100%正确的。我不知道PHP后来做了什么,因为当开发人员开始展示对质量或经验数据的公然无视来做出决策时,我就停止使用它了。那可能是在这个答案之前。此外,在任何其他具有自尊心的面向对象语言中,这个答案都是正确的。如果在PHP中不是这样,那么PHP是错误的,而不是我。感谢您的意见,已被记录并丢弃。 - Tor Valamo
@TorValamo 不,你的答案是正确的。评论者可能被JavaScript中“this”的用法所困惑,它会使查找保持在当前上下文中。 - DarkWingDuck

19

$this指当前对象,self指当前类。类是对象的蓝图。因此您定义一个类,但构建对象。

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


4

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


4
  1. this-> can't access static method or static attribute , we use self to access them.
  2. $this-> when dealing with extended class will refer to the current scope that u extended , self will always refer to the parent class because its doesn't need instance to access class method or attr its access the class directly.

    <?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
    

2

$this 用于调用类的实例,而 self:: 则通常用于调用类内的常量变量。


2

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


哦,那很有道理!谢谢伙计! - Naz

2

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

self 用于引用静态方法和属性,这些方法和属性被所有实例共享(甚至可以在任何实例之外访问)


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

声明为静态的类属性或方法 可以在不需要实例化类的情况下访问。 声明为静态的属性无法通过已实例化的 类对象访问(虽然可以通过静态方法)

...

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


并且,来自页面 Properties (引用)

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接