>백엔드 개발 >PHP 튜토리얼 >PHP 클래스를 자동으로 로드하는 3가지 방법의 자세한 예

PHP 클래스를 자동으로 로드하는 3가지 방법의 자세한 예

伊谢尔伦
伊谢尔伦원래의
2017-07-01 10:26:492317검색

 최근에 Composer를 배우면서 PHP를 접한 이후로 PHP 자체 클래스의 자동 로딩 방법과 PHP의 타사 종속성 관리 도구 작성기를 포함하여 PHP에서 클래스를 자동으로 로딩하는 세 가지 방법을 접했습니다. . PHP Yaf 프레임워크에서의 로딩 방법 및 자동 로딩 방법. 이번 블로그에서는 주로 PHP5에서 제공하는 로딩 방법을 자세히 소개하고 있으며, Composer와 Yaf에서 클래스 자동 로딩은 두 부분으로 나누어서 다음 시간에 함께 배워보도록 하겠습니다. 1. 수동 로딩 방법

C, C++ 등의 언어에서 PHP의 다른 파일에 관련 클래스 및 메소드를 사용해야 하는 경우 include,

include_once

, require 또는 require_once를 사용하여 include할 수 있습니다. 사용된 파일. 그 중 4가지의 차이점은 다음과 같습니다.

    include는 파일에 적용됩니다. 파일이 없으면 건너뛰고 계속 실행하라는 메시지가 표시됩니다.
  • include_once는 파일에도 적용되지만 한 번만 적용됩니다. 파일이 없으면 실행이 계속됩니다.
  • require는 파일을 적용한다는 뜻입니다. 파일이 없으면 프로그램 실행을 중단합니다.
  • require_once는 파일에만 적용됩니다. 한 번 적용하고 파일이 없으면 프로그램 실행을 중단합니다.
  • 위의 네 가지 방법은 파일이 필요할 때 프로그램에 수동으로 파일을 포함시키는 것입니다. 프로젝트 크기가 상대적으로 작을 때는 괜찮지만 프로젝트 크기가 커지면 각 파일에 필요한 클래스를 수동으로 로드하는 것은 악몽일 뿐입니다.

 문제를 방지하려면 로딩 시

set_include_path

()를 통해 로딩 경로를 설정하고, get_include_path()를 통해 로딩 경로를 얻을 수도 있습니다. set_include_path()와 get_include_path()에 관해서는 방금 접한 내용인데 여기서는 set_include_path()에 대해 간략하게 소개하고 앞으로 문제가 발생하면 추가하겠습니다. 우선 set_include_path()는 스크립트에서 php.ini의 include_path를 동적으로 수정하는데, 이 include_path는 include와 require를 하는 것입니다. (아래 특별한 설명이 없을 경우 include는 include와 include_once를 나타내며, require는 require의 경로를 나타냅니다. 및 require_once)를 설정하거나 사전 정의해야 합니다. main.php 파일의 projname/home/lib/mylib/test 폴더에 있는 a.php, b.php, c.php...를 사용해야 하는 경우, 포함된 경로가 설정되어 있지 않으면 다음 경로에 작성하세요. 다음 형식:

<?php

        include("projname/home/lib/mylib/test/a.php");
        include("projname/home/lib/mylib/test/b.php");
        include("projname/home/lib/mylib/test/c.php");
	  ......

이런 방식으로 각 포함에는 절대 경로가 포함되어야 하는데 이는 매우 번거로운 것 같습니다. 포함해야 하는 파일 앞에 set_include_path("projname/home/lib/mylib/test")를 추가하면 다음과 같은 형식으로 작성할 수 있습니다.

<?php

    set_include_path("projname/home/lib/mylib/test");
    include("a.php");
    include("b.php");
    include("c.php");
    ......

첫 번째 시간이 많이 걸리고 힘든 작성 방법에 비해 , 두 번째 두 번째 방법은 분명히 많은 시간을 절약하지만 각 파일은 여전히 ​​포함되어야 하며 포함 경로를 단순화할 뿐입니다. 물론, 위에서 언급한 상황은 필요한 파일이 모두 하나의 폴더에 존재하는 경우입니다. 파일이 서로 다른 폴더에 있는 경우, 이때 include 또는 require에 포함된 파일이 있으면 set_include_path() 문을 여러 개 추가할 수 있습니다. name이 여러 디렉터리에 나타나면 set_include_path 디렉터리에 처음 나타나는 파일만 포함됩니다. set_include_path에 지정된 모든 폴더에 해당 파일이 없고 파일 이름이 현재 폴더에 나타나면 해당 파일이 직접 포함됩니다. 현재 디렉토리의 해당 파일.

 get_include_path() 함수는 현재 포함 경로를 얻는 데에만 적합합니다.

 2._autoload 및 spl_autoload_register() 자동 로딩 방법

 클래스 로딩 방법에서 손을 떼기 위해 자동 로딩 메커니즘 ---autoload가 PHP5 이상 버전에서 제공됩니다. 자동 로드를 사용하면 처음부터 모든 클래스 파일을 포함하거나 요구하는 대신 실제로 필요할 때만 클래스를 로드할 수 있습니다. 이를 지연 로드라고 합니다. PHP가 제공하는 자동 로딩 메커니즘은 autoload()와 spl_autoload_register()의 두 가지 유형으로 나뉩니다.

 1). 자동 로드 메커니즘

  PHP5에서 프로그램을 실행하는 동안 특정 클래스가 포함되어 있지 않은 것으로 확인되면 자동 로드 메커니즘이 실행되어 필요한 클래스를 로드합니다.

