인프런 커뮤니티 질문&답변

차무송님의 프로필 이미지
차무송

작성한 질문수

PHP 7+ 프로그래밍: 객체지향

18 - 표준 PHP 라이브러리 (SPL)

autoloading error 질문입니다.

작성

·

225

0

고생하십니다. 새해 복 많이 받으세요 선생님. 

코드는 다음과 같습니다.

<?php

/**
 * Classes Autoloading (PSR-4)
 */

// include './Classes/MyClass.php';

use Classes\MyClass;


spl_autoload_register(function ($classname) {
  include $classname . '.php';
});

new MyClass();

디렉토리 구조는 

/Users/chamusong/Desktop/php-oop/functions/SPL/4

Classes-MyClass.php         index.php

이렇게 되어있습니다.

오류내용은 다음과 같습니다.

PHP Warning:  include(Classes\MyClass.php): failed to open stream: No such file or directory in /Users/chamusong/Desktop/php-oop/functions/SPL/4/index.php on line 13
PHP Stack trace:
PHP   1. {main}() /Users/chamusong/Desktop/php-oop/functions/SPL/4/index.php:0
PHP   2. spl_autoload_call($class_name = 'Classes\\MyClass') /Users/chamusong/Desktop/php-oop/functions/SPL/4/index.php:16
PHP   3. {closure:/Users/chamusong/Desktop/php-oop/functions/SPL/4/index.php:12-14}($classname = 'Classes\\MyClass') /Users/chamusong/Desktop/php-oop/functions/SPL/4/index.php:16
PHP Warning:  include(): Failed opening 'Classes\MyClass.php' for inclusion (include_path='.:/opt/homebrew/Cellar/php@7.4/7.4.27/share/php@7.4/pear') in /Users/chamusong/Desktop/php-oop/functions/SPL/4/index.php on line 13
PHP Stack trace:
PHP   1. {main}() /Users/chamusong/Desktop/php-oop/functions/SPL/4/index.php:0
PHP   2. spl_autoload_call($class_name = 'Classes\\MyClass') /Users/chamusong/Desktop/php-oop/functions/SPL/4/index.php:16
PHP   3. {closure:/Users/chamusong/Desktop/php-oop/functions/SPL/4/index.php:12-14}($classname = 'Classes\\MyClass') /Users/chamusong/Desktop/php-oop/functions/SPL/4/index.php:16
PHP Fatal error:  Uncaught Error: Class 'Classes\MyClass' not found in /Users/chamusong/Desktop/php-oop/functions/SPL/4/index.php:16
Stack trace:
#0 {main}
  thrown in /Users/chamusong/Desktop/php-oop/functions/SPL/4/index.php on line 16

오류내용을 보면 경로의 문제인 것 같기도 합니다. 

 

답변 2

1

정상우님의 프로필 이미지
정상우
지식공유자

안녕하세요. 경로가 문제라는 사실을 이미 알고계시기 때문에 따로 답변을 드릴 내용이 사실상 없습니다. 다시 한 번 체크해보실 필요가 있습니다. 아래의 코드는 제가 테스트해본 것입니다. 폴더구조와 MyClass.php 에 정의된 네임스페이스도 올바르게 선언되어 있는지 확인해보시기 바랍니다.

 

Directory Tree

Project (Directory)

└ Classes

    └ MyClass.php

└ index.php

 

Classes/MyClass.php

namespace Classes;

class MyClass 
{
}

index.php

use Classes\MyClass;

spl_autoload_register(function ($classname) {
    include $classname . '.php';
});

new MyClass();
차무송님의 프로필 이미지
차무송
질문자

선생님 깃 허브 파일로 예제를 돌려봐도 같은 오류가 나옵니다.

이러면 제 환경이 맥이라서 그런 것 같기도 한데 더 찾아보겠습니다

0

차무송님의 프로필 이미지
차무송
질문자

추측이지만 맥 환경과 윈도우 환경의 디렉토리 참조자가 달라서 그런 것 같습니다.

<?php

/**
 * Classes Autoloading (PSR-4)
 */

// include './Classes/MyClass.php';

use \Classes\MyClass;


/* spl_autoload_register(function ($classname) {
  var_dump($classname);
  include $classname . '.php';
}); */
spl_autoload_register(function ($classname) {
  include './' . str_replace('\\', '/', $classname . '.php');
});

$myc = new MyClass();
$myc->foo();

위와 같이 replace를 통해 "\" 문자를 "/"로 변경 후 include한 결과 잘 됐는데 원래 의도한 동작과 일치하는 지 궁금합니다. 

정상우님의 프로필 이미지
정상우
지식공유자

 해결하신 방안이 맞습니다. 제가 환경문제를 고려하지 못했군요. :)

차무송님의 프로필 이미지
차무송
질문자

답변해주셔서 감사합니다. 강의 항상 잘 듣고 있습니다. 

차무송님의 프로필 이미지
차무송

작성한 질문수

질문하기