文件加载—理解一个project的第一步
当我最开始写php的时候,总是担心这个问题:我在这儿new的一个class能加载到对应的类文件吗?毕竟一运行就报Fatal Error,什么**文件没找到,类无法实例化等等是一种很“低级”的错误,怕别人看了笑话。于是每接一个新任务,我总想把它的加载过程弄清楚(以前只知道几个html标签和样式,不知算不算web开发),有时头儿看了说还有闲心看这个,赶紧写逻辑,照这样做就行了……你妹你知道当然有把握了D:,后来发现原来流程都差不多。
在一个IDE中开发时,如C++/Java,一般是新建一个工程,通过IDE新添加一个文件到指定目录下,然后#include/Import进来即可,php则使这一步骤更加过程化,文件的加载过程基本确定了这个project(框架或者自搭的项目)的目录结构和文件的分门别类。
不管框架还是自搭的项目总得有个入口文件,这时要事先加载一些基本信息,如配置文件、通用方法等,使用的基本是手动直接加载单个文件形式,使用下面四个方法之一:
include、require、include_once、require_once
<span style="color: #0000ff">include</span>('config.php'<span style="color: #000000">); </span><span style="color: #0000ff">require</span>('database.php');
涉及到类文件的加载,少部分是直接加载,比如,通用方法作为静态方法写在一个类Utilities中,因为是后边很多要用到的方法(如错误输出、curl请求、随机字符串生成…),所以用类封装起来,一般也是在加载配置文件时连带加载进来
include*本文来@源gao@daima#com搞(%代@#码@网2
搞代gaodaima码
(‘Utilities.php’);
而更通用的情况是:类的动态加载。首先不谈的加载的方式,来看看大概什么时候会用到一个类和实例:
1. 最明显的,$obj = new A; 它的变种$className = ‘A’; $obj = $className; 都一样;
2. 类的静态方法、静态变量和常量的调用,即Utilities::httpRequest()、Utilities::$instance、Utilities::HOST;
3. 在php函数中,使用了回调函数的情况,最典型的call_user_func_array()(call_user_func),还有其他用到了callback的地方,如数组中的array_walk、array_map,它们需要一个回调函数作为参数。
回调函数非常灵活,不止可以是简单函数,还可以是对象的方法,包括静态类方法。因为可以用对象方法或静态方法,所以这钟时候也要去加载对应的类文件。自php5.3起,回调函数还可以像js中,用匿名函数来实现。
<span style="color: #0000ff">class</span><span style="color: #000000"> A{ </span><span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">function</span> cube(<span style="color: #800080">$var</span><span style="color: #000000">){ </span><span style="color: #0000ff">return</span> <span style="color: #008080">pow</span>(<span style="color: #800080">$var</span>, 3<span style="color: #000000">); } </span><span style="color: #0000ff">public</span> <span style="color: #0000ff">function</span> twice(<span style="color: #800080">$var</span><span style="color: #000000">){ </span><span style="color: #0000ff">return</span> 2*<span style="color: #800080">$var</span><span style="color: #000000">; } } </span><span style="color: #008000">//</span><span style="color: #008000"> 使用类的静态方法</span> <span style="color: #800080">$num</span> = <span style="color: #008080">call_user_func</span>('A::cube', 5<span style="color: #000000">); </span><span style="color: #008000">//</span><span style="color: #008000"> 使用对象</span> <span style="color: #800080">$obj</span> = <span style="color: #0000ff">new</span><span style="color: #000000"> A; </span><span style="color: #800080">$num</span> = <span style="color: #008080">call_user_func_array</span>(<span style="color: #0000ff">array</span>(<span style="color: #800080">$obj</span>, 'twice'), <span style="color: #0000ff">array</span>(7));