0

如何防止同一个文件被包含两次?这是我的源代码:

<?php

error_reporting(-1);
ini_set('display_errors', 'On');
ini_set('html_errors', 0);

if (!file_exists('ccc.php'))
    link('bbb.php', 'ccc.php');
if (!file_exists('ddd.php'))
    link('bbb.php', 'ddd.php');
require_once realpath('ccc.php');
require_once realpath('ddd.php');

$bbb = new Bbb();
echo $bbb->bb();

我收到:

Fatal error: Cannot declare class Bbb, because the name is already in use in /path/to/ddd.php on line 2

它不起作用,realpath因为它只返回链接的路径,而不是目标。我已经尝试过,readlink但不幸的是,这只适用于符号链接。

4

1 回答 1

0

我有一个可行的解决方案。这并不理想,但可以快速修复它,直到我能够确保相同的文件永远不会包含两次:

<?php

error_reporting(-1);
ini_set('display_errors', 'On');
ini_set('html_errors', 0);

if (!file_exists('ccc.php'))
    link('bbb.php', 'ccc.php');
if (!file_exists('ddd.php'))
    link('bbb.php', 'ddd.php');

function includeFile($fileName)
{
    foreach (get_included_files() as $file)
    {
        if (fileinode($file) === fileinode($fileName))
            return null;
    }
    require_once $fileName;
}
includeFile('ccc.php');
includeFile('ddd.php');

$bbb = new Bbb();
echo $bbb->bb();

感谢BugFinder建议我使用fileinode.

于 2019-12-13T02:53:11.193 回答