목차
왜 $ Globals가 부족한가
의존성 주입이 코드 품질을 향상시키는 방법
1. 명시 적 의존성
2. 더 나은 테스트
3. 느슨한 커플 링 및 재사용 성
4. 제어 역전에 대한 지원 (IOC)
일반적인 DI 패턴
$ Globals에서 Di로 전환
결론
백엔드 개발 PHP 튜토리얼 의존성 주입 : $ Globals의 우수한 대안

의존성 주입 : $ Globals의 우수한 대안

Aug 03, 2025 pm 03:56 PM
PHP $GLOBALS

의존성 주입 (DI)은 $ globals를 사용하는 것보다 우수합니다. 2. DI는 글로벌 상태를 조작 해야하는 $ Global과 달리 종속성을 쉽게 조롱 할 수있게하여 테스트 가능성을 향상시킵니다. 3. DI는 글로벌 범위에서 구성 요소를 분리하여 단단한 커플 링을 줄이고, $ Globals는 예측할 수없는 부작용과 네임 스페이스 오염을 만듭니다. 4. DI는 Laravel 및 Symfony와 같은 현대 프레임 워크에 사용되는 컨테이너를 통해 제어 역전 (IOC)을 지원하여 확장 가능하고 유지 관리 가능한 아키텍처를 가능하게합니다. 5. $ Global에서 DI 로의 전환은 리팩토링 함수를 통해 점차적으로 수행하여 종속성을 매개 변수로 받아들이고 새 클래스에서 생성자 주입을 채택 할 수 있습니다. 6. 생성자 주입은 인스턴스화시 필요한 종속성이 제공되도록 바람직한 DI 패턴입니다. 궁극적으로 DI는 더 깨끗하고 모듈 식 및 전문 코드로 이어져 간단한 스크립트 이외의 심각한 PHP 응용 프로그램의 모범 사례가됩니다.

의존성 주입 : $ Globals의 우수한 대안

현대적인 PHP 개발에서 $ Globals에 의존하는 대신 의존성 주입을 사용하는 것은보다 관리 가능하고 테스트 가능하며 확장 가능한 접근 방식입니다. $ Globals는 스코프의 변수에 대한 글로벌 액세스를 제공하지만 단단한 커플 링을 도입하고 코드를 디버깅하기가 어렵고 예측 가능성을 약화시킵니다. 의존성 주입 (DI)은 필요한 구성 요소에 종속성을 명시 적으로 제공함으로써 이러한 문제를 해결합니다.

의존성 주입 : $ Globals의 우수한 대안

왜 $ Globals가 부족한가

$ globals는 PHP의 슈퍼 글로벌 배열로, 글로벌 범위에 정의 된 모든 변수에 대한 참조가 포함되어 있습니다. 편리하지만 불량한 관행을 장려합니다.

  • 숨겨진 종속성 : 함수가 $ Globals에서 데이터를 가져 오면 서명을 보는 것만으로는 무엇에 의존하는지는 분명하지 않습니다.
  • 테스트하기 어렵습니다 : 기능이 외부 글로벌 상태에 의존하기 때문에 단위 테스트에서 동작을 쉽게 조롱하거나 분리 할 수 없습니다.
  • 네임 스페이스 오염 : 코드의 모든 부분은 $ Global을 수정하여 예기치 않은 부작용과 추적하기 어려운 버그로 이어질 수 있습니다.
  • 단단한 커플 링 : 구성 요소는 명확한 인터페이스를 통해 필요한 것을받지 않고 글로벌 상태에 의존하게됩니다.

예를 들어:

의존성 주입 : $ Globals의 우수한 대안
 함수 processorder () {
    $ db = $ globals [ '데이터베이스'];
    $ db-> query ( "...");
}

이 기능은 데이터베이스에 대한 종속성이 없습니다. 단지 $ Globals에 존재한다고 가정합니다. 그것은 깨지기 쉽고 불분명하게 만듭니다.

의존성 주입이 코드 품질을 향상시키는 방법

종속성 주입은 내부적으로 가져 오는 대신 종속성 (서비스, 구성 또는 개체)을 외부에서 클래스 또는 기능으로 전달하는 것을 의미합니다.

의존성 주입 : $ Globals의 우수한 대안

1. 명시 적 의존성

DI를 사용하면 의존성이 함수 또는 생성자 서명에서 명확합니다.

 클래스 OrderProcessor {
    개인 $ 데이터베이스;

    공개 기능 __construct ($ database) {
        $ this-> 데이터베이스 = $ 데이터베이스;
    }

    공개 기능 프로세스 () {
        $ this-> database-> query ( "...");
    }
}

이제 OrderProcessor 작업 할 데이터베이스가 필요하다는 것이 명백합니다.

