개발 꿀팁/PHP

나만의 PHP 프레임워크 구축하기 (1)

Jammie 2022. 10. 10. 14:13
반응형

앞말
PHP를 쓰는 MVC 프레임워크에 대해 여러분이 생각하는 첫 번째 단어는 "바퀴 만들기"입니다. 네, 아직 충분한 공력이 없는 프로그래머가 쓴 PHP 프레임워크는 분명히 대신들의 손에서 나온, 시간과 다양한 프로젝트의 테스트를 거친 프레임워크보다 못할 것입니다.하지만 나는 주로 이렇게 준비했고, 이렇게 했다.

PHP에 대한 모든 측면을 이해했다고 생각하지만 PHP를 스스로 학습하는 시간은 아직 짧고 기초가 튼튼하지 않으며, 자주 사용되는 함수의 많은 매개변수는 매뉴얼을 확인해야 하며, 네임스페이스, 반사 등과 같은 PHP의 새로운 특성은 단순히 본 것일 뿐 실제 적용되지는 않았습니다.
PHP는 지식이 많고 복잡하며 일반적인 프로젝트는 비즈니스 논리 코드를 기반으로 하며 프레임워크는 이러한 지식을 통합할 수 있는 프로젝트입니다.
스스로 프레임을 쓸 때도 TP/CI/YII 등의 내가 사용하던 프레임의 소스코드를 참고해 자신이 소스코드를 볼 때도 프레임을 이해하도록 돕고, 앞으로 사용할 프레임을 더 쉽게 받아들일 수 있다.
그래서 이번에 바퀴를 만드는 목적은 바퀴를 만들기 위해서가 아니라 만드는 과정에서 그 공법을 익히고, 바퀴의 특징을 정리해서 바퀴를 더 잘 사용하기 위해서입니다.

완전한 PHP 프레임워크를 쓴다면 디자인 패턴, 반복기, 이벤트 및 갈고리 등과 같은 많은 기본 지식의 유연한 적용과 같은 많은 PHP 지식 포인트가 필요합니다.나는 이런 것들을 아직 완전히 통제할 수 없다고 생각하기 때문에, 나의 단계는 먼저 스스로 골격을 만든 다음, 다른 PHP 틀을 참고하여 참고하는 것이다.프레임의 특징은 천천히 보완해야 합니다.업무상의 이유로, 그리고 밤에 알고리즘, 네트워크 등의 프로그래밍 기초를 보충해야 하기 때문에, PHP 프레임워크 부분은 주말에만 업데이트 할 시간이 있을 수 있으며, 프레임워크 기능 업데이트 후 사용하는 지식 포인트를 요약하여 블로그 업데이트 하겠습니다

프레임 전체
먼저 PHP의 MVC 프레임워크의 작업 흐름을 스스로 요약합니다.

간단히 말해서, 하나의 포털 파일로 요청을 받고, 라우팅을 선택하고, 요청을 처리합니다.결과를 되돌리다.

물론 몇 마디로 정리된 것은 실제로 해야 할 일이 많습니다. PHP 프레임워크는요청을 수락할 때마다 상수를 정의하고, 프로파일, 기본 클래스를 로드하고, 액세스한 URL에 따라 논리화합니다.앨범 판단, 해당(모듈) 컨트롤러 및 방법을 선택하고 해당 클래스를 자동으로 로드하고 요청을 처리한 후 프레임은 해당 템플릿 파일을 선택하여 렌더링하고 HTML 페이지의 형태로 응답을 반환합니다.논리를 다룰 때는 오류와 이상도 고려해야 한다.

1. MVC 프레임워크로서 전체 영역을 통솔하는 유일한 포털 파일이 있어야 합니다.모든 접근 요청은 먼저 내 프레임 루트 디렉터리의 index.ph와 같은 포털 파일로 들어갑니다.p,이 안에서 나는 기본 폴더 경로, 현재 환경을 정의하고 현재 환경에 따라 오류 보고 수준을 정의합니다.

2. PHP에 별도의 파일 로딩, require 및 inclu 사용de,모두 대상 파일의 내용을 현재 파일에 로드하고 require나 in을 바꿉니다.clude 문, require는 로딩이 들어오면 실행하는 것이고 include는 로딩이 들어오면 필요할 때 실행하는 것이고, 그들의 _once 구조는 모두 여러 번 쓸 때 한 번만 실행한다는 것을 의미합니다.

