include_once或require_once解决了哪些问题?

From the php manual

Include_once may help avoid problems such as function redefinitions, variable value reassignments, etc.

Ok, so include_once solves issues with function redefinitions, variable value reassignments, etc. but why are they an issue in the first place ?

I'm trying to understand what kind of risks are involved in redefining functions or reassigning variable values except for a decline in performance due to additional input/output and processing ?

Is it because php parser gets confused which version of function to load/use or is the original version of the function lost once redefined? What else and what about variable reassignments?

I do understand where to use include vs include_once.

Imagine the following include file, hello.php:

function hello()
{
    return 'Hello World';
}

$a = 0;

Now imagine the following file, index.php:

include 'hello.php';

$a = 1;
hello();

include 'hello.php';

hello();
echo $a; // $a = 0, not 1

Your code would now have a fatal error, since the function has been defined twice. Using include_once would avert this, since it would only include hello.php once. Also, to do with variable value reassignment, $a (should the code compile) would be reset to 0.


From the comments, please consider this a side answer - If you're looking for something where resetting a set of variables many times was required, I'd look to use a class for this with a method like Reset, you can even make it static if you didn't want to have to instantiate it, like so:

public class MyVariables
{
    public static $MyVariable = "Hello";
    public static $AnotherVariable = 5;

    public static function Reset()
    {
        self::$MyVariable = "Hello";
        self::$AnotherVariable = 5;
    }
}

Usage like:

MyVariables::$MyVariable = "Goodbye";
MyVariables::Reset();
echo MyVariables::$MyVariable; // Hello

It will stop you loading pages more than once. Typically you'll use this at the top of your pages to bring in your init, function, class files etc.

Especially useful if you are loading pages within pages dynamically.

Let's say you have an include script vars.inc.php:

<?php

    $firstname = 'Mike';
    $lastname = 'Smith';

?>

And then you have a script script.php:

<?php

    echo "$firstname $lastname"; // no output

    include('vars.inc.php');
    echo "$firstname $lastname"; // Mike Smith

    $firstname = "Tim";
    $lastname = "Young"; 
    echo "$firstname $lastname"; // Tim Young

    include('vars.inc.php');
    echo "$firstname $lastname"; // Mike Smith
?>

What happens is that if you modify your vars in code exection and then you include once again the file defining them, you are changing their content. include_once will ensure that this will never happens throwing an error.