PHP 프리미티브 형 (int, string, array ...)에 메소드를 생성합시다.

9704 단어 PHPPhpStorm
example

※PHP extension이 도입할 수 있는 환경(Web 서버 관리 권한 등)이 필요합니다

할 수 있는 일



자바 스크립트 프로토 타입 확장 및 C# 확장 메서드와 같이 string 및 array와 같은 PHP 프리미티브 형식에 메서드를 자유롭게 추가 할 수 있습니다.

방법을 살리면 화려하게 키마
// 単なる文字列
$str = "foo bar hoge";

// 文字列を空白で分割して配列に...
// 条件で絞り込みつつ要素数を取得
echo $str
    ->split(' ')
    ->filter(function($x) {
        return $x->contains('o');
    })
    ->length();
    // ... 2 

메소드 체인을 할 수 있는 것과 할 수 없는 것과는, 코드에 담을 수 있는 의도의 밀도가 전혀 다릅니다.
덧붙여서 같은 코드를 원소의 PHP로 쓰면 이렇게 됩니다↓

더 이상 이런 코드를 쓰고 싶지 않아 ...
$str = "foo bar hoge";
$arr = explode(' ', $str);
$arr = array_filter(function($x) {
    return false !== strpos($x, 'o');
}, $arr);
echo count($arr);

글자수 늘어나, 정보량 줄인다. 주어가 보이기 힘들다…

할 수 없는 일



PHP 구문에 반할 수 없기 때문에 JavaScript와 같이 문자열 리터럴이나 배열 리터럴을 객체로 취급 할 수 없습니다.

이렇게 쓸 수 없다.
$arr = "foo bar hoge"->split(' ');
$arr = ("foo bar hoge")->split(' ');
$str = ["foo","bar","hoge"]->join(',');

추기: PHP7 에서는 위의 기법도 사용할 수 있는 것 같습니다.

방법



scalar_objects 라는 PHP extension을 사용합니다.

설치



유닉스


cd /usr/local/src
git clone https://github.com/nikic/scalar_objects.git
cd scalar_objects
phpize && ./configure && make && make install

php.ini 에 extension=scalar_objects.so 라고 추가하면 설치 완료입니다.
제대로 로드할 수 있는지는 phpinfo() 에서 확인할 수 있습니다.

Windows



사용중인 PHP 버전에 적합한 Windows 용 DLL을 다운로드하고 PHP 설치 폴더의 ext/ 폴더에 넣으십시오.

php.ini 에 extension=php_scalar_objects.dll 라고 추가하면 설치 완료입니다.

메소드 추가



다음과 같이 의사 클래스에 메소드를 구현해 register_primitive_type_handler 에 의해 원시적형에 등록합니다.

본가에서는 Handler 라고 표현하고 있습니다만, C# 의 확장 메소드와 개념과 쓰는 방법이 가깝기 때문에 Extension 로서 써 보겠습니다.

extensions.php
<?php

// string 型の拡張メソッド群
class StringExtension {

    public static function split($self, $delimiter)
    {
        // 文字列値は第一引数 $self として渡される
        return explode($delimiter, $self);
    }

    public static function contains($self, $value)
    {
        return false !== strpos($self, $value);
    }
}

// 配列の拡張メソッド群
class ArrayExtension {

    public static function filter($self, $callback)
    {
        // 配列は第一引数 $self として渡される
        return array_filter($callback, $self);
    }

    public static function length($self)
    {
        return count($self);
    }
}

// string に StringExtension を登録
register_primitive_type_handler('string', 'StringExtension');

// 配列に ArrayExtension を登録
register_primitive_type_handler('array', 'ArrayExtension');

이것을 include 하는 것으로, 서두와 같이 쓸 수 있게 됩니다.

Phalcon 등의 프레임워크로 사용하는 경우는, loader.php 등의 적절한 장소에서 register_primitive_type_handler 를 호출해 버리면 좋을 것입니다.

사족 : 가장 강한 IDE PhpStorm으로 확장 방법을 보완하려면



( @ 야마미 씨 제공 정보를 바탕으로 추기 편집)
처음에는 플러그인을 만들 필요가 있다고 생각했지만 그런 것은 없었던 것 같습니다.

string, array 의 확장 메소드를 보완해 주려면 , 동 프로젝트내의 어딘가에 다음과 같이 쓴 PHP 파일을 넣거나 PHP 외부 라이브러리로서 읽어들이는 것만으로 OK입니다.
물론 StringExtension 클래스등을 기술한 파일내에 써도 문제 없습니다.

mixin_extensions.php
<?php

/**
 * Interface string
 * @mixin StringExtension
 */
interface string {}

/**
 * Interface array
 * @mixin ArrayExtension
 */
interface PS_UNRESERVE_PREFIX_array {}

mixin 은 PHP 로 말하는 트레이트에 가까운 의미를 가집니다. 즉 "string 은 StringExtension 의 특징을 가집니다"라고 PhpStorm 에게 가르치는 것이군요.array 는 예약어이지만 PS_UNRESERVE_PREFIX_ 를 붙이는 것으로 회피해 정의할 수 있는 것 같습니다.

앞으로의 개발이 드러날 것 같습니다. 다시 한번 @ 야마미 씨, 감사합니다!

좋은 웹페이지 즐겨찾기