2011-11-17 2 views
12

내가 PHP (종종)로 작업 할 때마다 나는 보통 Windows 상자에서 작업하지만, 나는 (시도해보십시오) 플랫폼에 독립적 인 응용 프로그램을 개발합니다. 한 가지 중요한 점은 디렉토리 분리 기호를 사용한다는 점입니다.PHP 디렉토리 구분자, 슬래시 강제; non-intrusive

PHP의 Windows 환경에서 파일 시스템 작업을 수행하는 많은 사람들이 알고 있듯이 PHP는 거꾸로 대신 슬래시를 사용할 수 있습니다. PHP는 후드 아래에서이를 정렬합니다. 문자열 리터럴을 사용하여 경로를 fopen() 또는 그 이상으로 전달할 때이 모든 것이 좋습니다. 경로를 검색 할 때 __FILE__이거나 realpath()으로 확장하면 검색된 경로는 물론 OS 적절한 슬래시를 사용합니다. 또한, 나는 후행 슬래시에 몇 가지 불일치를 발견했습니다. 한 번 또는 두 번 __DIR__ 한 (백 슬래시) 너무 realpath()을 추가했기 때문에 대신하고의 (나는 후행 슬래시를 선호하지만 간헐적으로)

이 명확하게 문자열 비교에 대한 문제 :

신뢰성을 위해서

compare_somehow('path/to/file.php', __DIR__); 
, 내가 갈 필요 해요 :이 작업을 많이처럼 보인다

compare_somehow('path/to/file.php', rtrim(strtr(__DIR__, '\\', '/'), '/') . '/'); 

. 함수에 넣을 수 있습니다. 이제 모든 OO 코드에서 임의의 함수 종속성에 빠지게되었습니다.

필자는 PHP가 완벽하지 않고 수용을해야한다는 것을 알고 있지만, 파일 시스템 히트가 강제로 슬래시 된 경로를 검색하도록 강제하는 일부 플랫폼 독립적 인 해결 방법이 있거나 반드시 이 목적을위한 클래스 독립적 인 함수.

요약 질문 () :

  • 인가 거기에 약간의 마법 (하지만 신뢰성) 해결 방법, 해킹 또는 기타 서버 OS에 관계없이, 다시 앞으로 인하 파일 시스템 경로를 걷어차 PHP를 강제로 ?
  • 저는 대답이 이 아니며 위의 내용에이 없으므로 계속 진행할 것입니다. 디렉토리 슬래시 (또는 선택 사항, 실제로는)를 적용하기 위해 어떤 조항을 디렉토리 구분자로 사용할 수 있습니까? 나는 앞에서 언급 한 필터 함수를 통해 가정하고 있지만, 이제 어디로 가야합니까?

는 앞으로 모든 것을 슬래시. 호스트 OS 구분 기호가 #*&@ 인 경우에도 마찬가지입니다.

+2

[DIRECTORY_SEPARATOR] (http://www.php.net/manual/en/dir.constants.php)를 보았습니까? – vascowhite

+1

@vascowhite - 물론 있습니다. 그러나 나는 그것이 어떤 이익의 방법인지 보지 않는다. 'DS'에 별명을 붙여도 'DS'.DS. '파일.'. 또한, 사용자가 제공하는 경로 (* 설정 파일 등)는 여전히'strtr()'되어야하거나'DIRECTORY_SEPARATOR'를 사용할 필요가 있습니다. – Dan

+0

경로를 비교하는 이유는 무엇입니까? PHP의 함수를 사용하여 파일이나 디렉토리가 존재하는지 테스트 할 수 없습니까? 그건 OS 불가 지론일까요? – vascowhite

답변

8

나는 왜 당신이 이것을해야만하는지 (나는 당신이 해결하고있는 특정 문제에 대한 간단한 설명에 관심이있을 것임) 볼 수는 없다고 말했다. 그러나 여기에 __FILE__의 출력을 사용하는 가능한 해결책이있다. -

$path = str_replace('\\', '/', __FILE__); 

OS에 의해 반환되는 슬래시에 관계없이 작동해야합니다 (필자는 생각합니다).

불행히도 저는 "이 외의 다른 서버 OS와 관계없이 PHP가 강제로 슬래시 된 파일 시스템 경로를 걷어 내도록 강제하는 마술적인 (안정적 임에도 불구하고) 해결책, 해킹 또는 기타 방법을 알지 못합니다." 헬퍼 클래스로 래핑 될 수 있다고 상상하지만, 여전히 코드에서 임의의 의존성을 제공합니다.

+0

감사합니다. @vascowhite - 저는이 시점에서 모든 기능이 앞으로 슬래시되고 디렉토리가 항상 슬래시로 뒤덮 이도록 도우미 클래스 (*와 함께 다른 관련 함수 *)의 기능을 래핑했습니다. – Dan

+0

또한 귀하의 의견과 관련하여; 저는 "가상 디렉터리"에 대한 비교를 해왔습니다. 나는이 질문에 대해 자세히 설명 할 것이다. – Dan

+0

방금 ​​도우미 클래스를 사용했습니다. 'Path :: normalize ($ path, $ expand);와'realpath()를 통한 옵션 확장이 있습니다. 'DIRECTORY_SEPARATOR'을'/'로 정규화하고,'/'를 디렉토리에 추가하고, (* 옵션의 부울 인수 *로) 정규화를 수행하기 전에 경로를 확장합니다. – Dan