2011-12-03 74 views
1

我有一個PHP腳本,可以註冊大約20個函數。理想情況下,它會被加載require_once。我想這樣做,即使它不止一次加載,也不會嘗試重新註冊函數。我可以在!function_exists中包裝每個聲明,但我想知道是否有更快的方法。 (或者你認爲對!function_exists的20個呼叫可以忽略不計?)我嘗試使用exit,但這會導致錯誤。是否有可能退出不拋出錯誤?退出PHP腳本無錯誤

if (/* already loaded */) { 
    /* leave gracefully */ 
} 

/* declare ~20 functions */ 

回答

4
if (!defined('ALREADY_LOADED')) { 
    define('ALREADY_LOADED', true); 
    // rest of your code goes here 

} 

這種檢查是否恆定ALREADY_LOADED定義,如果它不是,它定義的常量和會做任何你想要的東西。

運行一次後,常量將被定義,並且不會再次運行。

我建議使用比ALREADY_LOADED更具描述性的常數名稱。

+0

很酷,我想過使用'全球',但我認爲常數更容易。 – ryanve

+0

只記得不要在不同的文件中使用相同的常量名稱。 ;) –

+0

這通常被認爲是其他語言的包含保護器;) –

1

如果你作爲一個作家不要求它更然後一次(或使用require_once() consistantly)不應該有一個關於重新註冊功能的問題。

至於退出沒有錯誤,請嘗試die()

+0

'die()'是'exit()'的別名並導致致命錯誤 – ryanve

1

我會盡量不要在第一步重新聲明函數(這裏需要多次)。 做20x function_exists()不花費任何東西,只有一些時間寫和包裝;) 也許你可以嘗試使用類/方法。

+0

我最初的想法是使用一個類,但我遇到了麻煩讓它工作。我嘗試將它包裝在'class RAVE {/ * declarations * /}'中,然後我把'$ rave = new RAVE();'沒有運氣。 – ryanve

1

function_exists沒什麼不好。

你可以用下面的方式編寫你的php腳本文件。

/* file1.php */ 
if(!defined('FILE1')) { 
define('FILE1', 1); 
///////////////////////// 
// PUT file contents here. 

///////////////////////// 
}// file.php finished. 

現在你可以包含這個文件很多時間,你想在這裏和那裏。什麼都不會再被重新定義。

2

我認爲使用OOP是最實用的方式 可以作爲靜態函數的類

class SimleClass{ 
    public static function func1($arg){...} 
} 

使用它 SimpeClass :: FUNC1($ ARG);

或sigleton

class SimleClass{ 
    protected static $_instance=null; 
    private function __construct(){...} 
    public static function getInstance(){ 
     if(is_null(self::$_instance) 
      self::$_instance=new SimpleClass(); 
     return self::$_instance; 
    } 
    public function func1($arg){...} 
} 

使用它 SimpleClass ::的getInstance() - > FUNC1($ ARG);

以及如何連接它認爲自己 可以應該使用include_once

,並可以實現自動裝卸類

function myClassLoader($className){ 
include_once "/lib/$className.php"; 
} 
spl_autoload_register(myClassLoader); 

================== =========================================== 更具體的答案需要更多數據。 也許你的應用程序,你可以重新排列,以獲得更多的邏輯結構

+0

Thx-I喜歡這個想法。我試圖做到這一點,因此這些函數暴露在全局範圍內,這意味着它們可以用'func1($ arg)'而不是'SimpeClass :: func1($ arg)'調用'什麼是最好的方法? – ryanve

+0

很難理解與上下文脫節的問題的相關性。 說明一下,爲什麼它不是基於類的方便解決方案? 也許找到另一種方式? – nonlux