>백엔드 개발 >PHP 튜토리얼 >PHP+SPL 적용 사례에 대한 자세한 설명

PHP+SPL 적용 사례에 대한 자세한 설명

php中世界最好的语言
php中世界最好的语言원래의
2018-05-16 15:23:482189검색

이번에는 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 去代替 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
GlobIt erator
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 객체는 데이터를 스택 형태로 엄격하게 기술하고 그에 상응하는 메소드를 제공합니다. 동시에 이러한 코드는 배열이 아닌 스택에서 작동한다는 사실도 이해할 수 있어야 하며, 이를 통해 동료는 해당 코드를 더 잘 이해할 수 있고 속도가 더 빨라질 것입니다.

이 기사의 사례를 읽은 후 방법을 마스터했다고 생각합니다. 더 흥미로운 정보를 보려면 PHP 중국어 웹사이트의 다른 관련 기사를 주목하세요!

추천 도서:

PHP에서 허프만 인코딩/디코딩을 구현하는 단계에 대한 자세한 설명

PHP 직접 삽입 정렬 사례 분석

위 내용은 PHP+SPL 적용 사례에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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