3. 프레임 내 설정변수 등은 전용 설정파일을 이용하여 저장하며, 여기서는 이를 본뜬다.TP의 배열 반환 방법에 따라 compileConf() 함수를 사용하여 배열을 해석합니다.배열의 키는 상수, 값은 배열의 값으로 정의됩니다

if (!function_exists('compile_conf')) {
    function compileConf($conf) {
        foreach ($conf as $key => $val) {
        if(is_array($val)){
             compileConf($val);
            }else{
            define($key, $val);
            }
        }
     }
 }
 compileConf(require_once CONF_PATH.'config.php');

네임스페이스와 자동 로드
왜 네임스페이스와 자모션 로딩은 같이 하면요?

하나의 PHP 프로젝트에서유별나게 많을 때, 유별명이 중복되면 혼동이 생긴다.어지럽고 같은 폴더 안에 같은 이름의 파일도 존재할 수 없기 때문에 네임스페이스와 폴더가 짝을 이뤄 등장한다.폴더는 하나의 상자이고 네임스페이스는 라벨과 같으며 상자는 라벨에 해당합니다.클래스를 정의할 때 다양한 클래스를 다른 상자로 각각 포장하고 해당 태그를 부착합니다.클래스를 자동으로 로드할 때 태그(이름 공간)에 따라 해당 상자(폴더)를 쉽게 찾은 다음 해당 클래스 파일을 찾을 수 있습니다.

자동 로딩과 같은 것은아는__autoload() 매직 함수,현재 경로에서 찾을 수 없는 개체를 인스턴스화할 때 자동으로 호출되며 들어오는 클래스 이름에 따라 해당 클래스 파일이 함수 내에 로드됩니다.

이제 우리 spl 많이 써요_autoload_register() 함수그것은 __autoload 함수의 기능을 대체하기 위해 여러 함수를 등록할 수 있으며, 우리는 매개 변수라는 함수를 가져오고 spl_autoload_register는 이 함수를 스택에 밀어넣고 현재 경로에서 찾을 수 없는 클래스를 인스턴스화할 때 시스템이 인스턴스화할 때까지 순차적으로 함수를 스택에서 호출합니다

spl_autoload_register('Sqier\Loader::autoLoad');

class Loader {
public static function autoLoad($class) {
    //만약 있다면, 클래스 맨 왼쪽에 있는 것을 제거한다\
    $class = ltrim($class, '\\');
    //클래스의 전체 경로 이름 가져오기
    $class_path = str_replace('\\', '/', $class) . EXT;
    if (file_exists(SYS_PATH . $class_path)) {
        include SYS_PATH . $class_path;
        return;
    }
    if (file_exists(APP_PATH . $class_path)) {
        include APP_PATH . $class_path;
        return;
    }
}

경로 선택
다음으로 라우팅이 있는데, 그 본질은 현재 정의된 글로벌 URL 패턴에 따라 적절한 방법을 선택하여 들어오는 URI를 분석하고 해당 클래스를 로드하고 해당 방법을 구현하는 것입니다

class Router {
public static $uri;

public static function bootstrap() {
    self::$uri = $_SERVER['REQUEST_URI'];
    switch (URL_MODE) {
        case 1: {
            self::rBoot();
            break;
        }
        default: {
            self::rBoot();
        }
    }
}

public static function rBoot() {
    $router = isset($_GET['r']) ? explode('/', $_GET['r']) : [
        'index',
        'index'
    ];
    $cName = 'Controller\\' . ucfirst($router[0]);
    $aName = isset($router[1]) ? strtolower($router[1]) . 'Action' : 'indexAction';
    $controller = new $cName();
    $controller->$aName();
    }
}

이렇게 하면 내가 주소 표시줄에 zbs.com/index.php?r=index/login을 입력하면 시스템에서 자동으로 /app/Controller/Index.php 아래의 login 메서드를 호출합니다.이렇게 간단한 루트를 완성했습니다

 

반응형

'개발 꿀팁 > PHP' 카테고리의 다른 글

PHPMVC 프레임워크 개발(상)  (0) 2022.10.19
PHP 구현 힙 정렬  (0) 2022.10.10
나만의 PHP 프레임워크 구축하기 (2)  (1) 2022.09.29
나만의 PHP 프레임워크 구축하기 (3)  (1) 2022.09.29
PHP 멀티프로세스 초탐  (1) 2022.09.29