PHP 프리미티브 형 (int, string, array ...)에 메소드를 생성합시다.
※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_
를 붙이는 것으로 회피해 정의할 수 있는 것 같습니다.
앞으로의 개발이 드러날 것 같습니다. 다시 한번 @ 야마미 씨, 감사합니다!
Reference
이 문제에 관하여(PHP 프리미티브 형 (int, string, array ...)에 메소드를 생성합시다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sukobuto/items/f105b3da03f988aefbdb
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
// 単なる文字列
$str = "foo bar hoge";
// 文字列を空白で分割して配列に...
// 条件で絞り込みつつ要素数を取得
echo $str
->split(' ')
->filter(function($x) {
return $x->contains('o');
})
->length();
// ... 2
$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_
를 붙이는 것으로 회피해 정의할 수 있는 것 같습니다.
앞으로의 개발이 드러날 것 같습니다. 다시 한번 @ 야마미 씨, 감사합니다!
Reference
이 문제에 관하여(PHP 프리미티브 형 (int, string, array ...)에 메소드를 생성합시다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sukobuto/items/f105b3da03f988aefbdb
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
cd /usr/local/src
git clone https://github.com/nikic/scalar_objects.git
cd scalar_objects
phpize && ./configure && make && make install
<?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');
( @ 야마미 씨 제공 정보를 바탕으로 추기 편집)
처음에는 플러그인을 만들 필요가 있다고 생각했지만 그런 것은 없었던 것 같습니다.
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_
를 붙이는 것으로 회피해 정의할 수 있는 것 같습니다.앞으로의 개발이 드러날 것 같습니다. 다시 한번 @ 야마미 씨, 감사합니다!
Reference
이 문제에 관하여(PHP 프리미티브 형 (int, string, array ...)에 메소드를 생성합시다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/sukobuto/items/f105b3da03f988aefbdb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)