先看一个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?php $o = new A(); echo $o->name(); $o = new C(); echo $o->name(); $o = new B(); echo $o->name(); class A { public function name() { return 'A'; } } class B extends C { public function name() { return 'B'; } } class C { public function name() { return 'C'; } } |
这里面 A C 都能输出出来, B 不能输出出来。
说明什么?
- 同一个文件中,类可以先使用后定义(但不完全)。
为什么类A和类C 都能执行,类B定义在中间反而不能执行了呢?
(猜测)PHP的加载执行逻辑:
- 先扫一遍文件:
- 把能加载的类先加载进来
- 上面文件中类A很干净,可以直接加载
- 扫到类B的时候,发现继承了C,但是C还没被扫到,所以不能加载类B
- 扫到类C的时候,发现C很干净,可以直接加载
- 把能加载的类先加载进来
- 再从头执行文件
- 发现类A 和类C已经加载进来了,可以执行。
- 发现类B没有加载进来,所以不能执行