[转]小心PHP的类定义顺序与继承的问题
2014-10-28 12:52
232 查看
FROM : http://www.pakey.net/blog/php-class-shunxu.html
以下代码的运行环境均为PHP5.3.11
先来看一段代码
复制代码
代码很简单,也可以正常运行。看起来PHP的类定义与顺序无关。
再来看下面一段代码
复制代码
猜猜结果会怎样?有点出乎意料,代码报Fatal Error。
这就奇怪了,上一段代码也是在后面声明的类B,正常。多了一层继承关系后,就报错了,错误信息是"Fatal Error: class ‘B’ not found "。 这又不能理解了,为什么会说找不到类B呢。
再来尝试一下新的组合
复制代码
好了,又正常了。
再来尝试一下namespace
复制代码
结果跟不是用ns是一样的。
这种时候,只能看看官方是怎么说的了 http://php.net/manual/en/keyword.extends.php
说得很明确,类必须先定义后使用,哪怕是在一个文件里。但这又无法解释第一段代码为什么可以正常运行。所以基本可以认为这是一个php的bug。
好在有autoload机制,这种情况完全可以避免。不过对那些想通过把许多类文件合并成一个来提高PHP运行效率的童鞋们来说,这就有点麻烦咯。
以下代码的运行环境均为PHP5.3.11
先来看一段代码
<?php class A extends B {} class B {}
复制代码
代码很简单,也可以正常运行。看起来PHP的类定义与顺序无关。
再来看下面一段代码
<?php class A extends B {} class B extends C {} class C {}
复制代码
猜猜结果会怎样?有点出乎意料,代码报Fatal Error。
这就奇怪了,上一段代码也是在后面声明的类B,正常。多了一层继承关系后,就报错了,错误信息是"Fatal Error: class ‘B’ not found "。 这又不能理解了,为什么会说找不到类B呢。
再来尝试一下新的组合
<?php class A extends B {} class C {} class B extends C {}
复制代码
好了,又正常了。
再来尝试一下namespace
<?php namespace A { class A extends \B\B {} } namespace B { class B extends \C\C{} } namespace C { class C {} }
复制代码
结果跟不是用ns是一样的。
这种时候,只能看看官方是怎么说的了 http://php.net/manual/en/keyword.extends.php
Classes must be defined before they are used! If you want the class Named_Cart to extend the class Cart, you will have to define the class Cart first. If you want to create another class called Yellow_named_cart based on the class Named_Cart you have to define Named_Cart first. To make it short: the order in which the classes are defined is important.
说得很明确,类必须先定义后使用,哪怕是在一个文件里。但这又无法解释第一段代码为什么可以正常运行。所以基本可以认为这是一个php的bug。
好在有autoload机制,这种情况完全可以避免。不过对那些想通过把许多类文件合并成一个来提高PHP运行效率的童鞋们来说,这就有点麻烦咯。
相关文章推荐
- 类的初始化问题(初始化顺序与定义的位置前后有关)
- c++类定义体中定义继承树中类的对象问题
- PHP时间与系统时间不符合的问题以及PHP预定义超全局数组
- CSS中定义a:link、a:visited、a:hover、a:active顺序问题探讨【经验】
- cocos2d-x中继承CCMenu定义自己的MyMenu,这个是解决优先级的问题
- 继承时候类的执行顺序问题
- php 中 define 定义常量和单双引号问题
- C++继承时子类定义同名成员变量时的调用继承函数的问题
- 关于继承类执行构造函数的顺序问题
- 继承 类的重复定义问题
- 解决PHP中函数重复定义的问题
- 关于C++虚函数默认参数的问题。Effective C++ 条款38: 决不要重新定义继承而来的缺省参数值
- PHP继承当中一种诡异的语法特性——延迟定义
- PHP时间与系统时间不符合的问题以及PHP预定义超全局数组
- PHP fgetcsv 定义和用法(附windows与linux下兼容问题)
- Dojo 定义widget时继承父类的顺序。
- 继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么?
- 类在继承关系上的初始化的顺序问题
- thrift生成php代码不完整问题(thrift接口定义文件中含include)
- Qt问题记录: 关于继承顺序不同导致编译不过