2. 더 나은 테스트

테스트 중에 Mock 데이터베이스를 쉽게 주입 할 수 있습니다.

 $ mockdb = $ this-> createmock (database :: class);
$ mockdb-> method ( 'query')-> willreturn (true);

$ processor = 새 OrderProcessor ($ mockdb);
$ result = $ processor-> process ();

글로벌 상태를 설정하거나 부작용에 대해 걱정할 필요가 없습니다.

3. 느슨한 커플 링 및 재사용 성

클래스는 글로벌 변수 나 특정 구현과 관련이 없습니다. 내부 로직을 변경하지 않고 데이터베이스, 로거 또는 구성 관리자를 교체 할 수 있습니다.

4. 제어 역전에 대한 지원 (IOC)

DI는 객체 생성 및 종속성 해상도를 자동으로 관리하는 IOC 컨테이너와 잘 작동합니다. Laravel, Symfony 및 Slim과 같은 프레임 워크는 DI 컨테이너를 사용하여 애플리케이션 아키텍처를 간소화합니다.

간단한 컨테이너 사용 예 :

 $ 컨테이너 = 새로운 컨테이너 ();
$ 컨테이너-> set ( '데이터베이스', function () {
    새 데이터베이스를 반환합니다 ($ host, $ user, $ pass);
});

$ 컨테이너-> set ( 'OrderProcessor', function ($ c) {
    새 OrderProcessor를 반환합니다 ($ c-> get ( 'database'));
});

이를 통해 객체 생성을 중앙 집중화하고 구성 가능하게합니다.

일반적인 DI 패턴

종속성을 주입하는 세 가지 주요 방법이 있습니다.

  • 생성자 주입 : 생성자를 통한 통과 종속성 (가장 일반적이고 권장).
  • 세터 주입 : 세터 방법을 사용하여 선택 사항 또는 교체 가능한 종속성을 주입합니다.
  • 인터페이스 주입 : PHP에서 덜 일반적입니다. 종속성이 어떻게 주입되는지 정의하는 인터페이스를 구현하는 것이 포함됩니다.

생성자 주입은 시작부터 필요한 종속성이 존재하도록하기 때문에 선호됩니다.

$ Globals에서 Di로 전환

$ Globals에서 멀어지면 한 번에 발생할 필요는 없습니다. 작은 시작 :

  • $ globals를 사용하는 기능을 식별하십시오.
  • 대신 매개 변수를 수락하도록 리팩터링하십시오.
  • 처음부터 새로운 클래스에서 의존성 주입을 사용하십시오.
  • 복잡한 객체 그래프를 관리하기위한 DI 컨테이너를 점차적으로 소개합니다.

예를 들어, 이것을 바꾸십시오 :

 기능 SendEmail ($ to, $ dired) {
    $ mailer = $ globals [ 'mailer'];
    $ mailer-> send ($ to, $ subject);
}

와 함께:

 함수 sendemail ($ to, $ district, mailer $ mailer) {
    $ mailer-> send ($ to, $ subject);
}

또는 더 나은 것은 생성자 주입이있는 클래스에서 캡슐화하십시오.

결론

의존성 주입은 클리너, 모듈 식 및 테스트 가능한 코드를 촉진합니다. $ Globals는 데이터를 공유하는 빠른 방법처럼 보일 수 있지만 기술 부채와 깨지기 쉬운 응용 프로그램으로 이어집니다. DI는 좀 더 선행 노력이 필요하지만 장기간 유지 가능성과 유연성으로 비용을 지불합니다.

그것은 단순한 트렌드가 아니라 전문 PHP 개발의 기본 관행입니다. DI를 일관되게 사용하기 시작하면 글로벌 변수로 돌아가는 것은 과거로 돌아가는 것 같은 느낌입니다.

기본적으로 간단한 스크립트를 넘어서 무엇이든 구축하는 경우 DI가 갈 길입니다.

위 내용은 의존성 주입 : $ Globals의 우수한 대안의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제

의존성 주입 : $ Globals의 우수한 대안 의존성 주입 : $ Globals의 우수한 대안 Aug 03, 2025 pm 03:56 PM

Dependencyinjection(DI)issuperiortousing$GLOBALSbecauseitmakesdependenciesexplicit,whereas$GLOBALShidesthem.2.DIimprovestestabilitybyallowingeasymockingofdependencies,unlike$GLOBALSwhichrequiresmanipulatingglobalstate.3.DIreducestightcouplingbydecoup

$ Globals를 통해 확인되지 않은 글로벌 상태의 보안 위험 $ Globals를 통해 확인되지 않은 글로벌 상태의 보안 위험 Aug 03, 2025 pm 04:20 PM

