개발 꿀팁/PHP

PHP 연쇄 조작은 call과 callstatic 마술 기법을 통해 실현되고 phpstorm은 주석을 통해 function을 추적한다

Jammie 2022. 9. 20. 16:41
반응형

PHP 연쇄 조작은 call과 callstatic 마술 기법을 통해 실현되고 phpstorm은 주석을 통해 function을 추적한다.
사용하기 전에 우리는 먼저 call과 callstatic의 용법을 알아본다.
call이 현재 클래스에서 존재하지 않는 메서드를 탐지하면 call 메서드가 호출됩니다
callstatic이 현재 클래스에서 존재하지 않는 정적 메서드를 감지하면 callstatic을 호출합니다

callstatic 사용 예

코드 조각 1

<?php

namespace rely;

/**
* Class Init
* @package rely
* @author Mr.taochuang mtaochuang@163.com>
* @date 2019/7/310:34
*
* 의존 패킷 기반 클래스
*
* @method \rely\init\Dataswitch dataswitch( ) static 데이터 처리 클래스
* @method \rely\init\Regex regex( ) static 정규 관리 라이브러리
* @method \rely\init\File file( ) static 문자서류 처리
* @method \rely\init\Config config($confi)g=[]) static 설정 클래스
* @method \rely\curl\Dliver curl($config=[]) static curl 요청유
* @method \rely\encry\Rsarsa($config=[]) static Rsa 암호화
* @method \rely\encry\Custom encry( ) static 사용자 지정 암호화
* @method \rely\encry\Aes aes($config=[]) staticaes 암호화
* @method \rely\cache\Redis redis($config)=[]) static redis캐시 메커니즘
* @method \rely\cache\File cache($config=)[]) static 파일 캐시 메커니즘
* @method \rely\alg\Business business_alg() static 업무 알고리즘
* @method \rely\Init\Http http( ) static htp 처리 클래스
* @method \rely\alg\Email email( ) static 메일 발송 클래스
*
*/
class Init {

public static function __callStatic($c)lass, $arguments)
{
return (new \Re)flectionClass(Facad)e::bind($class))->newInstanceArgs($arguments);
}

}

코드 조각 2 (첫 번째 코드 조각 보조)

<?php

namespace rely;

use rely\alg\Email;
use rely\init\File;
use rely\cache\File as Cache;
use rely\cache\Redis;
use rely\curl\Driver as Curl;
use rely\encry\Aes;
use rely\encry\Rsa;
use rely\encry\Custom;
use rely\init\Http;
use rely\init\Regex;
use rely\init\Config;
use rely\init\Dataswitch;
use rely\alg\Business;

class Facade
{
    /**
     * 컨테이너 바인딩 ID
     */
    private static $bind = [
        'dataswitch' => Dataswitch::class,
        'config' => Config::class,
        'curl'=>Curl::class,
        'rsa'=>Rsa::class,
        'encry'=>Custom::class,
        'aes'=>Aes::class,
        'regex'=>Regex::class,
        'redis'=>Redis::class,
        'cache'=>Cache::class,
        'file'=>File::class,
        'business_alg'=>Business::class,
        'email'=>Email::class,
        'http'=>Http::class
    ];

    /**
     * @param $class
     * @return mixed
     * @throws \Exception
     * 라이브러리 바인딩
     */
    public static function bind($class)
    {
        if (empty(self::$bind[$class]) || !class_exists(self::$bind[$class])) throw new \Exception('Class does not exist');
        return self::$bind[$class];
    }
}

이 Init 라이브러리 사용 방법

<?php
 use rely/Init;
 Init::dataswitch()->toArray();

call방법과 callstatic사용은 기본적으로 유사하며, 많이 설명되지 않는다

왜 이렇게 쓰는지 설명해드릴게요

존재하지 않는 메서드에 정적으로 접근하면 callstatic 메서드가 트리거됩니다(첫 번째).매개 변수가 존재하지 않는 메서드 이름, 두 번째 참조이 메서드를 호출하기 위해 전달된 매개 변수)

우리가 안에 있는 조작법을 보면 return에 현재 클래스 라이브러리가 존재하지 않는 것이 있습니다.인스턴스 클래스를 만들고 매개 변수를 이 실제에 가져옵니다.힘류, 즉 이 dataswitch류
Facade라는 라이브러리에서 클래스 라이브러리 위치를 호출해야 하는 바인딩을 완료했습니다

Facade::bind($class)

존재하지 않는 dataswitch 메서드를 해당 dataswitch 클래스 라이브러리에 매핑합니다. 실제로 이 callstatic이 수행하는 작업은

마스터 클래스 라이브러리 액세스 -> callstatic 실행 및 작업하는 클래스 라이브러리 바인딩 -> 이러한 라이브러리에서 캡슐화된 메서드 호출 -> 결과 출력

이렇게 하면 하나의 주 클래스 라이브러리를 통해 여러 클래스 라이브러리의 메서드를 호출할 수 있으며, 체인 작업을 통해 더 나은 참조 방법 및 여러 클래스 라이브러리를 관리할 수 있습니다.

phpstorm은 코드를 추적하는 기능이 있는데 어떻게 추적할 수 있을까.

 * @method \rely\alg\Email email() static 메일 발송 클래스
method는 메서드를 찾습니다. 첫 번째 필드는 메서드의 위치, 두 번째 필드는 메서드 이름, 세 번째 필드는 어떤 유형의 메서드인지, 마지막 노트는 직접 메모할 수 있습니다

이렇게 하면 phpstorm을 통해 내가 호출하려는 방법이 있는 곳을 추적할 수 있다

실제로 call과 callstatic은 일련의 체인 작업을 수행하기 위해메인 클래스 라이브러리를 통해 여러 클래스 라이브러리의 참조를 실현할 수 있습니다. 우리는 더 간단한 코드를 통해 더 많은 작업을 수행할 수 있습니다. 우리의 코드를 정돈하고, 유지 보수하고, 더 빠르게 사용할 수 있습니다

 

반응형