2011-01-19 2 views
0

내 웹 사이트를 개발할 때 includes라는 하나의 파일을 호출하여 PHP 파일에있는 모든 include를 호출했습니다.PHP에서 상대 경로를 사용하여 파일을 포함 하시겠습니까?

이 파일의 코드는 다음과 somethig에 보았다 (나는 린다 튜토리얼에서 적응) 이제

defined('DS') ? null : define('DS', DIRECTORY_SEPARATOR); 

defined('SITE_ROOT') ? null : 
    define('SITE_ROOT', 'C:'.DS.'wamp'.DS.'www'.DS.'ArmyCreator'); 

defined('LIB_PATH') ? null : define('LIB_PATH', SITE_ROOT.DS.'includes'); 
defined('PUB_PATH') ? null : define('PUB_PATH', SITE_ROOT.DS.'public'); 


// load config file first 
require_once(LIB_PATH.DS."helper".DS.'config.php'); 

내의 webiste를 배포하고 있기 때문에 내가 확인하기 위해 SITE_ROOt을 선언하는 방법을 알아낼 수 없습니다 제대로 작동합니까? 나는 웹 사이트에 배포하면 더 이상 작동하지 않도록 require_once("../../includes/helper/initialize.php"); :

편집

는이 같은 코드의 정상입니까?

답변

6

당신은 수행하여 includes.php의 디렉토리에있는 파일의 상대를 포함 할 수 있습니다 :

<? 
$basePath = dirname(__FILE__); 
require_once($basePath . "relative/path/from/basePath"); // replace the string with your real relative path 
+0

불행하게도 IDE가 경로에서 변수를 좋아하지 않아 :( – confiq

+0

또는'__DIR__'을, PHP 5.3.0 이후를 참조하십시오. –

+0

을 나는 아직 5.3을 사용하지 않는. @dorkitude을. 내가 사용이 있지만, 내가 require_once ("../../ include/helper/initialize.php")로 만든 모든 공식이 작동하지 않는다는 것을 깨달았 기 때문에 작동하는지 알 수 없다. – Pillblast

0

첫째을 : 나는 DS 드롭 것, 그것은 (EHE) BS이다. Windows는 C:/wamp/wwwC:\wamp\www을 모두 지원합니다 .-) 심지어 C:\wamp\www/project도 좋습니다. includes.php가에있는 경우

lib/includes.php (프로젝트 루트에 상대적인는) 다음 이렇게 말 : 동적 SITE_ROOT를 설정합니다

define('SITE_ROOT', realpath('../')); 

합니다. 여기

+0

DS는 BS가 아니지만 윈도우는 두 경로 구문을 모두 지원하지만 모호하고 'realpath()'의 결과와 일치하지 않습니다. '. 나는 맹목적으로 윈도우 시스템에서'/'를 사용하는 것은 매우 나쁜 습관이라고 생각한다. 그러나 그것은 단지 $ 0.02이다 ... – ircmaxell

1

두 제안 :. 당신은 SITE_ROOT이 파일에있는 디렉토리의 절대 경로하려는거야

  1. 예를 들어, 위의 코드에서,이 디렉토리는 C:\wamp\www\ArmyCreator입니다. 디렉토리를 알고 있다면 수동으로 정의하거나 사전 정의 된 __DIR__ 상수 (PHP 5.3+) 또는 아직 5.3에없는 경우 dirname(__FILE__)을 사용하여 동적으로 정의 할 수 있습니다.

  2. 일반적으로 악성 사례로 간주되는 파일 묶음을 한꺼번에 포함하고 대신 자동 로딩을 사용해야합니다. 이렇게하면 더 나은 성능뿐만 아니라 잘 정의 된 디렉토리 레이아웃 및 이름 지정 체계가 제공되어 더 나은 코드가 생성됩니다. 이렇게하려면 spl_autoload_register() 함수를 사용할 수 있습니다.

1

먼저, 삼중 구문을 남용하지 마십시오. 이것은 당신의 위치를 ​​알고있는 부트 스트랩 파일의 내부에있는 경우

defined('DS') OR define('DS', DIRECTORY_SEPARATOR); 

둘째, 단순히 dirname(__FILE__)를 사용하는 대신 defined('DS') ? null : define('DS', DIRECTORY_SEPARATOR);, 당신은 (부울 진정한 결과에 단락이됩니다)를 OR 연산자를 사용할 수 있습니다 : 루트의 상대 위치를 알고있는 경우

defined('SITE_ROOT') OR define('SITE_ROOT', dirname(__FILE__)); 

그렇지 않으면, 당신은 여러 dirname 전화를 사용할 수 있습니다. 그것을 본 하나의 상위 디렉토리 인 경우 그래서 :

defined('SITE_ROOT') OR define('SITE_ROOT', dirname(dirname(__FILE__))); 

$_SERVER['DOCUMENT_ROOT'] 또는 cwd()를 사용하거나 경로를 하드 코딩하지 마십시오.항상 dirname(__FILE__)을 사용하여 절대 경로를 결정하십시오. 이유에 대한 추가 정보를 원하시면, This Answer

+0

'or'보다 더 깨끗이해라. {define ('...')} ' – mfonda

+0

사실, @mfonda는 사실이지만, 자세한 정보와 클러 터 사이에 한 줄이 있습니다. 인라인 if 문을 허용하는 단일 코딩 표준을 알지 못하기 때문에 각 if와 if 사이에 2 행과 3 행을 사용하는 if 문을 여러 개 갖는 것은 가치가있을 수있는 것보다 더 복잡합니다.하지만 각각 그들 자신 ... – ircmaxell

관련 문제