抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

今天重新复习了一下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的区别:

  1. this不能用在静态成员函数中,self可以;
  2. 对静态成员函数/变量的访问,建议用self,不要用$this::或$this->的形式;
  3. 对非静态成员变量的访问,不能用self,只能用this;
  4. this要在对象已经实例化的情况下使用,self没有此限制;
  5. 在非静态成员函数内使用,self抑制多态行为,引用当前类的函数;而this引用调用类的重写(override)函数(如果有的话)。

总结

self是引用静态类的类名,而$this是引用非静态类的实例名。

评论