<?php

	public function  autoload($classname) {
		$fileName = $classname."php";
		if (file_exist($fileName)) {
			require_once("$fileName");
		} else {
			echo $fileName." doesn&#39;t exist!"
		}
	}

이 프로그램이 작성된 방식을 바탕으로 다음과 같은 결론을 내릴 수 있습니다.

자동 로딩 메커니즘을 보장하는 원칙은 클래스 이름과 파일 이름이 상응하는 관계를 갖도록 하는 것입니다.

클래스. 이름 + 접미사는 이 클래스의 위치를 ​​구성합니다. 파일이 존재하는 경우 $fileName을 기반으로 클래스가 로드됩니다. 파일이 없으면 사용자에게 파일이 존재하지 않는다는 메시지가 표시됩니다. 일반적으로 자동 로딩 메커니즘에는 다음 세 단계가 포함됩니다.

    클래스 이름을 기준으로 파일 이름을 결정합니다. 즉, 클래스 이름과 파일 이름 간의 통일된 대응 규칙을 결정합니다.
  • 파일 이름에 따라 디스크에서 해당 파일을 찾습니다. (예제는 가장 간단한 경우입니다. 즉, 클래스와 이를 호출하는 PHP 파일이 동일한 디렉터리에 있습니다.) , set_include_path()를 사용할 수 있습니다. 로드할 경로를 지정하세요.

  • 디스크 파일을 파일 시스템에 로드합니다. 이 단계는 단지 일반 포함을 사용하고 해당 클래스 파일을 포함하도록 요구합니다. ()는 클래스 자동 로드 원칙을 구현합니다. 즉, 시스템에서 자동 로드를 구현하는 핵심인 클래스 이름과 파일 이름 사이에 통일된 대응이 있습니다. 그러나 개발 전에 합의된 통일된 표준이 없는 경우 시스템을 개발할 수 있으며 해당 규칙이 다를 수 있으며 이로 인해 autoload()에서 여러 로딩 규칙을 구현해야 할 수 있으며 이로 인해 자동 로드( ) 기능이 매우 부풀어 오른다. 이 문제를 해결하기 위해 PHP는 자동 로딩 메커니즘(spl_autoload_register().

  •  2)도 제공합니다. spl_autoload_register() 메커니즘

 SPL은 Standard PHP Library(Standard PHP Library)의 약어로, PHP5 확장 라이브러리. SPL 자동 로드는 함수 포인터 autoload_func를 자동 로드 함수로 지정하여 구현됩니다. SPL에는 spl_autoload와 spl_autoload_call이라는 두 가지 자동 로딩 기능이 있습니다. autoload_fun을 이 두 가지 로딩 함수의 주소로 지정하여 다양한 자동 로딩 메커니즘을 구현할 수 있습니다.

spl_autoload

  • spl_autoload는 SPL에서 구현한 기본 자동 로딩 기능으로 두 개의 매개변수를 받을 수 있는 기능입니다. 첫 번째 함수는 로드할 클래스의 이름을 나타내는 $class_name이고, 두 번째 매개변수는 선택 매개변수이며 클래스 파일의 확장자를 나타내는 $file_extension입니다. $file_extension에는 여러 확장자를 지정할 수 있습니다. 확장자를 지정하지 않으면 기본 확장자 .inc 또는 .php가 사용됩니다. spl_autoload는 먼저 $class_name을 소문자로 변경한 다음 모든 include_path에서 $class_name.inc 또는 $class_name.php 파일을 검색합니다. 해당 파일이 발견되면 해당 클래스가 로드됩니다. 실제로 spl_autoload("xxxx", ".php")를 수동으로 사용하여 xxxx 클래스를 로드할 수 있습니다. 이는 실제로 require/include와 유사하지만 여러 확장을 지정할 수 있으므로 spl_autoload가 상대적으로 더 유연합니다.

  •  앞서 언급했듯이 spl_autoload_register에 포함된 autoload_func 함수 포인터는 사용할 로딩 함수를 지정하는 데 사용됩니다. 그런 다음 해당 함수 주소를 autoload_func에 할당해야 합니다. spl_autoload_register()는 함수 포인터 autoload_func에 값을 할당하는 기능을 구현합니다. spl_autoload_register() 함수에 매개변수가 포함되어 있지 않으면 기본값은 spl_autoload()를 autoload_func에 할당하는 것입니다.

