2017-10-16 6 views
0

오토로더 클래스를 작성했습니다.include_once를 사용할 때 범위를 벗어난 변수

그러나 include_once 함수에 필요한 파일이 없습니다.

Cls.php (경로 : CLS /)

<?php 
    class fileup{ 
    function dup($a){ 
     $x=strip_tags($a); 

     $d=__DIR__."/".$x.".cls.php"; 
     echo $d; ///storage/emulated/legacy/htdocs/yeni/sinif/ayar.sinif.php 
     if(file_exists($d)){ 
      include_once $d; 
     }else{ 
     die($a." Class not found :("); 
     } 
    } 
    } 
$dup=new fileup(); 
spl_autoload_register(array($dup,"dup")); 
?> 

Theme.cls.php 테마 클래스 (경로 : CLS /)

<?php 
    include_once("cls.php"); 
    $dup->dup("conf"); 
?> 

Conf.cls.php 사이트 설정 클래스 (경로 : CLS /)

<?php include_once("cls.php"); $dup->dup("db"); ?> 

index.php를 (경로 /)

,210

오류 정보 :

Fatal error: Uncaught Error: 
Call to a member function dup() on null in /storage/emulated/legacy/htdocs/yeni/sinif/conf.cls.php:3 
Stack trace: 
#0 /storage/emulated/legacy/htdocs/yeni/sinif/cls.php(12): 
**include_once() #1** 
/storage/emulated/legacy/htdocs/yeni/sinif/theme.cls.php(3): 
dup->dup('conf') #2 
/storage/emulated/legacy/htdocs/yeni/index.php(2): 
include_once('/storage/emulat...') #3 
{main} thrown in /storage/emulated/legacy/htdocs/yeni/sinif/conf.cls.php on line 3 
+1

자동 로딩을 사용해야하므로 자동 로딩을 사용하고 있지 않습니다. 오토로더 기능을 직접 호출하는 것은 의미가 없습니다. 코드에 더 많은 문제가 있지만이 문제에 들어가기 전에 기본 사항을 공부하는 데 조금 더 시간을 할애해야합니다. – yivi

+0

나는 이해한다. 그러나 나는 PHP를 배우기 때문에 에러를 이해할 수 없다. 어떻게 해결할 수 있을까? 어디에서 잘못된 코드 –

+1

을 볼 수 있습니다. 코드를 다시 작성하지 않습니다. 주제에 대한 기본적인 이해가 부족하다는 점에 대해 질 높은 질문을 할 수 있습니다.기본적으로 오토로더를 잘못 사용하면 자동 로더가 잘못 작성됩니다 (발견되지 않으면 죽지 않아야하며 다른 오토로더도 정상적으로 작동 할 수 있습니다). – yivi

답변

0

는 답을 쓰려고 아니었지만, 그래서 당신이 넘어 이동할 수 있습니다 추측 : 귀하의 문제는 자동 로더와 관련이없는,하지만 범위는 관련.

우선 $dupConf.cls.php에 정의하십시오. 다음 Theme.cls.php에이 파일이 포함되어 있으므로 이제 $dup이 정의됩니다.

이제이 포함 Conf.cls.php 포함 끝날 것이다 $dup->dup('Conf') 전화 : 당신이 include_once("cls.php"); 전화 첫 번째 줄에서

include_once("cls.php"); 
$dup->dup("conf"); 

,하지만 당신이 있기 때문에 이미 이전에이 파일을 포함 Theme.cls.php, 그것은 늘 다시 (당신이 한 번 에 결국 include_once, 강조를 사용하는) 포함 얻을이 시간 .

그리고이 클래스를 정의하고 인스턴스화하는 파일이 포함되어 있지 않기 때문에 Conf.cls.php에있는 동안 $dup은 정의되어 있지 않습니다 (예 : null).

$dup->dup("db");으로 전화하면 실제로는 null->dup("db");으로 전화를 걸려고 노력하는 것이 당연합니다.

가장 간단한 "수정"은 include_once 대신 include을 사용합니다.

너머의 오토로더 예제는 여러 의미에서 다소 틀립니다. 자신의 글을 쓰기 전에 조금 더 공부해야합니다.