今天重新复习了一下php中的面向对象编程,把一直没搞懂的this,self,static记录一下
class Base {
public function __construct() {
echo "Base constructor", PHP_EOL;
}
public static function getSelf() {
return new self();
}
public static function getInstance() {
return new static();
}
public function selfFoo() {
self::foo();
}
public function staticFoo() {
static::foo();
}
public function thisFoo() {
$this->foo();
}
public function foo() {
echo "Base Foo!", PHP_EOL;
}
}
class Child extends Base {
public function __construct() {
parent::__construct();
echo "Child constructor!", PHP_EOL;
}
public function foo() {
echo "Child Foo!", PHP_EOL;
}
}
$base = Child::getSelf();
$child = Child::getInstance();
$child->selfFoo();
$child->staticFoo();
$child->thisFoo();
// output:
// Base constructor
// Base constructor
// Child constructor!
// Base Foo!
// Child Foo!
// Child Foo!
self与static的区别:
在函数引用上,self与static的区别是:对于静态成员函数,self指向代码当前类,static指向调用类;对于非静态成员函数,self抑制多态,指向当前类的成员函数,static等同于this,动态指向调用类的函数。
class Base{
//...
public function selfFoo() {
$this::foo(); // this指向调用者
self::foo(); // self指向本身
}
}
$child::getSelf();
// output:
// Child constructor!
// Base constructor
this和self的区别:
- this不能用在静态成员函数中,self可以;
- 对静态成员函数/变量的访问,建议用self,不要用$this::或$this->的形式;
- 对非静态成员变量的访问,不能用self,只能用this;
- this要在对象已经实例化的情况下使用,self没有此限制;
- 在非静态成员函数内使用,self抑制多态行为,引用当前类的函数;而this引用调用类的重写(override)函数(如果有的话)。
总结
self是引用静态类的类名,而$this是引用非静态类的实例名。