2011-03-04 5 views
1

두 부분이 서로 밀접하게 관련되어 있지만 두 부분으로 구성된 질문입니다.팩토리 및 자동 로딩 위험에 대한 자동로드

필자는 웹 사이트 용 페이지 데코레이터 API를 만들고 사이트 전체의 포함 파일에 데코레이터 클래스 용 오토로더를 넣었습니다. 다른 개발자는 어디서나 오토로더를 사용하는 것은 매우 위험하기 때문에 이상한 아이디어라고 생각했습니다. 이상한 오류가 발생할 수 있습니다. 예를 들어, 객체를 세션에 직렬화하고 자동로드 된 클래스 중 하나가 동일한 이름이고 __wakeup() 인 경우 실행됩니다 (시도했지만 재현 할 수 없음). 자동로드가 위험하다는 것은 사실입니까? 그렇다면 어떤 잠재적 인 위험이 있으며 어떻게 피할 수 있습니까? 나는 __autoload()을 사용하고 있지 않지만, 오토로드 기능은 spl_autoload_register()입니다.

그가 자동로드를 사용하는 것에 대한 또 다른 주장은 파일을 직접 포함하는 것보다 속도가 느릴 수 있다는 것입니다. 이는 분명히 분명합니다. 나는 데코레이터가 각 페이지에서 작동하도록 보장하기 위해 모든 데코레이터 클래스를 포함해야한다고 주장 했으므로 그의 제안은 포함을 가져와 원하는 클래스를 만드는 팩토리 클래스를 만드는 것이 었습니다. 나는 계속해서 갈 수 있지만, 많은 사람들이 자동 로딩의 장점에 대해 듣고 모든 애플리케이션을 더 빠르게 만들었다 고 들었다. 나는 그것을 아주 좋아하지만, 여전히 가장 좋고 빠른 것을하고 싶다. 어떤 제안? 예를 들어

답변

6

세션에 객체를 직렬화하고 (나는이 시도하고 그것을 재현 할 수 없습니다하지만) 당신 자동으로 적재 클래스 중 하나는 같은 이름과 __wakeup()가 실행됩니다있는 경우.

그건 사실입니다. 정확히 동일한 이름의 두 파일에 두 개의 클래스가있는 경우 자동 로더가 원하는 파일을 추측 할 수 없으므로 잘못된 클래스로 끝날 수 있습니다. 가장 쉬운 방법은 namespaces을 사용하는 것입니다.

그가 자동로드를 사용하는 것에 대한 또 다른 주장은 파일을 직접 포함하는 것보다 속도가 느려질 수 있다는 것입니다. 이는 분명히 분명합니다.

이것은 사실입니다. 자동 로딩은 직접 포함보다 느리지 만 많이 사용하기 때문에 사용하기 쉽고 포함 할 필요가없는 파일은 절대 포함하지 마십시오. 그 마지막 부분은 넥타이를 만들 수도 있고 심지어 더 빨라질 수도 있습니다.

각 페이지에서 작동하는 데 데코레이터를 사용하려면 모든 데코레이터 클래스를 포함해야한다고 주장 했으므로, 제안 사항은 포함을 가져 와서 원하는 클래스를 만드는 팩토리 클래스를 만드는 것이 었습니다 당신.

PHP가 기본적으로 수행 할 수있는 작업에는 많은 부분이 있습니다. PHP로 자체 작성된 팩토리를 사용하여로드 할 클래스를 결정하는 경우 실제로 오토로더를 작성하고 있지만이를 호출하지는 마십시오.)

제안 사항은 무엇입니까?

개인적으로 직접 파일을 포함하고 싶지 않습니다. 그것은 오래 전에 spl_autoload_register 기능을 사용하기 시작했습니다. 그리고 조금 후회하지 않습니다.

1

필자는 오토로더를 사용하지 않음으로써 일을 더 어렵게 만들고 가독성에서 벗어날 수 있다고 생각합니다.

PHP 네임 스페이스에 익숙하지 않지만 대부분의 주요 프레임 워크를 살펴보고 PEAR 라이브러리는 자동 로딩을 사용합니다.

클래스의 위치를 ​​기반으로 이름을 지정하고이를 사용하여 파일을로드하면 클래스가 매우 간단 해집니다.

즉 My_Special_Model이라는 클래스가 있습니다. 자동 로더가 호출되고 my/special 디렉토리에 model.php 파일이 포함됩니다.

성능면에서 오토로더를 사용하는 한, 성능 문제가 발생할 때까지는 걱정하지 마십시오. 자동 로딩을 제거하는 것보다 단일 쿼리를 최적화 할 가능성이 훨씬 높습니다.