2009-12-31 76 views
0

而不是隻寫一個名爲import()的新函數,我想知道是否有更好的解決方案。否則,require_once將僅包含在import()的範圍內,這對任何「全局」變量都是不利的。重新命名require_once函數的策略?

我的import()函數的工作方式與require_once不同,但是起到了相同的作用(增強了可用性)。

+1

這是一個新的。我從來沒有聽說過一個庫函數的可用性問題,它簡單地通過名字嚇跑了開發人員。當你在它的時候,考慮去掉strip *(),chop(),explode(),implode(),die()以及其他僞暴力探測函數。它在哪裏結束? – 2009-12-31 22:19:39

+0

讓事情變得簡單沒有錯。 – openfrog 2009-12-31 22:55:50

回答

6

我的直覺意見:Nah。不要這樣做。

  • 語言具有其原生的一組功能。爲什麼要引入沒有附加價值的專有功能。我不認爲有理由被require_once()嚇跑。

  • 我同意你的觀點,使用全局變量不是一件好事,但犧牲使用它們作爲虛榮函數名稱的可能性並不是一個好的方法。

如果路徑是什麼,你很擔心,那麼爲什麼不寫一個import()函數返回正確路徑。像這樣:

require_once import("operations.php"); 

唯一的 - 在我眼裏沒有那麼可怕 - 缺點是,你只需要確保進口總是返回正確路徑東西,否則require_once會崩潰。除此之外,它具有相同的舒適性,可以讓您根據自己的意願控制路徑,但在靈活性方面不會讓您花費任何代價。

+0

這是一個很好的解決方案。謝謝。 – openfrog 2009-12-31 23:36:23

2

我不瞭解你和你的團隊,但我從來沒有遇到PHP開發人員被require/include「嚇跑」 - 這只是語言的工作方式。

如果你被這樣的事情嚇倒了,也許你應該使用另一種語言。

而你提出的建議聽起來像是一個維修噩夢。

+0

你不應該把事情看得太嚴重;)我說每次都必須考慮路徑,所以我簡化了它。我相信,讓生活更輕鬆沒有錯。 – openfrog 2009-12-31 23:37:41

-1

通過創建導入函數並將其附加到類,可以減少require調用的數量。因此,在需要框架一次後,用戶就可以使用導入功能來包含其他框架類。即:

的index.php:

require_once 'MyFramework.php'; 
MyFramework::import('Path/To/File.php'); 

MyFramework.php

class MyFramework { 
static function import($path) { 
    // code to include/import the path 
} 
} 

另一種選擇是使用PHP的一個auto_load語義自動require框架類:

http://php.net/manual/en/language.oop5.autoload.php

雖然在在一天結束之前,您無法真正替換require/include語句,而無法編輯PHP源代碼。

0

通過使用__autoload(),您可能會得到與您之後的內容相似的內容。然後你可以使用你想要的任何類,而不需要require,只要它的文件在你的include_path中,它將被加載而沒有麻煩。

(當然,這假設你想包含的文件中有一個類,這個類和它的文件被命名爲根據一些約定。也許這就是其實並非如此。)

這是一個非常標準的自動加載,與Zend-和梨風格的命名約定的工作原理:

<?php 
/** 
* Load (include the file of) a given PHP class. 
* 
* @param string $class The name of the class to load. 
* 
* @return void 
*/ 

function __autoload($class) 
{ 
    $files = array(
     $class . '.php', 
     str_replace('_', '/', $class) . '.php', 
    ); 
    foreach (explode(PATH_SEPARATOR, ini_get('include_path')) as $base_path) { 
     foreach ($files as $file) { 
      $path = "$base_path/$file"; 
      if (file_exists($path) && is_readable($path)) { 
       include_once $path; 
       $finalPath = $path; 
      } 
     } 
    } 
    if (isset($finalPath)) { 
     return; 
    } else { 
     die("Unable to load class '$class'."); 
    } 
} 
?>