2013-01-19 61 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