2011-08-19 4 views
0

여러 곳에서 사용되는 PHP 함수 (funcA라고 함)가 있으므로 funcA (및 몇 가지 관련 함수)를 다른 PHP에 require라는 별도의 파일에 배치했습니다. 파일. funcA는 이미 열려 있고 그것을 호출하는 코드가 사용하는 데이터베이스에 대해 수많은 쿼리를 작성합니다. 이러한 쿼리는 MDB2 개체를 통해 수행됩니다.함수 내부에서 SQL 호출하기

funcA가 호출 된 곳에서 호출 루틴은 이미 연결된 MDB2 개체 포인터를 전달합니다. 이것은 잘 작동합니다.

MDB2object 포인터를 전달하지 않고 funcA require MDB2를 갖고 자체 mdb2 개체를 사용하여 데이터베이스에 연결하면 funcA를 완전히 자체 포함하는 것이 더 좋은지 궁금합니다. 더 많은 메모리, 더 많은 CPU 사이클 및 더 많은 네트워크 트래픽이 있지만 더 나은 방법입니까?

답변

1

"가장 좋은 방법은"그런 것들 중 하나입니다 (당신은 정말이 패턴을 이해하는 것은 시간과 문제가 많이 당신을 구할 수 있기 때문에 위의 링크를 읽어한다) 정의하기가 거의 불가능합니다. 그러나, 내 생각에, 함수가 다른 것에 의존하는 곳에서는, 당신이 지금하고있는 것처럼, 의존성을 함수에 전달하는 것이 가장 좋습니다.

이 기능을 사용하면 데이터베이스를 찾고 연결하는 것에 대해 걱정할 필요없이 기능을 수행 할 수 있습니다. 또한 더미 데이터베이스로 함수를 테스트 할 수 있습니다.

일반적으로 의존성 주입으로 알려져 있으며 객체 지향 아키텍처에서 널리 권장됩니다.

+0

의존성 주입도 좋은 해결책이지만, OP의 질문에서 나는 그가 어떤 OOP 관행을 따르지 않는다고 가정하고 있습니까? – ChrisR

+0

@ChrisR : 네 말이 맞아. 이 경우에는 OOP가 없지만 OOP 외부에서도 종속성 주입 개념 (parms와 같은 간단한 것)이 적용됩니다. –

+0

@JonathanM : 당연히 사실이고 당신도 그렇게하려고 노력해야합니다. 유일한 문제는 not-oop context dependency injection에서의 imo가 레지스트리 나 싱글 톤보다 추적하기가 더 어렵다는 것입니다. :) 그러나 나에 대한 올바른 경로를 가지고있어서 다행입니다 :) – ChrisR

1

일부 사례는 나쁜 습관이라고 할 수도 있지만이 경우 해결책은 Registry pattern 또는 Singleton PDO class 일 수 있습니다.

싱글 톤이나 레지스트리의 옳고 그름에 대한 전체 토론을 시작하고 싶지는 않지만이 경우 응용 프로그램의 대부분을 리펙토링하지 않는 가장 깨끗한 솔루션 일 수 있습니다.


일부 정말 기본적인 예는

// Singleton class MyPDO 
// This assumes you have a singleton class extending PDO somewhere included or required 
function funcA(){ 
    $database = MyPDO::getInstance(); 
    // ... 
} 

// Registry pattern 
// This assumes that somewhere during your bootstrapping you create an 
// instance of PDO and store it in the registry so you can retrieve it 
// anywhere else later 
function funcA(){ 
    $database = Registry::get('Database'); 
    // ... 
} 
+0

감사합니다. ChrisR. 필자는 외부 의존성 (parms과 같은 함수에 전달 된 것 이상)을 피하려고합니다. 그러나 이것은 내가 이전에 이해하지 못했던 레지스트리에 대해 약간의 빛을 비었습니다. 따라서 +1이 있습니다. :) –

관련 문제