>백엔드 개발 >PHP 튜토리얼 >PHP SPL 애플리케이션에 대한 간략한 분석

PHP SPL 애플리케이션에 대한 간략한 분석

不言
不言원래의
2018-04-20 13:16:473089검색

이 글에서는 주로 PHP SPL의 응용을 소개하고, 매우 중요하지만 잘 알려지지 않은 SPL의 기능과 관련 운용 기술을 예제로 분석해 도움이 필요한 친구들이 참고할 수 있습니다.

이 글의 예제는 PHP SPL의 응용 방법을 설명합니다. PHP SPL. 자세한 내용은 다음과 같습니다.

Rafael Dohms 위 기사가 너무 놀라서 번역과 내용을 동시에 추가할 수밖에 없었습니다.

SPL, PHP 표준 라이브러리(표준 PHP 라이브러리), PHP 5.0부터 내장된 구성 요소 및 인터페이스이며 PHP5.3부터 점차 성숙해졌습니다. SPL은 실제로 모든 PHP5 개발 환경에 내장되어 있으며 설정이 필요하지 않습니다.

많은 PHP 개발자들이 기본적으로 사용하지 않거나 들어본 적도 없는 것 같습니다. 그 이유는 "그 존재"를 무시하게 만드는 눈과 같은 문서로 거슬러 올라갈 수 있습니다. SPL 이 보석은 바다 밑바닥에 가라앉은 타이타닉의 "Heart of the Ocean"과 같습니다. 이제 우리는 그것을 집어들고 올바른 위치에 착용해야 하며 이것이 이 글에서 표현된 관점이다.

그럼, SPL은 무엇을 제공하나요?

SPL은 배열 형태로 개체를 조작하는 데 사용되는 ArrayAccess, Countable SeekableIterator 과 같은 인터페이스로 PHP 엔진을 확장합니다. 동시에 RecursiveIterator, ArrayObjects 및 기타 반복자를 사용하여 데이터를 반복할 수도 있습니다.

또한 해당 기능을 오버로드하기 위해 Exceptions, SplObserver, Spltorage splautoloadregister, splclasses, iteratorapply 등과 같은 여러 개체에 대한 내장 도우미 기능이 있습니다.

이러한 도구를 함께 사용하면 다기능 스위스 군용 칼과 같습니다. 이를 잘 활용하면 PHP 코드 효율성을 질적으로 향상시킬 수 있습니다. 그렇다면 어떻게 그 힘을 발휘할 수 있을까요?

오버로드 자동 로더

"교과서 프로그래머"라면 __autoload를 사용하여 __autoload 去代替 includes/requires 操作惰性载入对应的类,对不?

但久之,你会发现你已经陷入了困境,首先是你要保证你的类文件必须在指定的文件路径中,例如在 Zend 框架中你必须使用「_」来分割类、方法名称(你如何解决这一问题?)。

另外的一个问题,就是当项目变得越来越复杂, __autoload 内的逻辑也会变得相应的复杂。到最后,甚至你会加入异常判断,以及将所有的载入类的逻辑如数写到其中。

大家都知道「鸡蛋不能放到一个篮子中」,利用 SPL 可以分离 __autoload 的载入逻辑。只需要写个你自己的 autoload 函数,然后利用 SPL 提供的函数重载它。

例如上述 Zend 框架的问题,你可以重载 Zend loader 对应的方法,如果它没有找到对应的类,那么就使用你先前定义的函数。


