self在 PHP 5 中,什么时候应该使用 ‘self’ 而不是 ‘$this’?
self
$this引用当前对象。self引用当前类。换句话说, $this->member用于非静态成员,self::$member用于静态成员。
$this
$this->member
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
$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(); ?>
下面是一个带有for 成员函数的多态性示例:$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(); ?>
下面是一个使用for 成员函数来抑制多态行为的例子: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()当前对象的确切类型的成员函数。如果对象是 of type X,它会调用X::foo(). 如果对象是 of type Y,则调用Y::foo(). 但是 self::foo()X::foo()总是被调用。
$this->foo()
foo()
type X
X::foo()
type Y
Y::foo()