使用$this引用当前对象。使用self引用当前类。换句话说,对于非静态成员使用$this->成员,对于静态成员使用self::$member。
例子
下面是一个正确使用$this和self的例子,用于非静态和静态成员变量:
<?php
class X {
private $non_static_member = 1;
private static $static_member = 2;
function __construct() {
echo $this->non_static_member . ' '
. self::$static_member;
}
}
new X();
?>
下面是对非静态和静态成员变量不正确使用$this和self的示例:
<?php
class X {
private $non_static_member = 1;
private static $static_member = 2;
function __construct() {
echo self::$non_static_member . ' '
. $this->static_member;
}
}
new X();
?>
这里有一个关于成员函数的$this多态性的例子:
<?php
class X {
function foo() {
echo 'X::foo()';
}
function bar() {
$this->foo();
}
}
class Y extends X {
function foo() {
echo 'Y::foo()';
}
}
$x = new Y();
$x->bar();
?>
这里有一个例子,通过在成员函数中使用self来抑制多态行为:
<?php
class X {
function foo() {
echo 'X::foo()';
}
function bar() {
self::foo();
}
}
class Y extends X {
function foo() {
echo 'Y::foo()';
}
}
$x = new Y();
$x->bar();
?>
$this->foo()调用foo()成员函数,该成员函数的类型与当前对象的确切类型相同。如果对象是X类型的,那么它就调用X::foo()。如果对象的类型是Y,它调用Y::foo()。但是对于self::foo(), X::foo()总是被调用。