<?php
class MyLoader {
  public static function doAutoload($class) {
    // 本模块对应的 autoload 操作
  }
}
spl_autoload_register( array(&#39;MyLoader&#39;, &#39;doAutoload&#39;) );
?>


正如你所见, spl_autoload_register 还能以数组的形式加入多个载入逻辑。同时,你还可以利用spl_autoload_unregister 移除已经不再需要的载入逻辑,这功能总会用到的。

迭代器

迭代是常见设计模式之一,普遍应用于一组数据中的统一的遍历操作。可以毫不夸张的说,SPL 提供了所有你需要的对应数据类型的迭代器。

有个非常好的案例就是遍历目录。常规的做法就是使用 scandir includes

/

requires

를 대체하여 해당 지연 로딩 클래스를 작동하는 방법을 확실히 알 수 있습니다. , 오른쪽?


그러나 시간이 지나면서 문제에 빠졌음을 알게 될 것입니다. 먼저 클래스 파일이 지정된 파일 경로에 있어야 합니다. 예를 들어 Zend 프레임워크에서는 클래스를 구분하기 위해 "_"를 사용해야 합니다. 및 메소드 이름(이 문제를 해결하는 방법은 무엇입니까?)

또 다른 문제는 프로젝트가 점점 더 복잡해짐에 따라 __autoload 내의 논리도 이에 따라 복잡해진다는 것입니다. 결국에는 예외 판단을 추가하고 여기에 클래스를 로드하는 모든 논리를 작성하게 됩니다.

"계란은 한 바구니에 담을 수 없다"는 것은 누구나 알고 있습니다. SPL을 사용하면 __autoload 의 로딩 로직을 분리할 수 있습니다. 자동 로드 기능을 직접 작성하고 SPL에서 제공하는 기능을 사용하여 오버로드하면 됩니다.

예를 들어 위에서 언급한 Zend 프레임워크 문제에서 Zend 로더의 해당 메서드를 오버로드할 수 있습니다. 해당 클래스를 찾지 못하면 이전에 정의한 함수를 사용하게 됩니다.

<?php
class RecursiveFileFilterIterator extends FilterIterator {
  // 满足条件的扩展名
  protected $ext = array(&#39;jpg&#39;,&#39;gif&#39;);
  /**
   * 提供 $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(&#39;/path/to/something&#39;) as $item) {
  echo $item . PHP_EOL;
}
?>
🎜🎜🎜🎜보시다시피 spl_autoload_register는 배열 형태로 여러 로딩 로직을 추가할 수도 있습니다. 동시에 spl_autoload_unregister를 사용하여 더 이상 필요하지 않은 로딩 로직을 제거할 수도 있습니다. 이 기능은 항상 사용됩니다. 🎜🎜🎜Iterator🎜🎜🎜Iteration은 일반적인 디자인 패턴 중 하나이며 일반적으로 데이터 세트의 통합 순회 작업에 사용됩니다. SPL이 해당 데이터 유형에 필요한 모든 반복자를 제공한다고 해도 과언이 아닙니다. 🎜🎜아주 좋은 예는 디렉토리 순회입니다. 일반적인 접근 방식은 scandir 를 사용한 다음 "." 및 ".." 및 조건을 충족하지 않는 다른 파일을 건너뛰는 것입니다. 예를 들어, 이미지 파일을 추출하기 위해 디렉터리를 탐색해야 하는 경우 해당 파일이 jpg 또는 gif로 끝나는지 확인해야 합니다. 🎜🎜다음 코드는 지정된 디렉터리에서 이미지 파일을 찾기 위해 위의 재귀를 수행하기 위해 SPL의 반복자를 사용하는 예입니다. 🎜🎜🎜🎜rrreee🎜🎜🎜🎜이것은 동일한 작업을 수행하는 데 더 많은 코드를 소비하지 않는다고 말할 수 있습니다. 무엇? 위의 코드를 보면 재사용성과 테스트성이 뛰어난 코드가 있지 않나요? :)🎜🎜🎜SPL에서 제공하는 다른 반복자는 다음과 같습니다.🎜🎜

RecursiveIterator
RecursiveIteratorIterator
OuterIterator
IteratorIterator
FilterIterator
RecursiveFilterIterator
ParentIterator
SeekableIterator
LimitIterator
GlobIterator
CachingIterator
RecursiveCachingIterator
NoRewindIterator
AppendIterator
RecursiveIteratorIterator
InfiniteIterator
RegexIterator
RecursiveRegexIterator
EmptyIterator
RecursiveTreeIterator
ArrayIterator

PHP5.3부터 이제부터 더 많은 반복자가 내장될 것입니다. 시도해 볼 수 있을 것 같습니다. 아마도 전통적인 코드 작성 습관이 바뀔 것입니다.

SplFixedArray

SPL에는 일련의 배열 조작 도구도 내장되어 있습니다. 예를 들어 SplFixedArray를 사용하여 고정 길이 배열을 인스턴스화할 수 있습니다. 그렇다면 왜 사용합니까? 더 빠르기 때문에 급여에도 영향을 미칩니다 :)

PHP 일반 배열에는 숫자, 문자열 등과 같은 다양한 유형의 키가 포함되어 있고 길이가 가변적이라는 것을 알고 있습니다. PHP가 해시를 사용하여 키를 통해 해당 값을 얻는 것은 바로 이러한 "고급 기능" 때문입니다. 실제로 이는 특정 상황에서 성능 문제를 일으킬 수 있습니다.

SplFixedArray는 고정 숫자 키를 사용하므로 해시 저장소를 사용하지 않습니다. 정확히는 아니지만 C 배열이라고 생각할 수도 있습니다. 이것이 SplFixedArray가 일반 배열보다 빠른 이유입니다(PHP5.3에서만).

얼마나 빠른지 다음 데이터 세트를 통해 엿볼 수 있습니다.

배열 작업이 많이 필요한 경우 시도해 볼 수 있으므로 신뢰할 수 있다고 믿습니다.

데이터 구조

동시에 SPL은 몇 가지 기본 유형의 데이터 구조 구현도 제공합니다. 배열을 사용하여 스택을 설명하고(Strack) 해당하는 방법인 pop 및 push(arraypop()arraypush())를 사용하는 것과 같이 전통적인 변수 유형을 사용하여 데이터 구조를 설명할 수 있지만 항상 주의해야 합니다. 데이터 구조를 설명하는 데 특별히 사용되지 않습니다. 잘못된 작업으로 인해 스택이 파괴될 수 있습니다.

SPL의 SplStack 객체는 데이터를 스택 형태로 엄격하게 기술하고 그에 상응하는 메소드를 제공합니다. 동시에 이러한 코드는 배열이 아닌 스택에서 작동한다는 사실도 이해할 수 있어야 하며, 이를 통해 동료는 해당 코드를 더 잘 이해할 수 있고 속도가 더 빨라질 것입니다.

마지막으로 위의 빈약한 예만으로는 SPL을 사용하도록 "유인"하기에는 충분하지 않을 수 있습니다. 연습은 진정한 지식을 가져다주며, SPL의 점점 더 강력한 기능을 직접 탐구해야 합니다. 보석처럼 천천히 깎아야 비로소 그 광채를 발산할 수 있습니다.





위 내용은 PHP SPL 애플리케이션에 대한 간략한 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.