视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
关于PHP中self关键字的用法详解
2020-11-03 18:21:17 责编:小采
文档


与 parent 、 static 以及 this 的区别

要想将彻底搞懂 self ,要与 parent 、 static 以及 this 区分开。以下分别做对比。

parent

self 与 parent 的区分比较容易: parent 引用父类/基类被隐盖的方法(或变量), self则引用自身方法(或变量)。例如构造函数中调用父类构造函数:(免费学习视频教程分享:php视频教程)

class Base {
 public function __construct() {
 echo "Base contructor!", PHP_EOL;
 }
}

class Child {
 public function __construct() {
 parent::__construct();
 echo "Child contructor!", PHP_EOL;
 }
}

new Child;
// 输出:
// Base contructor!
// Child contructor!

static

static 常规用途是修饰函数或变量使其成为类函数和类变量,也可以修饰函数内变量延长其生命周期至整个应用程序的生命周期。但是其与 self 关联上是PHP 5.3以来引入的新用途:静态延迟绑定。

有了 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() {
 return self::foo();
 }

 public function staticFoo() {
 return static::foo();
 }

 public function thisFoo() {
 return $this->foo();
 }

 public function foo() {
 echo "Base Foo!", PHP_EOL;
 }
}

class Child extends Base {
 public function __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();

输出结果如下:

在函数引用上, self 与 static 的区别是:

对于静态成员函数, self 指向代码当前类, static 指向调用类;对于非静态成员函数, self 抑制多态,指向当前类的函数, static 等同于 this ,动态指向调用类的函数。

parent 、 self 、 static 三个关键字联合在一起看挺有意思,分别指向父类、当前类、子类,有点“过去、现在、未来”的味道。

this

self 与 this 是被讨论最多,也是最容易引起误用的组合。

两者的主要区别如下:

1、this 不能用在静态成员函数中, self 可以;

2、对静态成员函数/变量的访问, 建议 用 self ,不要用 $this:: 或 $this-> 的形式;

3、对非静态成员变量的访问,不能用 self ,只能用 this ;

4、this 要在对象已经实例化的情况下使用, self 没有此;

5、在非静态成员函数内使用, self 抑制多态行为,引用当前类的函数;而 this 引用调用类的重写(override)函数(如果有的话)。

self 的用途

看完与上述三个关键字的区别, self 的用途是不是呼之即出?一句话总结,那就是: self总是指向“当前类(及类实例)”。详细说则是:

1、替代类名,引用当前类的静态成员变量和静态函数;

2、抑制多态行为,引用当前类的函数而非子类中覆盖的实现;

相关文章教程推荐:php教程

下载本文
显示全文
专题