문제

나는 SPL_autoload의 문서를 실제로 얻지 못한다

bool spl_autoload_register  ([ callback $autoload_function  ] )

내 이해를 통해 PHP가 아직로드되지 않은 클래스를 가로 질러 등록 된 기능을 실행하려고합니다. 그래서 예,

public function autoload() {
    require ('nonLoadedClass.php');
}
spl_autoload_register(autoload);
$x = new nonLoadedClass();

요구가 실행 되나요? 그래서 많은 자동 부로 함수를 등록 할 수 있습니까?

public function autoloadXXX() {...}
public function autoloadYYY() {...}
public function autoloadZZZ() {...}
spl_autoload_register('autoloadXXX');
spl_autoload_register('autoloadYYY');
spl_autoload_register('autoloadZZZ');

교리의 경우

require_once(dirname(__FILE__) . '/lib/vendor/doctrine/Doctrine.php');
spl_autoload_register(array('Doctrine', 'autoload'));

배열이 전달되므로 교리 클래스 내에서 자동로드 함수를 실행하려고 시도 할 것 같아요?

도움이 되었습니까?

해결책

spl_autoloader_register 코드가 알려진 클래스를 사용하려고 할 때 호출되는 콜백 함수/메소드를 등록합니다.

콜백 기능은 여러 가지 방법으로 설명 할 수 있습니다.

  • 간단한 기능 이름 : 'my_function'
  • 클래스의 정적 방법 : array('MyClass', 'myMethod')
  • 클래스 인스턴스 방법 : array($myObject, 'myMethod')

교리의 경우 두 번째 해결책 인 것 같습니다. PHP가 모르는 클래스가 사용되면 Autoloader가 Doctrine::autoload, 클래스 이름을 매개 변수로 전달합니다.


그래서 많은 자동 부로 함수를 등록 할 수 있습니까?

예, 당신은 함께 할 수 있습니다 spl_autoload_register :

여러 자동로드 함수가 있어야하는 경우 spl_autoload_register()이것을 허용합니다. 효과적으로 자동로드 함수의 대기열을 생성하고 정의 된 순서대로 각각을 통해 실행됩니다.

그러나 우리는 일반적으로 우리가 가진 각 클래스에 대해 하나의 자동로드 함수/메소드를 정의하지 않습니다. 그것은 매우 비효율적 일 것입니다.

대신, 자동로드 함수에서 수신 한 클래스 이름을 사용하여 어떤 파일이 포함되어야하는지 결정합니다.

예를 들어, 자동로드 기능은 다음과 같습니다.

function my_autoloader($className)
{
    require LIBRARY_PATH . '/' . $className . '.php';
}

트릭은 파일이 포함 된 클래스의 이름을 따서 명명되면 즉시 훨씬 쉬워집니다. ;-)

이것이 배 컨벤션을 사용하여 클래스를 명명하는 이유입니다. My_Class_Name 파일에 맵핑됩니다 My/Class/Name.php

다른 팁

당신의 전체 진술이 정확합니다.

spl_autoload_register 여러 자동로드 함수를 등록 할 수 있습니다. PHP 환경에로드되지 않은 클래스의 객체를 작성하거나 사용하려고 시도하면 PHP는 해당 클래스를 찾는 모든 자동 부로 기능을 실행합니다.

당신이주는 교리 예는 콜백 클래스 내부에 메소드를 등록합니다. 콜백은 단순히 클래스 이름 (정적 메소드의 경우) 또는 해당 클래스의 인스턴스 (비 정적 메소드)를 포함하는 배열 및 메소드 이름입니다.

말은 옳습니다. 알려지지 않은 클래스가 인스턴스화 될 때 호출됩니다. 그런 다음 필요한 파일을 포함/요구할 수 있습니다.

함수가 클래스에 상주하면 배열로 전달해야합니다. 이 경우 교리 수업의 사례 대신 교리 수업에 전달되기 때문에 정적 기능입니다.

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