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->
引用了类的当前实例(对象)(可能也是错误的)。但是,有什么区别?
答案 0 :(得分:17)
$this
指的是类的实例,这是正确的。但是,还有一种称为静态的东西,对于该类的所有实例都是相同的。 self::
是这些属性和函数的访问者。
此外,您通常无法从静态方法访问实例成员。意思是,你做不到
static function something($x) {
$this->that = $x;
}
因为静态方法不知道你指的是哪个实例。
答案 1 :(得分:10)
$this
引用当前对象,self
引用当前类。该类是对象的蓝图。所以你定义了一个类,但是你构造了对象。
换句话说,将self用于静态,将此用于非静态成员或方法。
答案 2 :(得分:3)
self
用于类级别范围,而$this
用于实例级范围。
答案 3 :(得分:3)
$这 - >处理扩展类时会引用你扩展的当前作用域,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 :: 主要用于调用类中的常量变量。