三、 例子-PHP 튜토리얼-php.cn">
목차
一、简介" >一、简介
二、 自动加载类库介绍" >二、 自动加载类库介绍
三、 例子" >三、 例子

三、 例子

Jun 13, 2016 pm 12:12 PM
class function psr public

遵循PSR-4的自动加载

一、简介

  首先这里要了解PSR,Proposing a Standards Recommendation(提出标准建议)的缩写,就是一种PHP开发规范,让我们研发出来的代码更合理、更好维护、可读性更高。PSR有下面几个标准:

  •   PSR-0:自动加载
  •   PSR-1:基本代码规范
  •     PSR-2:代码样式
  •   PSR-3:日志接口
  •   PSR-4:规范自动加载的路径问题

  这里看出PSR的下标也是从0开始的,和数组还有点像~。其实PSR-4和PSR-0是有点相似甚至冗余的,他们都说明的是自动加载的规范,只不过PSR-4中的规范更加简洁,在PSR-0中下划线"_"是有特殊含义的,在autoload处理的时候需要将下划线转换为目录分隔符,而在PSR-4中下划线是没有任何特殊含义的,所以在文件自动加载的时候显得更加简洁、调理更加清楚。

  我对github上面的psr-4规范中的例子进行了大概的翻译(相信你们的英语水平一定比我好,肯定可以看懂^_^),然后以这个自动加载类库做了一个小小的例子,例子文件多、长,放在这里不太合适,所以我在博客中就大概介绍下这个例子,想要详细了解的可以去我的github主页去看这个例子。

二、 自动加载类库介绍

  首先看下自动加载类的大概内容:

