PHP学习笔记——Php文件引入
在工作日常开发中,我最常用的文件引用莫过于include(include_once),以及require(require_once),这两种引用已经满足了日常简单CGI的开发需要,但是当深入了解PHP框架的内容,就会发现单单这两个关键字远远不够,本文整理了部分php文件引用所涉及的知识。
首先简要的介绍一下include和require的用法
1.include
被包含文件先按参数给出的路径寻找,如果没有给出目录(只有文件名)时则按照 include_path(定义于php配置文件)指定的目录寻找。如果在 include_path 下没找到该文件则 include 最后才在调用脚本文件所在的目录和当前工作目录下寻找。
2.require语句
require 和 include 几乎完全一样,除了处理失败的方式不同之外。require 在出错时产生 E_COMPILE_ERROR 级别的错误。换句话说将导致脚本中止,而 include 只产生警告(E_WARNING),脚本会继续运行。
3.autoload机制
__autoloader函数是默认用于载入未知PHP类的函数,当再php代码中出现了未知类时,程序将会自动调用该函数,函数原型及一种简单的实现如下
function __autoload($classname) { $filename = "./". $classname .".php"; include_once($filename); }
通常在各个类型不同的类中可以实现自己的__autoload()函数,如果希望注册自己的__autoLoade函数则可以使用spl中的spl_autoload_register(),该函数可以将自定义的函数放入autoloader队列当中,当autoloader被触发是,将会依次调用队列中的函数。
spl_autoload_register()原型如下
bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] )
spl_autoload_register可以被调用多次,将多个自定义的回调函数插入到autoload函数队列当中。
__autoloader()函数在ZEND引擎中有一个默认的实现,就是spl_autoload(),当不愿意自己实现__autoloader()函数的时候,可以使用这个php自带的载入函数,通常该函数会和spl_autoload_extensions()函数一起使用,spl_autoloader_extensions()可以指定所包含类所在文件的扩展名,spl_autoload()函数会依据类名+扩展名的形式,在include_path当中寻找对应类所在的文件。之后在代码中调用不含参数的spl_autoload_register()就可以在该程序中调用默认的spl_autoload()函数。
A. class.php
<?php class A{ function write(){ echo “I am A”; } } ?>
B.php
<?php spl_autoload_extensions(“.class.php”); spl_autoload_register(); $a=new A(); $a->write(); // I am A ?>
spl_autoload_call()函数的目的是为了让我们可以手动去调用spl_autoload_register()注册队列中的回调函数,常规情况下,只有遇到未知类才会调用autoloader队列中的回调函数,spl_autoload_call可以实现手动调用,依次调用队列中的回调函数直到成功加载到未知类。
A. php
<?php class A{} ?>
B. php
<?php function A($class){ echo "A";}; function B($class) {echo "B";include($class.".php");}; spl_autoload_register(A); spl_autoload_register(B); spl_autoload_call("A"); //输出 AB ?>
4.use 关键字
use语句可以引用其他名空间中的类。Php名空间的作用跟其他语言的名空间作用一样,用于解决第三方的类中变量及函数的冲突问题。
A.php
<?php namespace TEST; class A{ function myfunc(){ echo "this A::myfunc \n"; } }
B.php
<?php use TEST\A; require_once("A.php"); class B{ function myfunc(){ print "this B::myfunc \n"; } } $b=new B(); $b->myfunc(); $a=new A; $a->myfunc();
输出:
this B::myfunc
this A::myfunc
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。