而在 self 和 static 的利用上,有着细微的差别。特殊是类继续过程中,self 可能带来意想不到的反应,也正如那篇文章所说,建议利用 static 作为类本身的引用。
本文再来磋商,类内的 new self 与 new static 有什么差异。
学习韶光self 总是指向 new 关键字所声明的类;static 在静态绑定中,可以指向层级构造中的任意类。
下面举一个例子。
类B继续了类A的方法。对付 get_self 方法,返回的是类A本身。而static则返回的是调用者的类,也便是说,谁调用,static就指向谁。self 则持续地指向声明的类。
上面的代码,我们在类 A 中利用的是 static 静态方法,如果是动态方法,则须要利用到函数 get_class 用于获取类名。下面是一个示例:
方法 create2 中利用了 return new static(),毫无疑问,调用该方法的是工具 $b,那么返回的也肯定是 class B 本身。
方法 create1 中利用 get_class($this) 通过工具本身 $this,获取类名。由于 $this 指向 class B,以是返回的是 B,而 return new $class() 等同于 return new B(),也便是类B本身。
再进一步既然我们区分了 self 可以不经类实例化就可以利用其方法,static 一定是实例化后工具的引用,那么看下面这个例子,就会很清楚了:
class Foo { public $name = static::class;}$Foo = new Foo;echo $Foo->name; // Fatal error
上面的代码会出错。Fatal error 发生位置不是在 $Foo->name 行,而是声明行。由于 static::class 会发生缺点。在对属性赋值时,只能利用非静态绑定的工具,同理 $this 的方法可肯定弗成。要利用 self。
class Foo { public $name = self::class;}$Foo = new Foo;echo $Foo->name; // Foo
这样写就没错了。由于 self 引用的是类本身,调用 class 静态方法也完备行得通。
写在末了在程序架构时这些基类的设计很关键,须要详细方案和细分业务关系,self static $this 这些高频关键字,须要我们闇练节制。
Happy coding :_)
我是 @程序员小助手 ,持续分享编程知识,欢迎关注。