首页 > php教程 > php手册 > [转]小心PHP的类定义顺序与继承的问题

[转]小心PHP的类定义顺序与继承的问题

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
发布: 2016-06-06 19:40:08
原创
1305 人浏览过

FROM :http://www.pakey.net/blog/php-class-shunxu.html 以下代码的运行环境均为PHP5.3.11 先来看一段代码 ?phpclassAextendsB{}classB{} 复制代码 代码很简单,也可以正常运行。看起来PHP的类 定义 与 顺序 无关。 再来看下面一段代码 ?phpclassAextendsB{

FROM : http://www.pakey.net/blog/php-class-shunxu.html

以下代码的运行环境均为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运行效率的童鞋们来说,这就有点麻烦咯。

相关标签:
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
git - 不小心删掉了本地的sshkey怎么办
来自于 1970-01-01 08:00:00
0
0
0
声音太小了。
来自于 1970-01-01 08:00:00
0
0
0
用php如何生成小程序的小程序码?
来自于 1970-01-01 08:00:00
0
0
0
热门推荐
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板