2011-02-02 6 views
0

4 개의 클래스가 있습니다. 누군가 printHi.php로 가면 다른 클래스에서 두 번 "hi"를 인쇄합니다. 그러나 :PHP에서 클래스의 함수를 호출 할 수 없습니다.

printHi.php

include('main.php'); 
$main = new Main; 

main.php :

class Main { 
    function __construct() { 
     include('class2.php'); 
     include('class3.php'); 
     $this->class2 = new class2; 
     $this->class3 = new class3; 
     $this->class2->sanity(); 
    } 
} 

class2.php

class class2 { 
    public function sanity() { 
     echo "Hi."; 
    } 
} 

class3.php

class class3 { 
    function __construct() { 
     $this->class2 = new class2; 
     $this->class2->sanity(); 
    } 
} 

출력이 표시되지 않습니까? 또는 오류가 있습니까? 내가 도대체 ​​뭘 잘못하고있는 겁니까? 내 모든 클래스의 정신()를 사용하고 싶었 경우

또한, 나는 어떻게 할 것이라고 모든 클래스에

$this->class2 = new class2; 
$this->class2->sanity(); 

을하지 않고?

class class3 { 
    __construct() { 
     $this->class2 = new class2; 
     $this->class2->sanity(); 
    } 
} 

는 구문 분석 오류가 포함되어 있기 때문에

http://pastebin.com/HHyQfvhW

+0

응용 프로그램의 첫 번째 줄에 오류를 보려면'error_reporting (0)'을 추가하십시오. 오류보고는 기본적으로 ini 파일 내에서 발생합니다. – RobertPitt

답변

2

오류가 발생하고 있습니다. error_reporting turned off 일 수 있으며 빈 화면이 표시 될 수 있지만 올라갔습니다. 여기에 내가 무엇을 볼 수의 오류의 목록은 다음과 같습니다

  • 강좌 3의 생성자는 function 선언이 없습니다. 이

    function __construct() { 
    
  • 클래스 1의 생성자가 아닌 객체 $this->class의 방법 sanity()을 호출하려고 치명적인 구문 분석 오류해야합니다. 이것은 치명적인 오류입니다.

분명히 이것은 실제 코드가 아닙니다. 모든 수업에서 Class2을 사용할 수 있다고 말하는 것으로 가정한다면, 나는 Dependency Injection을 제안 할 것입니다. 그래서 :.

class Main { 
    public function __construct(class2 $class2, Class3 $class3) { 
     $this->class2 = $class2; 
     $this->class3 = $class3; 
     $this->class2->sanity(); 
    } 
} 
class Class2 { 
    public function sanity() {...} 
} 
class Class3 { 
    public function __construct(Class2 $class2) { 
     $this->class2 = $class2; 
    } 
} 

그런 식으로, 모든 것을 전달됩니다 그것은 훨씬 더 유연, 쉽게 이해하고 디버그 및 까지 쉽게 테스트 할 수 있습니다.

편집 : 링크 된 코드에 근거 :

는 몇 가지 문제가 있습니다.

  • 당신의 의존성을 주입하십시오. 모든 클래스의 새로운 인스턴스를 생성하지 마십시오 (관계를 하드 코딩).

  • 코드를 올바르게 들여 씁니다. 가독성이 왕이다. 항상 들여 쓰기.

  • require() or die()은 무의미합니다. require이 실패하면 실행을 종료합니다. or die 비트가 중복됩니다.

  • Configsanity() 메서드는 static으로 선언되지만 인스턴스에서 호출하려고합니다. 인스턴스 (묶음이 $this이어야 함)에 묶여 있는지 확인하고 적절하게 만듭니다. 그런 다음 적절하게 부르십시오. bar가 인스턴스 메서드이고 그 반대 인 경우 Foo::bar()으로 호출하지 마십시오.

  • require 'foo' or die()이 어떻게 작동하는지 알기 때문에 수행 할 작업이 잘못되었습니다.

  • 마지막으로, 맹목적으로이 같은 require를 사용하지 않는 ... OR 더 높은 precidence을 가지고, 그래서이 require ('foo' or die())으로 해석이기 때문에 당신이 require 1를 얻을 이유입니다. 대신 파일을 이미 필요로하는 경우 (오류를 방지하기 위해) 클래스를 자동로드하거나 require_once을 사용하십시오.

+0

이것이 제 실제 코드입니다. 길기 때문에 원래 게시물에 넣고 싶지는 않았지만 언급 한 오타 중 일부는 실제 코드에 없습니다. http://pastebin.com/HHyQfvhW –

+0

@Derek : 원래 질문으로 편집해도 괜찮을까요? 무엇이 잘못 되었는가를 알아내는 것이 유용하고 필요합니다. 길이에 대해 걱정하지 마십시오. – ircmaxell

+0

괜찮 았군. –

2

당신은보고되지 않는 오류 가능성이 높습니다. 즉, function __construct()으로 작성해야합니다. 이 때문에 구문 분석 오류로 인해 스크립트가 실행되지 않으므로 error_reportingini_set과 같은 오류를 발생시키는 방법은 작동하지 않습니다. 따라서 php.ini 파일을보고 error_reporting 및 display_errors 지시문을 설정하십시오. 작업을 마친 후에는 오류 메시지가 나타납니다.

관련 문제