spl_autoload_call 

  • 실제로 SPL 모듈 내부에는 본질적으로 해시 A 테이블인 autoload_functions가 있습니다. 또는 직관적인 이해를 위해 각 요소가 로딩 함수에 대한 포인터인 컨테이너로 상상해 보겠습니다. spl_autoload_call의 구현 메커니즘은 실제로 비교적 간단합니다. 이는 특정 순서로 컨테이너를 순회하고 내부의 함수 포인터가 가리키는 로딩 함수를 실행한 후 필요한 클래스가 로드되었는지 확인합니다. 로딩이 완료되면 종료하세요. 그렇지 않으면 아래쪽으로 계속 실행합니다. 모든 로딩 함수가 실행된 후에도 필요한 클래스가 여전히 로드되지 않으면 spl_autoload_call()이 직접 종료됩니다. 이는 자동 로드 메커니즘을 사용하더라도 클래스 로딩이 완료되지 않을 수 있음을 의미합니다. 핵심은 자동 로드 기능을 생성하는 방법에 있습니다.

  • autoload_functions이 있는데 생성된 자동 로딩 기능을 어떻게 추가하나요? spl_autoload와 동일하며 spl_autoload_register()를 사용하여 로드 함수를 autoload_functions에 등록합니다. 물론 등록된 함수는 spl_autoload_unregister() 함수를 통해 autoload_functions의 해시 테이블에서 삭제할 수 있습니다. 이는 이전에 작성된 팩토리
디자인 패턴

과 일치합니다. 여기서 설명해야 할 한 가지는 spl_autoload_register가 자동 로딩을 구현하는 순서입니다. spl_autoload의 자동 로딩 순서는 다음과 같습니다. 먼저 autoload_func가 비어 있는지 확인합니다. autoload_func가 비어 있으면 자동 로드 함수가 정의되어 있는지 확인하고, autoload() 함수가 정의되어 있으면 오류를 보고합니다. 로딩 결과 . autoload_func가 비어 있지 않으면 autoload_func 포인터가 가리키는 함수가 자동 로드 정의 여부를 확인하지 않고 직접 실행됩니다. 즉, spl_autoload_register()에 등록된 함수가 먼저 사용됩니다.

 위 소개에 따르면 autoload_func가 비어 있지 않으면 autoload() 함수가 자동으로 실행될 수 없습니다. spl_autoload_register() 함수를 사용하면서도 autoload() 함수를 계속 사용하고 싶다면 spl_autoload_register(), 즉 spl_autoload_register(autoload())를 통해 해시 테이블에 자동 로드 함수를 추가하면 됩니다. 다음 코드 예제에서는 클래스의 일반 메서드와 정적 공용 메서드를 등록하는 방법을 보여줍니다.

  普通函数的注册方法。

<?php

	/**
	* @ 普通函数的调用方法,可以调用后缀名分别为.php和.class.php的类文件
	*/
	function loadFielEndOfPhp($classname) {
		$fileName = $classname.".php";
		if (file_exist($fileName)) {
			require_once("$fileName");
		} else {
			echo $fileName." doesn&#39;t exist!"
		}
	}

	function loadFielEndOfClassPhp($classname) {
		$fileName = $classname.".class.php";
		if (file_exist($fileName)) {
			require_once("$fileName");
		} else {
			echo $fileName." doesn&#39;t exist!"
		}
	spl_autoload_register("loadFielEndOfPhp"); 
	spl_autoload_register("loadFielEndOfClassPhp");

}

  类中静态的加载函数的注册方法。

<?php

	/**
	* @ 类中静态成员函数的调用方法,可调用后缀名为.php和.class.php的文件
	*/
    class test {
		public static function loadFielEndOfPhp($classname) {
			$fileName = $classname.".php";
			if (file_exist($fileName)) {
				require_once("$fileName");
			}
			else {
				echo $fileName." doesn&#39;t exist!"
			}
		}

		public static function loadFielEndOfClassPhp($classname) {
			$fileName = $classname.".class.php";
			if (file_exist($fileName)) {
				require_once("$fileName");
			}
			else {
				echo $fileName." doesn&#39;t exist!"
			}
	}
	
	spl_autoload_register(array("test","loadFielEndOfPhp")); 
	//spl_autoload_register("test::loadFielEndOfPhp");         //上一行的另一种写法,不是使用数组的形式完成注册;
	spl_autoload_register(array("test","loadFielEndOfClassPhp"));
	//spl_autoload_register("test::loadFielEndOfClassPhp");    //第三行的另一种写法,不是使用数组的形式完成注册;

}

 

위 내용은 PHP 클래스를 자동으로 로드하는 3가지 방법의 자세한 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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