2009-08-18 3 views
1

PHP에서 클래스를 "선언 취소"또는 "재 선언"할 수 없으며 C# 3.0에서와 같은 확장 메서드를 사용할 수 없습니다. 그래서, 여기에 내 상황이있다.PHP에서 기존 클래스 이름 충돌이 발생했습니다. 창조적 인 솔루션이 필요합니다.

다른 사람의 코드 기반으로 작업하고 있습니다. 그들은 DateTime 클래스가 존재하지 않는 약간 더 오래된 버전의 PHP를 사용해야 만 했으므로 Time, Date 및 DateTime 클래스를 추가하는 오픈 소스 라이브러리가 포함되었습니다. 글쎄, 나는 이것을 클라이언트의 서버에 배포 할 것이고이 클래스는 이미 정의되어있다. 이 문제를 해결하기 위해 "if class is not defined"체크를 추가합니다. 그러나 클래스의 api는 정확히 같지 않고 코드 어딘가에있을 수도 있습니다 (예상했던대로). 사용중인 언어 버전에 포함 된 DateTime 클래스의 정의되지 않은 메서드를 사용하지 마십시오.

클래스를 언로드하는 방법이나이 문제를 해결하기 위해 생각할 수있는 창의적인 방법이 있습니까? 모든 참조를 위해 모든 파일을 검색하지 말고 클래스 이름을 바꿀 수도 있습니다. 지저분한 소리가 들리지만, 내 유일한 선택일지도 모른다. 나는 한 곳과 한 곳에서만 일어나는 문제를 훨씬 더 선호한다.

감사합니다.

답변

3

클래스 정의를 이름 공간으로 묶을 수 있습니다. 그런 다음 현재 DateTime 클래스를 사용하는 모든 파일에서 "using namespace xxx"(정확한 PHP 구문을 기억하지 못합니다)를 선언합니다.

이것은 하나의 장소 및 한 장소 만의 해결책은 아니지만 적어도 클래스의 모든 참조를 바꿀 필요는 없으며 파일 시작 부분의 네임 스페이스를 참조하십시오.

희망이 도움이됩니다.

+1

이것은 PHP> = 5.3에서만 작동합니다. 널리 사용되는 것은 아닙니다 –

+0

여전히 옵션 중 하나입니다. 특히 쇼 스톱워치 인 경우 특히 ... – VolkerK

+0

잘 알고 있습니다 .. – Petruza

1

코드베이스를 최신 버전의 PHP로 마이그레이션하려고합니다. 새 PHP 버전에서 프로덕션 코드를 사용하려는 경우 어쨌든 해당 버전에서 테스트해야합니다. 코드 기반을 업데이트하고 테스트하기위한 노력에 투자하고 싶지 않으면 이전 버전을 대상 시스템에 설치해야 할 수도 있습니다. 그렇지 않으면 코드가 올바르게 작동한다는 것을 보증 할 수있는 방법이 없습니다.

적절한 도구를 사용하여 많은 파일을 검색하고 이러한 클래스의 모든 항목을 식별하는 것은 그리 어렵지 않습니다. Petruza 제안 - - 네임 스페이스를 사용

3

여기에 몇 가지 좋은 아이디어 ...

아마 그것을 처리하는 가장 좋은 방법입니다 ...하지만 PHP 5.3 만입니다.

또는 코드의 리팩토링에 대한 로버트의 제안은 합리적인 생각이지만 상당한 시간과 노력이 필요할 것입니다. 결국이 작업을 수행해야하므로 작업을 원할 수 있습니다.

또는 시스템을 온라인으로 가져 오는 것이 최우선 순위이며 이후에이를 리펙토링 할 수있는 경우 클래스 및 클래스에 대한 모든 참조의 이름을 바꿀 수 있습니다. 접두어 -DateTimecompany_DateTime에 추가하면 이전 방식대로 네임 스페이스를 지정하게되고 수업은 별 어려움없이 공존해야합니다. 물론, 지원 라이브러리를 곧 업데이트해야하는 경우, 이는 삶을 더 어렵게 만들므로, 맹목적으로이 라이브러리에 뛰어 들지 마십시오. ...

0

글쎄,이 솔루션은 정말 못 생기고 최후의 수단으로 만 사용하십시오.예를 들어, Opencart에서 "admin"과 "catalog"의 카테고리 클래스는 모두 동일한 클래스 이름을 가지고 있습니다. 동일한 코드 조각 내에서 두 클래스를 모두 사용하려면 정말 어려운 작업입니다. 그래서 해결 방법은 포함시키려는 클래스의 이름을 바꾸는 것입니다. 이런 식으로 뭔가 : new OriginalClassName() 새로운 클래스 이름 new ModifiedClassName()을 사용하는 대신 다음

$file = file_get_contents("path/to/file.php"); 
$file = str_replace("OriginalClassName", "ModifiedClassName", $file); 

// must remove <?php tag from the beginning 
eval(substr($file, 5)); 

.

관련 문제