类继承的问题

NicoVon 2014-06-11 09:51:17
今天遇到一个有意思的问题,直接上代码
有一个父类和一个子类
fatherClass.php:

class father{
public $a;
function __construct(){
$this->a = 3;
}
}

son.php:

include 'fatherClass.php';
$son = new son();
$son -> sonFun();
class son extends father{
function sonFun(){
echo 222;
}
}

运行son.php报错找不到son这个类,问题来了。
1、如果把son继承父类的extends father去掉,则运行正确;
2、如果把fatherClass里的内容直接代替include语句,运行正确;
3、如果像下面一样写,运行也正确

include 'fatherClass.php';
class son extends father{
function sonFun(){
echo 222;
}
}
$son = new son();
$son -> sonFun();

哪位大神可以解释一下?
...全文
182 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
NicoVon 2014-06-12
  • 打赏
  • 举报
回复
多谢各位答疑解惑,平时写代码根本不会先实例化后定义,只是在运行一个SDK的时候发现的这个小问题
xuzuning 2014-06-11
  • 打赏
  • 举报
回复
先有儿子,后有老子。本来就是违背常理的 你不按常理办事,还说是 php 的 bug,就有点过分了 如果 php 做多趟扫描而减低了速度,你有该说 php 太慢了
智商众筹 2014-06-11
  • 打赏
  • 举报
回复
php脚本先被编译成opcode,然后执行 3楼文章的作者好像是个php大牛...看过一些源码级分析,对他的头像有印象 他解释了类继承的编译机制和多重继承的BUG,能解决楼主的第一个疑问 2、如果把fatherClass里的内容直接代替include语句,运行正确; 这个说明include(require?xxxxxx_once?)是在执行期才运行的,编译时压根没鸟它 总结下,zend读取php脚本后,如果发现干净的无继承的类,就先建立出来(接近汇编的'类'结构而不是php的'类'),如果发现有继承类并且他的父类已存在,同样建立,其他代码继续编译。这时php脚本变成了opcode。执行时按顺序运行代码,比如include读取其他php脚本(opcode),复杂继承类的建立,执行汇编码的阶段不会智能识别类定义,只会严格按照php代码的顺序执行。 如果我的想法是对的倒是可以解释楼主的疑问
jiangbai333 2014-06-11
  • 打赏
  • 举报
回复
这里 http://www.laruence.com/2008/08/24/427.html
xuzuning 2014-06-11
  • 打赏
  • 举报
回复
请遵循 先声明,后使用 的基本原则 作为例外:当类定义和使用同在一个文件中时,定义和使用不分先后
码无边 2014-06-11
  • 打赏
  • 举报
回复
father类的名字将fatherclass改成father include 'father.php';
傲雪星枫 2014-06-11
  • 打赏
  • 举报
回复
理解為是php5的一個bug,如果要解釋,可以看3樓大神的地址。 寫程序時,按版主講的,先聲明,再使用原則。
智商众筹 2014-06-11
  • 打赏
  • 举报
回复
引用 5 楼 xuzuning 的回复:
先有儿子,后有老子。本来就是违背常理的 你不按常理办事,还说是 php 的 bug,就有点过分了 如果 php 做多趟扫描而减低了速度,你有该说 php 太慢了
与其说bug不如解释为“不够人性化” 为了适应各种设计模式,我觉得编译阶段智能一点很好啊~ 甚至以后的php版本可能做到html语法解释器那样的智能补全高容错 php提供了opcode缓存扩展,不光是多行扫描的词法解释,再耽误性能的编译机制也有办法解决~更消除了OOP的多文件带来的磁盘IO开销

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