기존 코드를 손상시키지 않고 PHP 네임 스페이스를 라이브러리에 부분적으로 추가하려면 어떻게합니까?


10

우리 회사는 PHP 5.3이 네임 스페이스를 추가하기 훨씬 오래 전부터 모듈 식 PHP 프레임 워크를 만들었습니다. 최근 우리는 라이브러리의 새 코드에서 네임 스페이스를 사용하기로 결정했으며 결국에는 이전 코드의 네임 스페이스를 만들려고합니다. 그러나 v5.3 이전 코드베이스에 네임 스페이스를 추가하는 것이 좋지 않은지 확인하기 위해 해결하려는 몇 가지 문제가 있습니다.

  1. 클래스의 네임 스페이스를 만들 수 있지만 전역 네임 스페이스를 가져 와서 사용하여 모든 글로벌 클래스에 \접두사 가 필요하지 않습니까?
  2. 라이브러리에서 기존 클래스를 네임 스페이스로 지정하면 프레임 워크가 업그레이드되는 즉시 기존의 모든 프로젝트가 중단되는 것을 어떻게 방지 할 수 있습니까? 예를 들어, 할 수있는 클래스의 이름이 라이브러리 변화 ThemeEngine할 수 \module\theme\ThemeEngine있지만, 기존의 웹 사이트가 전화를 ThemeEngine하지 않고 어떤 코드 수정? 그렇다면 그 코드는 어떻게 생겼습니까?

답변:


2
  1. 슬프게도 클래스 만 네임 스페이스를 '사용'할 수는 없습니다 : http://www.php.net/manual/en/language.namespaces.importing.php . 편집 : 예제 중 하나에서 ArrayObject와 마찬가지로 전역 네임 스페이스에서 클래스를 가져올 수 있습니다.

  2. 전역 네임 스페이스에있는 모든 기존 클래스가 이론적으로 클래스를 올바르게 찾을 수 있도록 전역 사용 섹션을 사용할 수 있습니다. 이론적으로 ...

우리는 당신과 같은 보트에 있습니다. 네임 스페이스를 사용하지 않지만 Zend_Db_Table과 같은 _ 네임 스페이스 위조자를 사용하는 오래된 코드가 있으며 네임 스페이스도 가짜가 아닌 오래된 코드가 있습니다. 우리는 아마도 같은 경로를 택할 것이지만 가능하다면 테스트해야합니다. 행운을 빕니다!


1

결국 내가 한 일은 사용-필요한 개별 클래스를 가져 오기 위해 '사용'이었습니다.

예를 들어 다음과 같은 모든 것 앞에 '/'를 추가하는 대신

\DateTime()

네임 스페이스 아래에 추가했습니다.

namespace MyProject;
use DateTime;

...
DateTime();     //without \
...
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.