这是我在Q&A部分的一个问题的回答,也是我在segmentfault上发的第一篇文章。在求知的路上,与你分享。autoload(5.1新增)和namespace(5.3新增),可见这两者并不是PHP语言不可或缺的,而是针对特定问题引入的解决方案。0.先说符号表,这是基础。PHP解释器在执行的时候,内部会维护一张表,类似:|--------+----------+-----------------||符号|类型|内存地址||--------+----------+---------------||姓名1|类|0x00DFF1A8||姓名2|类|0x00DFF1B8||姓名1|函数|0x00DFF1C8||姓名1|这些是符号。PHP解释器在执行(加载)每一个.php文件时,遇到类定义、函数定义或变量定义时,都会在符号表中添加一行(这就是为什么PHP解释器可以找到重复定义的原因)。在接下来的执行中,当PHP解释器遇到“实例化一个类”的代码时,它会检查符号表中的Class类型下是否有这样一个类名。如果没有,它会报错“classisnotdefined”。1、有了上面的铺垫,按照添加PHP的顺序,我们先来说说autoload。上面“实例化一个类”的过程其实还有改进的余地。检查符号表没有找到类名后,可以插入一个步骤。这一步负责从文件系统中找到类定义所在的.php文件并立即加载,这一步称为autoload。autoload里面的匹配规则需要自己写。最常见的方式是使用与类名和类定义所在的.php文件名相同的名称:spl_autoload_register(function($class_name){include$class_name.'.php';});2.PHP中添加命名空间后,其符号表类似于:|------------+--------+------------+---------------||名称空间|符号|类型|内存地址||------------+--------+---------+---------------||\|姓名1|类|0x00DFF1A8||\|姓名2|类|0x00DFF1B8||\|函数|0x00DFF1C8||\|姓名1|变量|0x00DFF1D8||...|...|...|...|PHP解释器在检查符号表的时候加入了对命名空间的判断假设你给自己都把命名空间SF\yahu放在.php的第一行;PHP解释器执行你的代码后,它的符号表类似于:|------------+--------+---------+-----------------||名称空间|符号|类型|内存地址||------------+--------+----------+--------------||\|姓名1|类|0x00DFF1A8||\|姓名2|类|0x00DFF1B8||\|姓名1|函数|0x00DFF1C8||\|姓名1|变量|0x00DFF1D8||...|...|...|...||顺丰\雅虎|姓名1|类|0x00DFF2A8||类|0x00DFF2B8||顺丰\雅虎|姓名1|函数|0x00DFF2C8||顺丰\雅虎|姓名1|中的类时,必须这样写:$obj=newSF\yahu\Name1();看看上面充当分隔符的\,是不是很眼熟?是不是让你想起了文件路径中用作分隔符的/?那么你对autoload中的匹配规则有什么了解吗?想详细研究的话可以看Composer的实现3.useSome\NS;不是必须的,你可以尽量不用useSome\NS;首先,然后在打字累了之后再决定是否使用它:)。
