2013-01-19 62 views
2

从PHP手册include_once或require_once解决了什么问题?

Include_once可有助于避免问题,如功能重定义,变量重新赋值等

好了,所以include_once解决了与功能重定义,变量重新赋值等问题但为什么他们首先是一个问题?

我想了解重新定义函数或重新分配变量值时涉及哪些风险,除了由于额外的输入/输出和处理而导致的性能下降?

难道是因为php解析器弄不清哪个版本的函数要加载/使用还是原来的函数版本重新定义后丢失了?还有什么和变量重新分配?

我明白在哪里使用include vs include_once

+3

你不能定义一个函数两次,你会得到一个致命的错误。 –

+0

@Pekka웃 - 我明白,但是这会导致PHP会混淆如果允许重新定义的加载哪个版本的函数? – user481913

+0

@ user481913它不会混淆,它被称为歧义,并且我不知道函数重定义在任何语言中都是不允许的。 –

回答

4

想象一下下面的包含文件,hello.php

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

$a = 0; 

现在想象一下下面的文件,index.php

include 'hello.php'; 

$a = 1; 
hello(); 

include 'hello.php'; 

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

现在您的代码将有一个致命的错误,因为该功能已被定义了两次。使用include_once可以避免这种情况,因为它只包含hello.php一次。此外,与variable value reassignment做,$a(应的代码编译)将被重置为0


从意见,请认为这是一个侧回答 - 如果你正在寻找的东西,其中一个复位变量集多次必需的,我想用Reset这样的方法来使用这个类,如果你不想实例化它,你甚至可以使它成为静态的,如下所示:

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

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

用法like:

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

是的非常类似于下面提到的@Zarathos ...所以如果$ a被重置为0会出现什么问题或风险?我认为的一个原因可能是调试这些代码的困难......如果值改变了,就像上面提供的例子那样,那么风险到底有多大? – user481913

+0

本身没有*风险*,由于显而易见的原因,它只是非常不推荐。间接风险可能是多个开发人员,期望包含一个包含类的文件,并最终在过程中重置一吨变量(假设该文件还定义了“$ myvar”,开发人员使用了“$ myvar”完全分开)。在这样的全球范围内定义事物显然是不被推荐的,因此我们有OOP :) –

+0

我的头脑现在已经混乱了......我需要休息一会儿,并在一段时间后重新思考它,让它沉入水中in ... Sub-conciously我想我同意/理解你提供的一些推理,但我只是需要它沉浸在说服我,我完全理解这背后的推理......非常感谢和+1提供上下文... – user481913

0

它会停止您加载页面多次。通常情况下,您将在页面顶部使用此功能来引入您的init,函数,类文件等。

如果您要动态地在页面内加载页面,这特别有用。

1

假设你有一个包括脚本vars.inc.php:

<?php 

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

?> 

然后你有一个脚本的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 
?> 

什么情况是,如果您修改瓦尔在代码执行中,然后再次包含定义它们的文件,您正在更改其内容。 include_once将确保这不会发生抛出错误。

+0

确切的情况下,我想过...但是如果我有兴趣做这样的事情,或者如果我暂时需要有/使用一些其他的价值有什么不对对于原始价值以外的变量? – user481913

+0

我极力阻止你滥用包含。这可能非常危险,并导致意想不到的结果,这些结果很难调试。无论如何...你能更具体吗? –

+0

好吧,除了为什么我应该注意不要重新定义函数/重新赋值等等,我都会搞砸了我的脑袋,想要拿出一个具体案例...我会回来,如果我能拿出一个具体案例... ... – user481913