<span style="color: #0000ff;">class</span><span style="color: #000000;"> Autoload  {    </span><span style="color: #008000;">//</span><span style="color: #008000;"> 注册自动加载函数到spl autoload栈中.</span>     <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> register();    </span><span style="color: #008000;">//</span><span style="color: #008000;"> 添加一个目录到一个命名空间前缀中</span>    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> addNamespace(<span style="color: #800080;">$prefix</span>, <span style="color: #800080;">$base_dir</span>, <span style="color: #800080;">$prepend</span>=<span style="color: #0000ff;">false</span><span style="color: #000000;">);    </span><span style="color: #008000;">//</span><span style="color: #008000;"> 自动加载函数,会在$this->register中用到</span>    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> loadClass(<span style="color: #800080;">$class</span><span style="color: #000000;">);    </span><span style="color: #008000;">//</span><span style="color: #008000;"> 寻找映射的文件</span>    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> loadMappedFile(<span style="color: #800080;">$prefix</span>, <span style="color: #800080;">$relative_class</span><span style="color: #000000;">);    </span><span style="color: #008000;">//</span><span style="color: #008000;">查看一个文件是否在文件系统中存在</span>    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> requireFile(<span style="color: #800080;">$file</span><span style="color: #000000;">);  }</span>
로그인 후 복사

  自动加载类库函数中就这几个函数,其中register()、addNamespace()、loadMappedFile()、requireFile()函数都比较简单,一看就懂,唯一一个可能需要解释下的函数就是loadClass函数,先看下loadClass()函数的代码:

<span style="color: #008080;"> 1</span>     <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> loadClass(<span style="color: #800080;">$class</span><span style="color: #000000;">)</span><span style="color: #008080;"> 2</span> <span style="color: #000000;">    {</span><span style="color: #008080;"> 3</span>         <span style="color: #008000;">//</span><span style="color: #008000;"> 当前的命名空间前缀</span><span style="color: #008080;"> 4</span>         <span style="color: #800080;">$prefix</span> = <span style="color: #800080;">$class</span><span style="color: #000000;">;</span><span style="color: #008080;"> 5</span>         <span style="color: #008080;"> 6</span>         <span style="color: #008000;">//</span><span style="color: #008000;">通过命名空间去查找对应的文件</span><span style="color: #008080;"> 7</span>         <span style="color: #0000ff;">while</span> (<span style="color: #0000ff;">false</span> !== <span style="color: #800080;">$pos</span> = <span style="color: #008080;">strrpos</span>(<span style="color: #800080;">$prefix</span>, '\\'<span style="color: #000000;">)) {</span><span style="color: #008080;"> 8</span>             <span style="color: #008080;"> 9</span>             <span style="color: #008000;">//</span><span style="color: #008000;"> 可能存在的命名空间前缀</span><span style="color: #008080;">10</span>             <span style="color: #800080;">$prefix</span> = <span style="color: #008080;">substr</span>(<span style="color: #800080;">$class</span>, 0, <span style="color: #800080;">$pos</span> + 1<span style="color: #000000;">);</span><span style="color: #008080;">11</span> <span style="color: #008080;">12</span>             <span style="color: #008000;">//</span><span style="color: #008000;"> 剩余部分是可能存在的类</span><span style="color: #008080;">13</span>             <span style="color: #800080;">$relative_class</span> = <span style="color: #008080;">substr</span>(<span style="color: #800080;">$class</span>, <span style="color: #800080;">$pos</span> + 1<span style="color: #000000;">);</span><span style="color: #008080;">14</span> <span style="color: #008080;">15</span>             <span style="color: #008000;">//</span><span style="color: #008000;">试图加载prefix前缀和relitive class对应的文件</span><span style="color: #008080;">16</span>             <span style="color: #800080;">$mapped_file</span> = <span style="color: #800080;">$this</span>->loadMappedFile(<span style="color: #800080;">$prefix</span>, <span style="color: #800080;">$relative_class</span><span style="color: #000000;">);</span><span style="color: #008080;">17</span>             <span style="color: #0000ff;">if</span> (<span style="color: #800080;">$mapped_file</span><span style="color: #000000;">) {</span><span style="color: #008080;">18</span>                 <span style="color: #0000ff;">return</span> <span style="color: #800080;">$mapped_file</span><span style="color: #000000;">;</span><span style="color: #008080;">19</span> <span style="color: #000000;">            }</span><span style="color: #008080;">20</span> <span style="color: #008080;">21</span>             <span style="color: #008000;">//</span><span style="color: #008000;"> 移动命名空间和relative class分割位置到下一个位置</span><span style="color: #008080;">22</span>             <span style="color: #800080;">$prefix</span> = <span style="color: #008080;">rtrim</span>(<span style="color: #800080;">$prefix</span>, '\\'<span style="color: #000000;">);   </span><span style="color: #008080;">23</span> <span style="color: #000000;">        }</span><span style="color: #008080;">24</span>         <span style="color: #008080;">25</span>         <span style="color: #008000;">//</span><span style="color: #008000;"> 未找到试图加载的文件</span><span style="color: #008080;">26</span>         <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #000000;">;</span><span style="color: #008080;">27</span>     }
로그인 후 복사

  其实有疑惑的地方可能也只有一个,那就是为什么这里要循环着去试图查找文件,在while循环中,会慢慢的缩短命名空间前缀的名称去需找合适的命名空间前缀,为什么要这么做呢?

  循环查找文件是为了在命名空间中包含更多的内容,不用每次在父命名空间中新建一个文件夹的时候都去添加一个新的命名空间前缀,就像下面这个图中描述的那样:

  当一个文件在一个命名空间下的子目录下的时候,我们不用去新建命名空间前缀就可以成功加载需要的文件,维护命名空间前缀的数组内容更少,更好维护。相反的如果没有循环查找,就是下面这个样子的

  

  每次新建一个子目录就要去新加一个命名空间前缀,是不是很麻烦,但这样的话也有一定的好处,就是加载的时候不晕循环查找文件,可能会减小一定的时间消耗,但就是加载的时候有点麻烦。

  所以,用循环加载这种方式还是比较方便的,但是一定不能让没有命名空间前缀的目录层级太深,这样会消耗不必要的时间到文件加载上。当需要效率很高的时候,而我们的目录肯定又不会不确定,这个时候加载的时候去掉循环查找,而是为每个目录添加命名空间,效率可能会提高,只是我的一点愚见。

三、 例子

  说道这里你可能已经对自动加载的内容比较了解了,这个时候趁热打铁看看我准备的小例子,这里只是介绍下小例子的目录结构,由于比较简单,详细的内容就不再这里列了,感兴趣的通许可以去我的github主页看看这个例子

+autoload<br>    +core<br>        |_Autoload.php<br>    +vendor<br>        +test1<br>            |_hello.php<br>        +test2<br>            |_world.php<br>    |_App.php
로그인 후 복사

  本文版权归作者([email protected])和博客园共有,未经作者本人同意禁止任何形式的转载,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。

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

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Python에서 클래스와 메서드를 사용하는 방법 Python에서 클래스와 메서드를 사용하는 방법 Apr 21, 2023 pm 02:28 PM

클래스와 메소드의 개념과 인스턴스 클래스(Class): 동일한 속성과 메소드를 가진 객체의 컬렉션을 설명하는 데 사용됩니다. 컬렉션의 모든 개체에 공통적인 속성과 메서드를 정의합니다. 객체는 클래스의 인스턴스입니다. 메소드: 클래스에 정의된 함수입니다. 클래스 구성 메서드 __init__(): 클래스에는 클래스가 인스턴스화될 때 자동으로 호출되는 init()라는 특수 메서드(구성 메서드)가 있습니다. 인스턴스 변수: 클래스 선언에서 속성은 변수로 표시됩니다. 이러한 변수를 인스턴스 변수라고 합니다. 인스턴스화: 클래스의 특정 개체인 클래스의 인스턴스를 만듭니다. 상속: 즉, 파생 클래스(derivedclass)가 기본 클래스(baseclass)를 상속합니다.

기능은 무슨 뜻인가요? 기능은 무슨 뜻인가요? Aug 04, 2023 am 10:33 AM

함수는 특정 기능을 포함하는 재사용 가능한 코드 블록으로, 입력 매개변수를 받아들이고 특정 작업을 수행하며 결과를 반환하는 것이 목적입니다. 코드 재사용성과 유지 관리성을 향상시키는 코드입니다.

iOS 개발자 버전과 공개 버전의 차이점은 무엇인가요? iOS 개발자 버전과 공개 버전의 차이점은 무엇인가요? Mar 01, 2024 pm 12:55 PM

매년 Apple이 iOS 및 macOS의 새로운 주요 버전을 출시하기 전에 사용자는 몇 달 전에 베타 버전을 다운로드하여 먼저 경험할 수 있습니다. 소프트웨어는 대중과 개발자 모두가 사용하기 때문에 Apple은 개발자 베타 버전의 공개 베타 버전인 개발자 버전과 공개 버전을 모두 출시했습니다. iOS 개발자 버전과 공개 버전의 차이점은 무엇인가요? 말 그대로 개발자 버전은 개발자 베타 버전이고, 퍼블릭 버전은 퍼블릭 베타 버전이다. 개발자 버전과 공개 버전은 서로 다른 대상을 대상으로 합니다. 개발자 버전은 개발자가 테스트하기 위해 Apple에서 사용합니다. 다운로드하고 업그레이드하려면 Apple 개발자 계정이 필요합니다.

jQuery를 사용하여 요소의 클래스 이름 바꾸기 jQuery를 사용하여 요소의 클래스 이름 바꾸기 Feb 24, 2024 pm 11:03 PM

jQuery는 웹 개발에 널리 사용되는 클래식 JavaScript 라이브러리로, 이벤트 처리, DOM 요소 조작, 웹 페이지에서 애니메이션 수행과 같은 작업을 단순화합니다. jQuery를 사용할 때 요소의 클래스 이름을 바꿔야 하는 상황이 자주 발생합니다. 이 기사에서는 몇 가지 실용적인 방법과 구체적인 코드 예제를 소개합니다. 1. RemoveClass() 및 addClass() 메소드 사용 jQuery는 삭제를 위한 RemoveClass() 메소드를 제공합니다.

파이썬에서 클래스는 무엇을 의미합니까? 파이썬에서 클래스는 무엇을 의미합니까? May 21, 2019 pm 05:10 PM

클래스는 클래스를 정의하는 데 사용되는 키워드입니다. 클래스 뒤에 공백을 추가하고 클래스 이름을 추가합니다. 규칙: 첫 글자가 여러 개인 경우 카멜 표기법을 사용합니다. [class Dog()]와 같은 이름 지정.

SpringBoot가 사용자 정의 클래스 로더를 통해 클래스 파일을 암호화하고 보호하는 방법 SpringBoot가 사용자 정의 클래스 로더를 통해 클래스 파일을 암호화하고 보호하는 방법 May 11, 2023 pm 09:07 PM

배경 최근에는 jd-gui 등의 디컴파일 도구를 통해 엔지니어링 코드를 쉽게 복원하는 것을 방지하기 위해 회사 프레임워크에 대해 주요 비즈니스 코드를 암호화하고 있습니다. 관련 난독화 기법의 구성 및 사용이 상대적으로 복잡하고, springboot 프로젝트이므로 클래스 파일이 암호화된 후 사용자 정의 클래스로더가 해독되고 로드됩니다. 이 솔루션은 디컴파일의 난이도만 증가시키지만 전반적인 암호화 보호 흐름도는 표시되지 않습니다. 아래 그림에서 Maven 플러그인은 사용자 정의 Maven 플러그인을 사용하여 컴파일을 암호화하며, 암호화된 클래스 파일은 지정된 경로에 복사됩니다.

PHP 클래스 사용법에 대한 자세한 설명: 코드를 더 명확하고 읽기 쉽게 만듭니다. PHP 클래스 사용법에 대한 자세한 설명: 코드를 더 명확하고 읽기 쉽게 만듭니다. Mar 10, 2024 pm 12:03 PM

PHP 코드를 작성할 때 클래스를 사용하는 것은 매우 일반적인 관행입니다. 클래스를 사용하면 관련 함수와 데이터를 단일 단위로 캡슐화하여 코드를 더 명확하고, 읽기 쉽고, 유지 관리하기 쉽게 만들 수 있습니다. 이 기사에서는 PHPClass의 사용법을 자세히 소개하고 구체적인 코드 예제를 제공하여 독자가 실제 프로젝트에 클래스를 적용하여 코드를 최적화하는 방법을 더 잘 이해할 수 있도록 돕습니다. 1. 클래스 생성 및 사용 PHP에서는 클래스 키워드를 사용하여 클래스를 정의하고 클래스의 속성과 메서드를 정의할 수 있습니다.

Java에서 미리 정의된 클래스 객체의 메서드 Java에서 미리 정의된 클래스 객체의 메서드 Jul 01, 2023 pm 06:41 PM

기본 Java 유형(boolean, byte, char, short, int, long, float 및 double) 및 키워드 void도 Class 클래스의 booleanisPrimitive() 속성을 통해 Class 객체로 표시됩니다. 지정된 Class 객체가 나타내는지 여부를 결정합니다. 기본 유형. 래퍼 클래스 및 Void 클래스의 정적 TYPE 필드, Integer.TYPE==int.class;Integer.class==int.class; 배열 유형의 클래스 인스턴스 객체: Classclz=String[].class;

See all articles