PSR-4 예
以下是一个实现PSR-4规范的例子:
Closure Example
<code><span><?php</span><span>/** * 一个具体项目实现的例子. * 使用SPL注册了autoload函数之后,以下代码将触发autoload函数从 * /path/to/project/src/Baz/Qux.php 文件加载 * \Foo\Bar\Baz\Qux 类 * new \Foo\Bar\Baz\Qux; * *<span> @param</span> string $class The fully-qualified class name. *<span> @return</span> void */</span> spl_autoload_register(<span><span>function</span><span>(<span>$class</span>)</span> {</span><span>// 项目约定的命名空间前缀</span><span>$prefix</span> = <span>'Foo\\Bar\\'</span>; <span>// 命名空间前缀的基础目录</span><span>$base_dir</span> = <span>__DIR__</span> . <span>'/src/'</span>; <span>// 这个类是否使用了命名空间前缀?</span><span>$len</span> = strlen(<span>$prefix</span>); <span>if</span> (strncmp(<span>$prefix</span>, <span>$class</span>, <span>$len</span>) !== <span>0</span>) { <span>// 没有,尝试下个已注册的 autoloader</span><span>return</span>; } <span>// 获取相对类名(截取命名空间前缀后剩下的部分)</span><span>$relative_class</span> = substr(<span>$class</span>, <span>$len</span>); <span>// 用base目录替换命名空间前缀;</span><span>// 用目录分隔符替换命名空间分隔符;</span><span>// 坠上 .php</span><span>$file</span> = <span>$base_dir</span> . str_replace(<span>'\\'</span>, <span>'/'</span>, <span>$relative_class</span>) . <span>'.php'</span>; <span>// 如果文件存在,加载文件。</span><span>if</span> (file_exists(<span>$file</span>)) { <span>require</span><span>$file</span>; } });</code>
Class Example
以下是一个处理多命名空间的类的例子。
<code><span><?php</span><span>namespace</span><span>Example</span>; <span>/** * 这个例子是一个针对 一个命名空间前缀对应多个base谬的通用实现。 * * foo-bar 类的包分别在以下路径下... * * /path/to/packages/foo-bar/ * src/ * Baz.php # Foo\Bar\Baz * Qux/ * Quux.php # Foo\Bar\Qux\Quux * tests/ * BazTest.php # Foo\Bar\BazTest * Qux/ * QuuxTest.php # Foo\Bar\Qux\QuuxTest * * ... 以下代码将类文件的路径添加到 \Foo\Bar\命名空间前缀下。 * * <span><?php</span> * // 初始化 loader * $loader = new \Example\Psr4AutoloaderClass; * * // 注册 autoloader * $loader->register(); * * // 为命名空间前缀注册base目录。 * $loader->addNamespace('Foo\Bar', '/path/to/packages/foo-bar/src'); * $loader->addNamespace('Foo\Bar', '/path/to/packages/foo-bar/tests'); * * 下面的代码将触发 autoloader 尝试从 * /path/to/packages/foo-bar/src/Qux/Quux.php 加载 * \Foo\Bar\Qux\Quux 类: * * <span><?php</span> * new \Foo\Bar\Qux\Quux; * * 以下代码触发autoloader尝试从 * /path/to/packages/foo-bar/tests/Qux/QuuxTest.php * 加载\Foo\Bar\Qux\QuuxTest类 : * * <span><?php</span> * new \Foo\Bar\Qux\QuuxTest; */</span><span><span>class</span><span>Psr4AutoloaderClass</span> {</span><span>/** * An associative array where the key is a namespace prefix and the value * is an array of base directories for classes in that namespace. * *<span> @var</span> array */</span><span>protected</span><span>$prefixes</span> = <span>array</span>(); <span>/** * Register loader with SPL autoloader stack. * *<span> @return</span> void */</span><span>public</span><span><span>function</span><span>register</span><span>()</span> {</span> spl_autoload_register(<span>array</span>(<span>$this</span>, <span>'loadClass'</span>)); } <span>/** * Adds a base directory for a namespace prefix. * *<span> @param</span> string $prefix The namespace prefix. *<span> @param</span> string $base_dir A base directory for class files in the * namespace. *<span> @param</span> bool $prepend If true, prepend the base directory to the stack * instead of appending it; this causes it to be searched first rather * than last. *<span> @return</span> void */</span><span>public</span><span><span>function</span><span>addNamespace</span><span>(<span>$prefix</span>, <span>$base_dir</span>, <span>$prepend</span> = false)</span> {</span><span>// normalize namespace prefix</span><span>$prefix</span> = trim(<span>$prefix</span>, <span>'\\'</span>) . <span>'\\'</span>; <span>// normalize the base directory with a trailing separator</span><span>$base_dir</span> = rtrim(<span>$base_dir</span>, DIRECTORY_SEPARATOR) . <span>'/'</span>; <span>// initialize the namespace prefix array</span><span>if</span> (<span>isset</span>(<span>$this</span>->prefixes[<span>$prefix</span>]) === <span>false</span>) { <span>$this</span>->prefixes[<span>$prefix</span>] = <span>array</span>(); } <span>// retain the base directory for the namespace prefix</span><span>if</span> (<span>$prepend</span>) { array_unshift(<span>$this</span>->prefixes[<span>$prefix</span>], <span>$base_dir</span>); } <span>else</span> { array_push(<span>$this</span>->prefixes[<span>$prefix</span>], <span>$base_dir</span>); } } <span>/** * Loads the class file for a given class name. * *<span> @param</span> string $class The fully-qualified class name. *<span> @return</span> mixed The mapped file name on success, or boolean false on * failure. */</span><span>public</span><span><span>function</span><span>loadClass</span><span>(<span>$class</span>)</span> {</span><span>// the current namespace prefix</span><span>$prefix</span> = <span>$class</span>; <span>// work backwards through the namespace names of the fully-qualified</span><span>// class name to find a mapped file name</span><span>while</span> (<span>false</span> !== <span>$pos</span> = strrpos(<span>$prefix</span>, <span>'\\'</span>)) { <span>// retain the trailing namespace separator in the prefix</span><span>$prefix</span> = substr(<span>$class</span>, <span>0</span>, <span>$pos</span> + <span>1</span>); <span>// the rest is the relative class name</span><span>$relative_class</span> = substr(<span>$class</span>, <span>$pos</span> + <span>1</span>); <span>// try to load a mapped file for the prefix and relative class</span><span>$mapped_file</span> = <span>$this</span>->loadMappedFile(<span>$prefix</span>, <span>$relative_class</span>); <span>if</span> (<span>$mapped_file</span>) { <span>return</span><span>$mapped_file</span>; } <span>// remove the trailing namespace separator for the next iteration</span><span>// of strrpos()</span><span>$prefix</span> = rtrim(<span>$prefix</span>, <span>'\\'</span>); } <span>// never found a mapped file</span><span>return</span><span>false</span>; } <span>/** * Load the mapped file for a namespace prefix and relative class. * *<span> @param</span> string $prefix The namespace prefix. *<span> @param</span> string $relative_class The relative class name. *<span> @return</span> mixed Boolean false if no mapped file can be loaded, or the * name of the mapped file that was loaded. */</span><span>protected</span><span><span>function</span><span>loadMappedFile</span><span>(<span>$prefix</span>, <span>$relative_class</span>)</span> {</span><span>// are there any base directories for this namespace prefix?</span><span>if</span> (<span>isset</span>(<span>$this</span>->prefixes[<span>$prefix</span>]) === <span>false</span>) { <span>return</span><span>false</span>; } <span>// look through base directories for this namespace prefix</span><span>foreach</span> (<span>$this</span>->prefixes[<span>$prefix</span>] <span>as</span><span>$base_dir</span>) { <span>// replace the namespace prefix with the base directory,</span><span>// replace namespace separators with directory separators</span><span>// in the relative class name, append with .php</span><span>$file</span> = <span>$base_dir</span> . str_replace(<span>'\\'</span>, <span>'/'</span>, <span>$relative_class</span>) . <span>'.php'</span>; <span>// if the mapped file exists, require it</span><span>if</span> (<span>$this</span>->requireFile(<span>$file</span>)) { <span>// yes, we're done</span><span>return</span><span>$file</span>; } } <span>// never found it</span><span>return</span><span>false</span>; } <span>/** * If a file exists, require it from the file system. * *<span> @param</span> string $file The file to require. *<span> @return</span> bool True if the file exists, false if not. */</span><span>protected</span><span><span>function</span><span>requireFile</span><span>(<span>$file</span>)</span> {</span><span>if</span> (file_exists(<span>$file</span>)) { <span>require</span><span>$file</span>; <span>return</span><span>true</span>; } <span>return</span><span>false</span>; } }</span></span></code>
Unit Tests
The following example is one way of unit testing the above class loader:
<code><span><?php</span><span>namespace</span><span>Example</span>\<span>Tests</span>; <span><span>class</span><span>MockPsr4AutoloaderClass</span><span>extends</span><span>Psr4AutoloaderClass</span> {</span><span>protected</span><span>$files</span> = <span>array</span>(); <span>public</span><span><span>function</span><span>setFiles</span><span>(array <span>$files</span>)</span> {</span><span>$this</span>->files = <span>$files</span>; } <span>protected</span><span><span>function</span><span>requireFile</span><span>(<span>$file</span>)</span> {</span><span>return</span> in_array(<span>$file</span>, <span>$this</span>->files); } } <span><span>class</span><span>Psr4AutoloaderClassTest</span><span>extends</span> \<span>PHPUnit_Framework_TestCase</span> {</span><span>protected</span><span>$loader</span>; <span>protected</span><span><span>function</span><span>setUp</span><span>()</span> {</span><span>$this</span>->loader = <span>new</span> MockPsr4AutoloaderClass; <span>$this</span>->loader->setFiles(<span>array</span>( <span>'/vendor/foo.bar/src/ClassName.php'</span>, <span>'/vendor/foo.bar/src/DoomClassName.php'</span>, <span>'/vendor/foo.bar/tests/ClassNameTest.php'</span>, <span>'/vendor/foo.bardoom/src/ClassName.php'</span>, <span>'/vendor/foo.bar.baz.dib/src/ClassName.php'</span>, <span>'/vendor/foo.bar.baz.dib.zim.gir/src/ClassName.php'</span>, )); <span>$this</span>->loader->addNamespace( <span>'Foo\Bar'</span>, <span>'/vendor/foo.bar/src'</span> ); <span>$this</span>->loader->addNamespace( <span>'Foo\Bar'</span>, <span>'/vendor/foo.bar/tests'</span> ); <span>$this</span>->loader->addNamespace( <span>'Foo\BarDoom'</span>, <span>'/vendor/foo.bardoom/src'</span> ); <span>$this</span>->loader->addNamespace( <span>'Foo\Bar\Baz\Dib'</span>, <span>'/vendor/foo.bar.baz.dib/src'</span> ); <span>$this</span>->loader->addNamespace( <span>'Foo\Bar\Baz\Dib\Zim\Gir'</span>, <span>'/vendor/foo.bar.baz.dib.zim.gir/src'</span> ); } <span>public</span><span><span>function</span><span>testExistingFile</span><span>()</span> {</span><span>$actual</span> = <span>$this</span>->loader->loadClass(<span>'Foo\Bar\ClassName'</span>); <span>$expect</span> = <span>'/vendor/foo.bar/src/ClassName.php'</span>; <span>$this</span>->assertSame(<span>$expect</span>, <span>$actual</span>); <span>$actual</span> = <span>$this</span>->loader->loadClass(<span>'Foo\Bar\ClassNameTest'</span>); <span>$expect</span> = <span>'/vendor/foo.bar/tests/ClassNameTest.php'</span>; <span>$this</span>->assertSame(<span>$expect</span>, <span>$actual</span>); } <span>public</span><span><span>function</span><span>testMissingFile</span><span>()</span> {</span><span>$actual</span> = <span>$this</span>->loader->loadClass(<span>'No_Vendor\No_Package\NoClass'</span>); <span>$this</span>->assertFalse(<span>$actual</span>); } <span>public</span><span><span>function</span><span>testDeepFile</span><span>()</span> {</span><span>$actual</span> = <span>$this</span>->loader->loadClass(<span>'Foo\Bar\Baz\Dib\Zim\Gir\ClassName'</span>); <span>$expect</span> = <span>'/vendor/foo.bar.baz.dib.zim.gir/src/ClassName.php'</span>; <span>$this</span>->assertSame(<span>$expect</span>, <span>$actual</span>); } <span>public</span><span><span>function</span><span>testConfusion</span><span>()</span> {</span><span>$actual</span> = <span>$this</span>->loader->loadClass(<span>'Foo\Bar\DoomClassName'</span>); <span>$expect</span> = <span>'/vendor/foo.bar/src/DoomClassName.php'</span>; <span>$this</span>->assertSame(<span>$expect</span>, <span>$actual</span>); <span>$actual</span> = <span>$this</span>->loader->loadClass(<span>'Foo\BarDoom\ClassName'</span>); <span>$expect</span> = <span>'/vendor/foo.bardoom/src/ClassName.php'</span>; <span>$this</span>->assertSame(<span>$expect</span>, <span>$actual</span>); } }</span></code>
以上就介绍了PSR-4 实例,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

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

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

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

뜨거운 주제











Win11XboxGameBar를 완전히 제거하는 방법은 무엇입니까? Xbox GameBar는 시스템과 함께 제공되는 게임 플랫폼입니다. 게임 녹화, 스크린샷 및 소셜 기능을 위한 도구를 제공하지만 메모리를 많이 차지하고 제거하기가 쉽지 않습니다. 안돼요. 완전히 제거하는 방법은 아래에서 소개해드리겠습니다. 방법 1. Windows 터미널 사용 1. [Win+X] 키 조합을 누르거나 [마우스 오른쪽 버튼 클릭] 작업 표시줄의 [Windows 시작 메뉴]를 클릭하고 나타나는 메뉴 항목에서 [터미널 관리자]를 선택합니다. 2. 사용자 계정 컨트롤 창에서 이 앱이 장치를 변경할 수 있도록 허용하시겠습니까? [예]를 클릭하세요. 3. 다음 명령을 실행합니다: Get-AppxP

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

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

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

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

Safari 아이콘을 사용하여 MacTouchBar에서 "TouchID 로그인" 문제 해결 Touch Bar를 강제로 다시 시작하면 문제가 해결됩니다. Mac에서 /Applications/Utilities 폴더에 있는 ActivityMonitor를 열거나 Command+스페이스바를 눌러 Spotlight를 사용할 수 있습니다. ActivityMonitor를 입력하고 돌아가서 실행합니다. Activity Monitor의 검색 기능을 사용하고 "Touch"를 검색합니다. "TouchBarServer"를 선택한 다음 Activity Monitor 도구 모음에서 (X) 종료 버튼을 클릭합니다. 강제로 종료하려면 "강제 종료"를 선택합니다.

Vue 오류: v-bind를 사용하여 클래스와 스타일을 올바르게 바인딩할 수 없습니다. 어떻게 해결합니까? Vue 개발에서는 클래스와 스타일을 동적으로 바인딩하기 위해 v-bind 지시문을 사용하는 경우가 많지만, 클래스와 스타일을 바인딩하기 위해 v-bind를 올바르게 사용하지 못하는 등의 문제가 발생할 수도 있습니다. 이번 글에서는 이 문제의 원인을 설명하고 해결 방법을 알려드리겠습니다. 먼저 v-bind 지시어를 이해해 봅시다. v-bind는 V를 바인딩하는 데 사용됩니다.

jquery가 요소에 클래스가 있는지 확인하는 방법: 1. "hasClass('classname')" 메서드를 통해 요소에 특정 클래스가 있는지 확인합니다. 2. "is('.classname)을 통해 요소에 특정 클래스가 있는지 확인합니다. ')" 방법.
