我正在寻找一种允许我的PHP应用程序完全可移植的方法。我的问题是,虽然我正在利用相对路径来包含PHP类,但当我尝试在新环境中部署应用程序时,我总是遇到问题。
例如,我在Ubuntu下实现了一个应用程序,它运行得很好。但是,当我将它移动到运行Centos的共享主机时,我不得不修改所有包含语句。
所以,我想问一下包含类的最佳方法,考虑让多个文件夹包含各种类,这些类依赖于文件夹层次结构的不同级别中的另一个多个类。
答案 0 :(得分:1)
只保留一个“主”文件夹。
在你的index.php(例如)中配置“main”文件夹位置,并将其用作包含的“基础”(我想你是硬编码include / require路径?)
否则在自动加载功能中使用“base”。
现在你可以移动'main'文件夹了,你需要做的就是只更新index.php中的一行代码
它仍然是手动更新。诚然。你也可以。使用类似glob()的东西并搜索“mainlib.php”文件(例如)和“缓存”文件夹位置以便在下次调用中使用它?
<小时/> 例如,我就是这样做的:
<?php
/**
* cfg.php
*
* Main config file
*
* @package Public
*/
// Compatibility
$version = '5.2.3';//restricted by htmlentities()' 4th parameter
if(version_compare(PHP_VERSION, $version, '<')) {
die('Required PHP version is ' . $version . ', current is ' . PHP_VERSION);
}
// Environment
define('DEVELOPMENT', in_array($_SERVER['REMOTE_ADDR'], array('127.0.0.1', '::1')));
define('PRIVATE_DIR', DEVELOPMENT ? 'private' . DIRECTORY_SEPARATOR : '..'.DIRECTORY_SEPARATOR.'private_html'.DIRECTORY_SEPARATOR.'tickets');
define('APPLICATION_LINK','application_red'.DIRECTORY_SEPARATOR);
define('LIBRARY_LINK','library'.DIRECTORY_SEPARATOR);
define("MEM_START",memory_get_usage(true));
// Behavior
if(DEVELOPMENT) {
ini_set('display_errors', 'On');
error_reporting(E_ALL | E_STRICT);//report all errors
}
else {
ini_set('display_errors', 'Off');
error_reporting(0);
}
// Timezone
date_default_timezone_set('Europe/Amsterdam');
// Constants
define('ROOT', dirname(__FILE__) . DIRECTORY_SEPARATOR);
define('APP', ROOT . '..'.DIRECTORY_SEPARATOR.PRIVATE_DIR.''.APPLICATION_LINK);
define('LIB', ROOT . '..'.DIRECTORY_SEPARATOR.PRIVATE_DIR.''.LIBRARY_LINK);
define('CACHE', APP.'cache'.DIRECTORY_SEPARATOR);
的index.php / utest.php:
<?php
include("cfg.php");
// Start library
require_once LIB.'Library.php';
$library = new Library();
//etc.......
答案 1 :(得分:0)
您根本不需要引用硬连线文件夹。在我目前的项目中,我这样做:
public static function getProjectRoot()
{
return realpath(
dirname( __FILE__ ) . DIRECTORY_SEPARATOR . '..' .
DIRECTORY_SEPARATOR . '..'
);
}
此功能的类是项目中的两个文件夹级别 - 因此两个..运算符遍历目录结构。由于该位置永远不会相对于项目根目录发生变化,因此不需要更改,我也不需要硬连线任何路径。
编辑:关于include / require语句,使用自动加载器,(除了几个引导程序文件),通常不需要使用includes / requires。