而不是隻寫一個名爲import()的新函數,我想知道是否有更好的解決方案。否則,require_once將僅包含在import()的範圍內,這對任何「全局」變量都是不利的。重新命名require_once函數的策略?
我的import()函數的工作方式與require_once不同,但是起到了相同的作用(增強了可用性)。
而不是隻寫一個名爲import()的新函數,我想知道是否有更好的解決方案。否則,require_once將僅包含在import()的範圍內,這對任何「全局」變量都是不利的。重新命名require_once函數的策略?
我的import()函數的工作方式與require_once不同,但是起到了相同的作用(增強了可用性)。
我的直覺意見:Nah。不要這樣做。
語言具有其原生的一組功能。爲什麼要引入沒有附加價值的專有功能。我不認爲有理由被require_once()
嚇跑。
我同意你的觀點,使用全局變量不是一件好事,但犧牲使用它們作爲虛榮函數名稱的可能性並不是一個好的方法。
如果路徑是什麼,你很擔心,那麼爲什麼不寫一個import()
函數返回正確路徑。像這樣:
require_once import("operations.php");
唯一的 - 在我眼裏沒有那麼可怕 - 缺點是,你只需要確保進口總是返回正確路徑東西,否則require_once
會崩潰。除此之外,它具有相同的舒適性,可以讓您根據自己的意願控制路徑,但在靈活性方面不會讓您花費任何代價。
這是一個很好的解決方案。謝謝。 – openfrog 2009-12-31 23:36:23
我不瞭解你和你的團隊,但我從來沒有遇到PHP開發人員被require/include「嚇跑」 - 這只是語言的工作方式。
如果你被這樣的事情嚇倒了,也許你應該使用另一種語言。
而你提出的建議聽起來像是一個維修噩夢。
你不應該把事情看得太嚴重;)我說每次都必須考慮路徑,所以我簡化了它。我相信,讓生活更輕鬆沒有錯。 – openfrog 2009-12-31 23:37:41
通過創建導入函數並將其附加到類,可以減少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源代碼。
通過使用__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'.");
}
}
?>
這是一個新的。我從來沒有聽說過一個庫函數的可用性問題,它簡單地通過名字嚇跑了開發人員。當你在它的時候,考慮去掉strip *(),chop(),explode(),implode(),die()以及其他僞暴力探測函數。它在哪裏結束? – 2009-12-31 22:19:39
讓事情變得簡單沒有錯。 – openfrog 2009-12-31 22:55:50