PHP 类或 PHP 方法中 self 和 $this-> 的区别在哪里?
Posted
技术标签:
【中文标题】PHP 类或 PHP 方法中 self 和 $this-> 的区别在哪里?【英文标题】:Where's the difference between self and $this-> in a PHP class or PHP method? 【发布时间】: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->
指的是一个类的当前实例(对象)(也可能是错误的)。但是,有什么区别呢?
【问题讨论】:
复制:***.com/questions/151969/php-self-vs-this 非常适合您的资源 - programmerinterview.com/index.php/php-questions/… 可悲的是没有人告诉你静态:: 在答案中 【参考方案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】:-
this->无法访问静态方法或静态属性,我们使用self来访问它们。
$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->property
的形式 (其中property
是属性的名称) 除非访问权限是 上下文中的静态属性 静态类方法,在这种情况下 使用表单访问它self::$property
.
【讨论】:
【参考方案7】:$this用于调用类的实例,其中self::多用于调用类内的常量变量。
【讨论】:
以上是关于PHP 类或 PHP 方法中 self 和 $this-> 的区别在哪里?的主要内容,如果未能解决你的问题,请参考以下文章