2014-07-13 4 views
0

Ok !!! 이제, 나는 왜 spl_autoload_register()가 클래스를로드 할 수 없는지에 대한 실마리가 떨어진다.namespace 사용시 PHP spl_autoload_register가 require scope로 클래스를로드 할 수 없습니다

내 폴더 구조는 다음과 같다 ..

  • 애플리케이션

    • 제어기
      • 시스템
  • welcome.php

    • 핵심
      • BaseController.php
      • Load.php
  • index.php를

내 BaseController.php 코드

<?php 
namespace system\core; 

class BaseController { 
    public function __construct() { 
     spl_autoload_register(array($this, 'loader')); 
    } 

    private function loader($className) {    
     $className = ltrim($className, '\\'); 
     $fileName = ''; 
     $namespace = ''; 
     if ($lastNsPos = strrpos($className, '\\')) { 
      $namespace = substr($className, 0, $lastNsPos); 
      $className = substr($className, $lastNsPos + 1); 
      $fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR; 
     } 
     $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php'; 

     require $fileName; 
    } 
} 

내 Load.php 코드

<?php 
namespace system\core; 

class Load { 
    public function view() 
    { 
     echo "Method for loading view"; 
    } 
} 

내 welcome.php 코드

<?php 
class Welcome extends system\core\BaseController { 
    public function index() 
    { 
     $obj_load = new Load(); 
     $obj_load->view(); 
    } 
} 

내 index.php에 코드

이 코드를 실행하고있어
<?php 
error_reporting(E_ALL); 
ini_set('display_errors', '1'); 

require_once "system/core/BaseController.php"; 
require_once "application/controller/welcome.php"; 
$welcome = new welcome(); 
echo $welcome->index(); 

(index.php) 다음 오류가 발생했습니다 ...

Fatal error: Class 'Load' not found in /var/www/nut/test/application/controller/welcome.php on line 5 

하지만 Load.php에서 네임 스페이스를 제거하면 오류가 발생하지 않습니다. 왜 네임 스페이스 (Load.php에서 사용)가 오류를 생성하는지 이해할 수 없습니다.

어떤 생각 ...

감사합니다 마크가 언급 한 바와 같이 귀하의 파일을 포함 할 때, 잘못된 문자를 사용하는

+0

클래스 이름은'system \ core \ Load'입니다. 당신은''system/core/'.$ className을로드하려고 시도하고있다. '.php ';'는'system/core/system \ core \ Load.php'라는 파일로 평가됩니다 .... –

+0

오토로더는 클래스 이름의 분리 기호를 폴더 분리 기호로 변환해야합니다. –

+0

@ MarkBaker이 링크에 표시된대로 PHP- 그림 예제 코드를 사용하여 오토로더 코드를 제거했습니다.> http://www.php-fig.org/psr/psr-0/ 그래도 여전히 나는 같은 오류가 나타납니다. – mi6crazyheart

답변

1

. This 페이지는 더 명확하게해야합니다.

편집 : 코드에 실수가 많이 있습니다. 네임 스페이스의 전체적인 점은 올바르게 선언해야한다는 것입니다. (제대로 선언 했음에도 불구하고 두 가지를 모두 수행하지 못했습니다. 따라서 자동로드 코드가 작동하지 않습니다.) 또한 자동로드 코드는 실행 한 이후로 실행할 기회가 없었습니다. 처음에는로드되지 않는 클래스에 대한 생성자 내부에 숨겨져 있습니다. 이 시도 :

index.php를

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', '1'); 

require_once("system/core/AutoLoader.php"); 
$welcome = new \application\controller\welcome(); 
echo $welcome->index(); 

에 오신 것을 환영합니다.시스템 \ 코어 \ 자동 로더 : PHP는

<?php 

namespace application\controller; 

class welcome extends \system\core\BaseController { 
    public function index() 
    { 
     $obj_load = new \system\core\Load(); 
     return $obj_load->view(); 
    } 
} 

Load.php

<?php 
namespace system\core; 

class Load { 
    public function view() 
    { 
     return "Method for loading view"; 
    } 
} 

BaseController.php

<?php 
namespace system\core; 

class BaseController { 
// public function __construct() { 
//  spl_autoload_register(array($this, 'loader')); 
// } 
// 
// private function loader($className) { 
//  $className = ltrim($className, '\\'); 
//  $fileName = ''; 
//  $namespace = ''; 
//  if ($lastNsPos = strrpos($className, '\\')) { 
//   $namespace = substr($className, 0, $lastNsPos); 
//   $className = substr($className, $lastNsPos + 1); 
//   $fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR; 
//  } 
//  $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php'; 
// 
//  require $fileName; 
// } 
} 

새 파일 (소문자 클래스 이름과 네임 스페이스를 추가 할 수 있습니다) .php

<?php 

namespace system\core; 

class AutoLoader { 

    static public function loader($className) { 
     $className = ltrim($className, '\\'); 
     $fileName = ''; 
     $namespace = ''; 
     if ($lastNsPos = strrpos($className, '\\')) { 
      $namespace = substr($className, 0, $lastNsPos); 
      $className = substr($className, $lastNsPos + 1); 
      $fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR; 
     } 
     $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php'; 

     require $fileName; 
    } 

} 

spl_autoload_register(array('\system\core\AutoLoader', 'loader')); 

또한 코드를 이미 index.php 안에 echo하고 있기 때문에 문자열을 반환하는 대신 코드를 변경했습니다.

+0

필자는이 링크에 표시된대로 PHP-FIG 예제 코드를 사용하여 오토로더 코드를 제거했습니다.> http://www.php-fig.org/psr/psr-0/ 그래도 여전히 동일한 오류가 나타납니다. . – mi6crazyheart

+0

알겠습니다. 약간의 수업을 배웠다. 빠른 응답에 감사합니다. – mi6crazyheart

관련 문제