정적 공장 패턴을 사용할 때 PHP 라이브러리를 포함시키는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/266803

문제

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;
        }
    }
}

CAR.PHP 및 TRUCK.PHP는 하나만 필요할 수 있지만 포함되어야하므로 이것은 바람직하지 않습니다. 내가 아는 한, 요구/포함 및 해당 ... _ 일단 변형이 호출과 동일한 범위의 라이브러리를 포함합니다. 이것이 사실입니까?

그렇다면 이것이 메모리 누출로 이어질 것이라고 생각합니다.

    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;
            }
        }
    }

두 번째 예에서는 require_once 맛이 사용 되더라도 호출 범위로 인해 여러 호출 ()가 Create ()를 요구하는 여러 호출로 이어질 것으로 보입니다.

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

감사!

도움이 되었습니까?

해결책

Autoload 시설은 종종 악한 것으로 보이지만이 작업에서 매우 잘 작동합니다.

좋은 파일 시스템 <-> className 매핑을 얻을 수 있으므로 클래스를 제공 할 때 제공 할 수 있으면 오버 헤드를 절약하고 필요할 때만로드 클래스 만 절약 할 수 있습니다.

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

그런 다음 만 만들 수 있습니다

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

그리고 필요할 때 그들을 데려 올 것입니다.

보다 php.net/__atoload 자세한 사항은.

다른 팁

나는 사용하는 것이 좋습니다 자동 로더.

즉, 사용하지 마십시오 require_once() 서브 클래스 중 하나를 요구하지만 Autoloader가 전화 할 때 참조 된 클래스를로드 할 수있는 함수를 호출하도록 허용합니다. new Truck() 또는 new Car().

메모리 누출 질문에 관해서는, 아니, require_once 코드 블록에 의해 범위가 지정되지 않습니다.

살펴보십시오 __ afoload () 함수.

요구 사항 _once 함수의 요점은 범위에 관계없이 파일을 두 번 포함하지 않고 클래스를 재정의하여 PHP 오류를 일으킨다는 것입니다. 따라서 메모리 누출에 대한 걱정은 없습니다. require_once가 닿는 경우 클래스 데프는 글로벌 심볼 테이블에 한 번만 진행됩니다.

그러나 그 외에도 Autoloader를 사용하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top