Practical PHP Programming

包含其他文件

在PHP中,其中一个最基本的操作就是在一个文件中包含另一个文件,这样就可以共享函数功能。这个通过给include传递要包含的文件名来实现。

假设下面是foo.php中的代码:

 <?php
    print 'Starting foo\n';
    include 'bar.php';
    print 'Finishing foo\n';
?>

这是bar.php中的代码:

 <?php
    print 'In bar\n';
?>

PHP将会载入bar.php并读入其中的内容,并用其替换掉foo.phpinclude 'bar.php'一行。之后,foo.php实际是:

 <?php
    print 'Starting foo\n';
    print 'In bar\n';
    print 'Finishing foo\n';
?>

如果你对为什么只把include 'bar.php'一句话引入,而没有引入开闭合标记,那是因为当PHP包含文件的时候,先跳出PHP模式,然后立即进入PHP没事。因此,同bar.php合并了的foo.php实际应该是:

 <?php
    print 'Starting foo\n';
?>
<?php
    print 'In bar\n';
?>
<?php
    print 'Finishing foo\n';
?>

虽然作用一样,但是有点难以阅读。

有一点需要注意,PHP只在包含文件确实执行到的情况下才包含文件,因此,像下面的代码,bar.php实际是没有被包含进来的:

 <?php
    if (53 > 99) {
        include 'bar.php';
    }
?>

如果你试图包含一个不存在的文件,PHP将会产生一条警告消息。如果你写的代码中确实需要包含某个文件,可以用PHP的require关键字,在你要包含的文件不存在时,代码会停止并抛出fatal error。然而,你告诉PHP需要包含某个文件,而该文件恰好找不到的几率实在太低,所以还是尽量用require吧。

使用包含文件最常用的方式是引入公共函数、对象定义等。例如,如果你的站点有相同的头部的话,你可以在你的每个页面开头添加:

 <?php
    include 'header.php';
    ...[snip]...

这样,当你想更改网站头部的时候,你只要更改一个文件就可以了。还有两个类似的关键字:include_oncerequire_once。它们的功能和includerequire很类似,只是它们能保证只包含一次,即便你写了多次。include_oncerequire_once共用包含文件列表,但是由于有些操作系统(如Unix)是大小写敏感的,如果你的文件名大小写不同的话,就有可能造成重复包含,如:

 <?php
    include_once 'bar.php';
    include_once 'BAR.php';
    include_once 'Bar.php';
?>

Unix中,PHP会尝试将其作为不同的文件进行包含。解决方案很简单:用小写英文给文件命名就好了。

注意一点,PHP如果在本地路径中找不到你试图includerequire的文件,它将去查找默认包含路径。默认包含路径在php.ini中定义,直接作为包含路径。

作者说明:每次你用include()require()包含一个文件时,PHP都对其重新编译。如果你使用了代码缓存,PHP就不必对同样的文件进行多次编译了。如果多次包含同样的文件,最好使用include_once()。除此之外,你可以用get_included_files()get_required_files()来查看你已经包含了哪些文件。这两个函数的内部功能是一样的,选择一个就可以。