PHP SPL 버 려 진 보석[SPL 응용 에 대한 분석]
Rafael Dohms 위의 글 은 나 를 놀 라 게 하고 참 지 못 하고 번역 하 는 동시에 일부 내용 을 보충 했다.
SPL,PHP 표준 라 이브 러 리(Standard PHP Library),PHP 5.0 부터 내 장 된 구성 요소 와 인터페이스,그리고 PHP 5.3 에서 점점 성숙 해 졌 습 니 다.SPL 은 사실 모든 PHP 5 개발 환경 에 내장 되 어 있 으 며 어떠한 설정 도 필요 하지 않 습 니 다.
많은 PHP 개발 자 들 이 그것 을 거의 사용 하지 않 았 고 심지어 들 어 본 적 이 없 는 것 같다.그 원인 을 따 져 보면,그것 의 양춘 백설 같은 설명 문 서 를 추론 하여,너 로 하여 금 그것 의 존 재 를 소홀히 하 게 할 수 있다.SPL 이라는 보석 은 철 다 니 의'바다의 마음'처럼 바다 밑 으로 가라앉는다.지금 은 우리 에 게 건 져 내 고 그 위 치 를 차지 해 야 한 다 는 것 도 이 글 이 표현 하고 자 하 는 관점 이다.
그렇다면 SPL 은 무엇 을 제공 합 니까?
SPL 은 Array Access,Countable,Seekable Iterator 등 PHP 엔진 을 확장 하여 배열 형식 으로 대상 을 조작 하 는 데 사용 합 니 다.또한 RecursiveIterator,Array Obejcts 등 다른 교체 기 를 사용 하여 데이터 교체 작업 을 할 수 있다.
Exceptions,SplObserver,Spltorage 및 splaputoadregister,splclases,iterator apply 등의 도움말 함수(helper functions)를 내장 하여 해당 하 는 기능 을 다시 불 러 옵 니 다.
이 도구 들 을 한데 모 으 는 것 은 다기 능 스위스 군 도 를 잘 사용 하면 질 적 으로 PHP 의 코드 효율 을 높 일 수 있다.그렇다면 우 리 는 어떻게 그 위력 을 발휘 할 것 인가?
자동 로 더 를 다시 불 러 옵 니 다.
만약 당신 이 교과서 적 프로그래머 라면,includes/requires 조작 타성 불 러 오기 에 대응 하 는 클래스 를 대체 하 는 방법
__autoload
을 알 아 보 겠 습 니 다.그 렇 죠?그러나 오 랜 시간 동안 당신 은 이미 곤경 에 빠 졌 다 는 것 을 알 게 될 것 입 니 다.먼저,당신 의 클래스 파일 이 지정 한 파일 경로 에 있어 야 한 다 는 것 을 보증 해 야 합 니 다.예 를 들 어 Zend 프레임 워 크 에서''을 사용 해 야 합 니 다.클래스,방법 이름 을 나 눕 니 다.
또 다른 문 제 는 프로젝트 가 점점 복잡 해 지면
__autoload
안의 논리 도 상응 하 게 복잡 해진 다 는 것 이다.마지막 으로 이상 판단 을 넣 고 불 러 오 는 모든 논 리 를 그대로 기록 할 수도 있다.계란 은 한 바구니 에 넣 으 면 안 된다 는 것 을 잘 알 고 있 으 며 SPL 을 이용 하여 분리
__autoload
의 불 러 오 는 논 리 를 사용 할 수 있다.당신 의 autoload 함 수 를 쓰 고 SPL 에서 제공 하 는 함 수 를 이용 하여 다시 불 러 오기 만 하면 됩 니 다.예 를 들 어 상기 Zend 프레임 워 크 의 문 제 는 Zend loader 에 대응 하 는 방법 을 다시 불 러 올 수 있 습 니 다.해당 하 는 클래스 를 찾 지 못 하면 이전에 정 의 된 함 수 를 사용 하 십시오.
<?php
class MyLoader {
public static function doAutoload($class) {
// autoload
}
}
spl_autoload_register( array('MyLoader', 'doAutoload') );
?>
보시 다시 피spl_autoload_register
여러 개의 불 러 오 는 논 리 를 배열 로 추가 할 수 있 습 니 다.또한spl_autoload_unregister
더 이상 필요 하지 않 은 불 러 오 는 논 리 를 제거 할 수 있 습 니 다.이 기능 은 항상 사용 할 수 있 습 니 다.교체 기
교 체 는 흔히 볼 수 있 는 디자인 모델 중 하나 로 한 그룹의 데이터 에 보편적으로 응용 되 는 통 일 된 반복 작업 이다.SPL 은 데이터 형식 에 대응 하 는 모든 교체 기 를 제공 했다 고 해도 과언 이 아니다.
목록 을 옮 겨 다 니 는 아주 좋 은 사례 가 있 습 니 다.일반적인 방법 은
scandir
을 사용 한 다음 에'와'...',그리고 다른 조건 에 만족 하지 않 는 파일 을 건 너 뛰 는 것 이다.예 를 들 어 어떤 디 렉 터 리 를 옮 겨 다 니 며 그림 파일 을 추출 하려 면 jpg,gif 의 끝 여 부 를 판단 해 야 합 니 다.다음 코드 는 SPL 의 교체 기 를 사용 하여 지정 한 디 렉 터 리 의 그림 파일 을 찾 는 예 입 니 다.
<?php
class RecursiveFileFilterIterator extends FilterIterator {
//
protected $ext = array('jpg','gif');
/**
* $path
*/
public function __construct($path) {
parent::__construct(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)));
}
/**
*
*/
public function accept() {
$item = $this->getInnerIterator();
if ($item->isFile() &&
in_array(pathinfo($item->getFilename(), PATHINFO_EXTENSION), $this->ext)) {
return TRUE;
}
}
}
//
foreach (new RecursiveFileFilterIterator('/path/to/something') as $item) {
echo $item . PHP_EOL;
}
?>
너 는 이것 이 더 많은 코드 를 써 서 같은 일 을 처리 하 는 것 이 아니 냐 고 말 할 수 있 을 것 이다.그럼 위의 코드 를 보면 고도 로 재 활용 되 고 테스트 할 수 있 는 코드 를 가지 고 있 지 않 습 니까?)다음은 SPL 이 제공 하 는 다른 교체 기 입 니 다.
RecursiveIterator
RecursiveIteratorIterator
OuterIterator
IteratorIterator
FilterIterator
RecursiveFilterIterator
ParentIterator
SeekableIterator
LimitIterator
GlobIterator
CachingIterator
RecursiveCachingIterator
NoRewindIterator
AppendIterator
RecursiveIteratorIterator
InfiniteIterator
RegexIterator
RecursiveRegexIterator
EmptyIterator
RecursiveTreeIterator
ArrayIterator
PHP 5.3 부터 다른 교체 기 가 내 장 됩 니 다.전통 코드 를 만 드 는 습관 을 바 꿀 수 있 을 지도 모른다 고 생각 합 니 다.
SplFixedArray
SPL 에는 SplFixedArray 를 사용 하여 고정 길이 의 배열 을 예화 할 수 있 는 일련의 배열 작업 도구 도 내장 되 어 있다.그럼 이 걸 왜 써 요?그것 은 더 빠 르 고 심지어 당신 의 월급 문제 와 관련 이 있 기 때 문 입 니 다.)
우 리 는 PHP 의 일반적인 배열 이 숫자,문자열 등 다양한 종류의 키 를 포함 하고 길 이 는 가 변 적 이라는 것 을 알 고 있다.바로 이러한'고급 기능'때문에 PHP 는 해시(hash)방식 으로 키 를 통 해 대응 하 는 값 을 얻 을 수 있 습 니 다.사실은 이것 은 특정한 상황 에서 성능 문 제 를 일 으 킬 수 있 습 니 다.
SplFixedArray 는 고정된 숫자 키 를 사용 하기 때문에 해시 저장 방식 을 사용 하지 않 습 니 다.정확히 말 하면 C 배열 이 라 고 생각 할 수도 있다.이것 이 바로 SplFixedArray 가 일반 배열 보다 빠 른 이유 입 니 다(PHP 5.3 에서 만).
그것 이 얼마나 빠 른 지 아래 의 그룹 데 이 터 는 당신 에 게 그 결말 을 엿 볼 수 있 습 니 다.
만약 당신 이 대량의 배열 작업 이 필요 하 다 면,그것 이 믿 을 만하 다 고 믿 어 보 세 요.
데이터 구조
또한 SPL 은 데이터 구조의 기본 유형의 실현 도 제공 했다.비록 우 리 는 전통 적 인 변수 유형 으로 데이터 구 조 를 묘사 할 수 있 지만,예 를 들 어 스 택(Strack)을 배열 로 묘사 한 다음 에 해당 하 는 방식 으로 pop 과 push
arraypop()
,arraypush()
를 사용 할 수 있 지만,항상 조심해 야 한다.왜냐하면 그들 은 데이터 구 조 를 묘사 하 는 데 전문 적 으로 사용 되 는 것 이 아니 기 때문에 한 번 의 오 작 동 으로 이 스 택 을 파괴 할 수 있 기 때문이다.반면 SPL 의 SplStack 대상 은 엄 격 히 스 택 형식 으로 데 이 터 를 설명 하고 이에 대응 하 는 방법 을 제공한다.또한 이러한 코드 는 특정한 배열 이 아 닌 스 택 을 조작 하고 있다 는 것 을 이해 하여 동료 들 이 해당 하 는 코드 를 잘 이해 하고 더욱 빠 를 수 있 을 것 입 니 다.
마지막 으로 위 와 같은 창백 한 예 가 부족 할 수도 있 습 니 다.실천 은 참된 지식 을 낳는다.SPL 이 더 많 고 더 강 한 기능 은 스스로 발굴 해 야 한다.보석 처럼 천천히 조각 해 야 빛 을 발 할 수 있다.
더 많은 PHP 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
본 논문 에서 말 한 것 이 여러분 의 PHP 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
laravel에 yo에서 angularJs&coffeescript를 사용할 수 있도록 한다.먼저 yo 명령을 사용할 수 있어야하므로 아래에서 설치 global에 설치한 곳에서 laravel의 프로젝트 루트로 이동. 클라이언트 코드를 관리하는 디렉토리를 만들고 이동합니다. 클라이언트 환경 만들기 이것으로 히...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.