'Fatal error: Class'...'not found'에 빠졌을 때의 검사 5가지

11276 단어 PHP
학급을 찾지 못하는 오류인'파탈 error:Class'○○'not found'가 발생했을 때 전형적인 원인과 대응 방법을 검사 목록 형식으로 소개한다.

vendor/autoload.require php 중입니까?

composer install에 필요한 프로그램 라이브러리를 설치하고 사용하려면 Fatal이 됩니다.예: 설치guzzlehttp/guzzle
composer require guzzlehttp/guzzle
main.php로 GuzzleHttp\Client 코드 쓰기
main.php
<?php
$client = new GuzzleHttp\Client();
그것을 실행해 보면'Unceaught Error:Class'Guzle Http\Client'not found'라고 불린다.
실행 결과
❯ php main.php
PHP Fatal error:  Uncaught Error: Class 'GuzzleHttp\Client' not found in /Users/suin/Desktop/myapp/main.php:2
Stack trace:
#0 {main}
  thrown in /Users/suin/Desktop/myapp/main.php on line 2

Fatal error: Uncaught Error: Class 'GuzzleHttp\Client' not found in /Users/suin/Desktop/myapp/main.php:2
Stack trace:
#0 {main}
  thrown in /Users/suin/Desktop/myapp/main.php on line 2
대응법:vender/autoad.require php
이런 상황에서 단순한vendor/autoad.php를 읽는 것을 잊어버려서 읽어야 합니다.
main.php
<?php
require 'vendor/autoload.php'; // この行を追加
$client = new GuzzleHttp\Client();

composer.json에 대한 autoload 정의를 잊지 않았습니까?


일부 항목new은 디렉토리에 항목 범주를 저장하고 패키지를 사용합니다.이런 포장 이름을 해결하려면composier가 필요합니다.json에 autoad 디렉터리를 설명해야 합니다.
예를 들어 다음과 같은 autoload 지시가 없는 상태에서
composer.json
{
    "name": "suin/myapp",
    "require": {
        "guzzlehttp/guzzle": "^6.3"
    }
}
다음 항목의 독립 클래스
src/Application.php
<?php

namespace MyApp;

class Application
{
}
main.php 등 클라이언트 코드를 사용해도
main.php
<?php
require 'vendor/autoload.php';
$app = new MyApp\Application();
Compooser의 클래스 로더에서 클래스를 찾을 수 없으며 Fatal 오류가 발생합니다.
실행 결과
❯ php main.php
PHP Fatal error:  Uncaught Error: Class 'MyApp\Application' not found in /Users/suin/Desktop/myapp/main.php:3
Stack trace:
#0 {main}
  thrown in /Users/suin/Desktop/myapp/main.php on line 3

Fatal error: Uncaught Error: Class 'MyApp\Application' not found in /Users/suin/Desktop/myapp/main.php:3
Stack trace:
#0 {main}
  thrown in /Users/suin/Desktop/myapp/main.php on line 3
대응법.json에 autoad 디렉터리 추가
composer.json에 autoolad 지시가 추가되었는지 확인하십시오.
composer.json
{
    "name": "suin/myapp",
    "require": {
        "guzzlehttp/guzzle": "^6.3"
    },
    // ここ↓
    "autoload": {
        "psr-4": {
            "MyApp\\": "src/"
        }
    }
}
그리고 그것을 추가하면 실행src,autoload.php 관련 파일을 다시 생성하십시오.
❯ composer dumpautoload
Generating autoload files

vendor/composer/autoload_*.php의 내용이 최신인가요?


팀에서 개발한vendor 디렉터리가gitignore 등 버전 관리 외에 있으면 클래스 마운트 맵에서 최신 버전을 잃어버릴 수 있습니다.vendor의 내용을 관리하는 버전이라면 이 검사를 건너뛸 수 있습니다.
대응 방법:composier dupautoload로 클래스 마운트의 지도를 최신으로 설정composer dumpautoloadvendor/composier/autoad*.php의 내용을 최신으로 바꾸세요.
❯ composer dumpautoload
Generating autoload files
겸사겸사 말씀드리지만,composier.json의 autoload 디렉터리를 통해 psr-0, psr-4 등 불러오는 방법을 설정할 수 있습니다. 여기에 설정된 내용은 composer dumpautoload부터vender/composier/autoroad*입니다.php 파일 그룹에 반영됩니다.
예를 들어 다음의composier.json
composer.json
{
    "name": "suin/myapp",
    "require": {
        "guzzlehttp/guzzle": "^6.3"
    },
    "autoload": {
        "psr-4": {
            "MyApp\\": "src/"
        }
    }
}
composer dumpautoload 실행 후 아래 맵 정보를 생성합니다.composer dumpautoload의 선언에 주의하세요.이것은 'MyApp\\' => array($baseDir . '/src') 가방의 종류를 MyApp 목록에 있는 지도 정보입니다.
vendor/composer/autoload_psr4.php
<?php

// autoload_psr4.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'),
    'MyApp\\' => array($baseDir . '/src'),
    'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'),
    'GuzzleHttp\\Promise\\' => array($vendorDir . '/guzzlehttp/promises/src'),
    'GuzzleHttp\\' => array($vendorDir . '/guzzlehttp/guzzle/src'),
);

맞춤법 오류가 있습니까?


흔히 볼 수 있는 것은 클래스 이름과 이름 공간의 맞춤법 오류입니다.
대응 방법: 맞춤법 오류 여부를 일일이 확인
  • 대문자 소문자 맞나요?
  • 단복수 형식에 오류가 있습니까?
  • 타자 오류가 있습니까?
  • 클래스 이름과 파일 이름이 같습니까?
  • 가방 이름과 이름 공간 이름이 같습니까?
  • 목시 확인뿐만 아니라 클래스 이름을 클래스 정의에서 클라이언트 코드로 복제하고 클래스 정의에서 클래스 파일 이름으로 복제하는 등 오류가 발생하지 않도록 반복해야 한다.눈만 보면 새어.

    현재 작업 디렉터리는 실행 환경입니까?


    현재 당신이 수정한 파일은 실제로 실행 중인 파일이 아닐 수도 있습니다.변경한 반은 사실상 다른 항목의 이름이 같은 반일 수 있습니다.같은 항목에서도 다른 포장의 동명 종류일 수 있다.탭 편집기에도 포장과 경로가 숨겨져 있기 때문에 이런 오류를 알아차리기 어렵다.

    처리 방법: 편집기와 다른 방법(CLI)으로 이중 검사
    편집기에서만 보면'다른 파일을 완전히 바꿨다'는 것을 깨닫는 데 시간이 오래 걸리기 때문에 우선 명령줄에서 파일 시스템이 변경 사항을 충분히 반영했는지 확인해 보세요.
  • src에서 PHP를 실행하는 장소가 예상 장소인지 확인합니다.
  • pwd에서 클래스 파일이 있는지 확인합니다.

  • 변경 사항이 파일 시스템에 저장되었는지 lscat에서 확인합니다.
  • cat 명령을 통해 확인된 예시
    ❯ cat src/Application.php
    <?php
    
    namespace MyApp; // ネームスペースはあっていますか?
    
    class Application // クラス名はあっていますか?
    {
    }
    
    끝까지 읽어주셔서 감사합니다.트위터에는 Qita에 쓰지 않는 기술 문구도 있으니 편리하면 주목Twitter@suin

    좋은 웹페이지 즐겨찾기