$ globalsAllowsUnintendedVariableoverwriting의 비 점수를 확인하고, anabletackerstanipulateCriticalDatalikeUserIdsorroleswithoutValidation; 2.itincreasEtHeatTackSurfaceBreakingEncuctusion, MakingDectionsDependentOnMutableGabalStattCanBeexPloiTed

$ globals vs. 'Global'키워드 : 핵심 차이 이해 $ globals vs. 'Global'키워드 : 핵심 차이 이해 Aug 04, 2025 pm 03:59 PM

$ globals와 Global은 기능의 글로벌 변수에 액세스하는 데 사용되지만 주요 차이점이 있습니다. 1. $ Globals는 $ globals [ 'var']와 같은 주요 이름을 통해 변수에 액세스하는 고 글로벌 배열이며, 글로벌은 언어 구조이며 글로벌 $ var는 선언해야합니다. 2. $ Globals는 사전 선언이 필요하지 않으며 직접 사용될 수 있습니다. 글로벌은 먼저 선언 한 다음 사용해야합니다. 3. $ Globals는 $ Global [$ varname]과 같은 동적 액세스를 지원합니다. Global은 동적 선언을 지원하지 않습니다. 4.unset ($ global [ 'var'])은 글로벌 변수 자체를 삭제하고 Unset ($ var)은 Global $ V에 있습니다.

$ Globals 조작으로 인한 글로벌 주 혼돈을 디버깅합니다 $ Globals 조작으로 인한 글로벌 주 혼돈을 디버깅합니다 Aug 03, 2025 pm 01:46 PM

$ globalsmanipulationCancauseUnPredictableBugsInphp; TodebugandResolvet, 1. annderstand that globalsprovidesglobalAccesstoAllVaribles, MakingStateChangeshArdTotrack; 2.DetectunwantEdectunwantedModificationStrategicdebuggingAndaglobalglobalswatcherclastosnapshotan

글로벌 주의 위험 : PHP의 $ Globals를 피해야하는 이유 글로벌 주의 위험 : PHP의 $ Globals를 피해야하는 이유 Aug 03, 2025 am 04:14 AM

$ globalscreateshiddendendencies, MakingFunctionSharderToTest, Fragile 및 Nunreusable;

지뢰밭 탐색 : $ Globals의 합법적 (그리고 드문) 사용 사례 지뢰밭 탐색 : $ Globals의 합법적 (그리고 드문) 사용 사례 Aug 04, 2025 pm 02:10 PM

$ globalsmaybeaccepableInlegacysystems likewordpluginswhereItensurescompatibity, 2.itcanbeusedtemporallyBootStrappingBeforedectionEnciorInSavailable, 3.itissuitable-onlyDebuggingToolSindeAndevelopmentenvents.despitetHesec

단위 테스트 코드의 악몽은 $ Globals로 수수께끼를 차지했습니다 단위 테스트 코드의 악몽은 $ Globals로 수수께끼를 차지했습니다 Aug 05, 2025 am 09:06 AM

$ globals를 사용하면 숨겨진 종속성이 도입되어 테스트, 혼란스러운 설정, 격리가 열악하고 시뮬레이션하기가 어렵 기 때문에 단위 테스트가 파괴됩니다. 2. 솔루션은 다음과 같습니다. 먼저 저장 한 다음 오염을 피하기 위해 글로벌 상태를 복원합니다. 3. $ Globals Access를 서비스 클래스에 캡슐화하고 종속성 주입을 통해 전달하여 테스트에서 Mock Object를보다 쉽게 사용할 수 있습니다. 4. 가벼운 의존성 주입조차도 테스트 성을 크게 향상시킬 수 있으며 글로벌 변수를 직접 읽는 것을 피해야합니다. 5. 미래의 문제를 방지하려면 $ global이 비활성화되어야하며 구성 객체를 대신 사용해야하며, 대신 의존성 주입 컨테이너 또는 환경 변수를 사용해야하며, 정적 분석 도구를 사용하여 고혈당 변수를 감지해야합니다. 최종 답변은 다음과 같습니다. $ Global에 대한 의존성은 캡슐화 및 종속성 주입을 통해 점차적으로 제거해야합니다.

현대의 PHP 프레임 워크로 인해 Globals가 쓸모 없게 된 이유 현대의 PHP 프레임 워크로 인해 Globals가 쓸모 없게 된 이유 Aug 05, 2025 am 07:39 AM

ModernPrameworkslikelaravelandsymfonyedenceenceNectioninection -decuredectiontoelinaterelianceon $ globalsinceptenciledenciledencilectally, testability 및 rupplicationStateIsNowmanagedTrroughStructuredSolutionsSuchasconFigUrationServices, r

See all articles