没有废话 ,我想直接抛出问题.
一,php 继承问题
上代码.
输出结果: 类 child
class father{
public function __construct(){
echo "类father";
}
}
class child extends father{
public function __construct(){
echo "类child";
}
}
$p=new child();
如果我们接触过纯面向对象的语言 :c#/java;
按照他们的语法,以上例子将会输出 :
类 father
类 child
当我们在 new 子类对象的时候,编译器应该会实例化它的父类,以此来产生一个继承链条,我们看到表面上 php 仅仅实例化了一个子类对象,这并不科学,也是后续问题产生的一个根本原因:php 到底存不存在继承链?
二,static ,self,parent 这些关键字
如果 php 不存在继承链,那么以上程序将报错.
class father{
public $a="father";
public function __construct(){
echo "类father";
}
public function Say(){
echo __CLASS__."say";
}
}
class child{
public function __construct(){
parent::construct();
self::Say();
static::Say();
$this->a;
echo "类 child";
}
}
$childs=new child();
所以 php 是存在继承链.
并且以上存在一些语法规则,子类可以通过 self 或者是 static 等关键字,去调用父类中可供调用的方法,和 $this 类似.
那么我们是不是就可以理解成:self:: 或者是 static:: 语法,指向了一个 father 类的实力对象? 要不然成员方法怎么调用?
但是奇怪的是:static::/self:: 不能调用属性字段 (非静态),parent:: 也是如此.
这个就尴尬了,凭什么非静态的方法能调用,字段属性就不行?
那么应该推翻 self::/static:: 是对象的引用,他们应该是类层面上的引用.
产生了矛盾.
凭什么能调用成员的方法,却无法调用成员属性?
来源: http://www.jianshu.com/p/5823e65aa9ac