2008-11-05 21 views
7

PHP 라이브러리에 정적 팩토리 패턴이 여러 개 있습니다. 그러나 메모리 사용 공간이 부족해지고 실행 시간 동안 필요한 파일 수를 줄이기를 원합니다. Car.php 및 Truck.php도 하나 또는 필요할 수 있습니다 다른 불구하고 포함해야하므로정적 팩토리 패턴을 사용할 때 PHP 라이브러리를 포함시키는 가장 좋은 방법은 무엇입니까?

require_once('Car.php'); 
require_once('Truck.php'); 

abstract class Auto 
{ 
    // ... some stuff ... 

    public static function Create($type) 
    { 
     switch ($type) { 
      case 'Truck': 
       return new Truck(); 
       break; 
      case 'Car': 
      default: 
       return new Car(); 
       break; 
     } 
    } 
} 

이것은 바람직하지 않다 : 여기에 우리가 현재있는 곳의 예입니다. 내가 아는 한 require/include와 their ... _ 변형은 라이브러리를 호출 할 때와 동일한 범위에 포함합니다. 사실입니까?

그렇다면, 나는이 메모리 누수로 이어질 것이라고 믿는다

abstract class Auto 
    { 
     // ... some stuff ... 

     public static function Create($type) 
     { 
      switch ($type) { 
       case 'Truck': 
        require_once('Truck.php'); 
        return new Truck(); 
        break; 
       case 'Car': 
       default: 
        require_once('Car.php'); 
        return new Car(); 
        break; 
      } 
     } 
    } 

그것은 제 2의 예에서, 다수의 호출 (만들기 나에게 보이는) 여러 이어질 것 때문에 범위의 필요 require_once 플레이버가 사용 되더라도 호출.

사실인가요? PHP와 같은 예제에서 라이브러리를 동적으로 포함시키는 가장 좋은 방법은 무엇입니까?

감사합니다.

답변

7

자동로드 기능은 흔히 악으로 여겨지지만이 작업에서는 아주 잘 작동합니다.

좋은 파일 시스템을 얻을 수 있다면 클래스를 제공하여 주어진 클래스를 찾을 수 있다면 오버 헤드를 줄이고 필요할 때만 클래스를로드 할 수 있습니다.

정적 클래스에서도 작동하므로 정적 클래스가 범위에 있으면 클래스가 이미 심볼 테이블에 있기 때문에 require의 "is file yet yet"테스트를 한 번 호출 할 필요가 없습니다.

은 그럼 그냥

require("autoloader.php"); 
$x = new Car(); 
$x = new Bike(); 

을 만들 수 있으며, 그것은 단지 필요할 때 그들을 가져올 것이다.

자세한 내용은 Php.net/__autoload을 참조하십시오.

+0

로컬로드가 필요하지 않은 구문 설탕을 자동로드합니까? – thesmart

+0

"required"파일에 클래스 정의가 포함되어 있으면 로컬 범위에 문제가 없습니다.PHP는 Java와 같은 "내부 클래스"를 지원하지 않습니다. 모든 클래스는 현재 네임 스페이스의 "최상위 수준"에서 정의됩니다. –

2

autoloader을 사용하는 것이 좋습니다.

즉, 하나의 서브 클래스를 필요로 require_once()를 사용하지만, 당신이 new Truck() 또는 new Car()를 호출 할 때 참조 된 클래스를로드 할 수있는 함수를 호출 할 오토로더를 허용하지 않습니다.

메모리 누수 문제는 아니요, require_once은 코드 블록에 의해 범위가 지정되지 않습니다.

0

require_once 함수의 요점은 범위에 관계없이 파일을 두 번 포함하지 않고 PHP 오류를 일으키는 클래스를 다시 정의한다는 것입니다. 따라서 메모리 누수에 대한 걱정없이 require_once에 도달하면 클래스 def는 전역 심볼 테이블에 한 번만 이동합니다.

그러나 그렇다고해서 오토로더를 사용하십시오.