2012-01-02 10 views
2

오류 아래 코드를 사용할 때 다음 오류가 발생합니다. 내가 뭘 잘못하고 있는지 말해 줄 수 있니? 여기 클래스에서 확장 할 때 메모리 오류가 발생했습니다.

<?php 

include('test_class1.php'); 
include('test_class2.php'); 
include('test_class3.php'); 

class Main_Class{ 

    protected $test_class1; 
    protected $test_class2; 
    protected $test_class3; 

    private $objects_array = array(); 


    public function Main_Class(){ 

     $this->test_class1 = new Test_Class1(); 
     $this->objects_array['test_class1'] = $this->test_class1; 
     $this->test_class2 = new Test_Class2(); 
     $this->objects_array['test_class2'] = $this->test_class2; 
     $this->test_class3 = new Test_Class3(); 
     $this->objects_array['test_class3'] = $this->test_class3; 

    } 

    public function get_Objects(){ 

     return $this->objects_array; 

    } 

} 

?> 

내가 세 가지 테스트 클래스에 사용하는 코드입니다 : 여기

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 32 bytes) in D:\dev\TESTCASE_classes_layout\main.class.php on line 18

은 내가 사용하는 코드입니다. 클래스 이름 번호와 함수 이름 번호에 대해서만 똑같은 코드입니다.

<?php 

class Test_Class1 extends Main_Class{ 

    function test1(){ 
     return 'hello'; 
    } 

} 

?> 

확장 부분과 관련이 있습니다. 왜냐하면 내가 확장 부분을 삭제하면 그것은 작동합니다. 나는이 클래스의 클래스를 인스턴스화하여 모든 클래스는 클래스의 다른 인스턴스를 생성하지 않고 서로를 호출 할 수 있습니다를 확장하는 것을 시도하고있다

:

은 여기 내 목표입니다.

어쩌면 당신이 그 사실을 알고 있다면 알려주는 더 좋은 방법이 있습니다.

+4

'연장 부분'이란 정확히 무엇입니까? 이 스크립트는 내 컴퓨터에서 제대로 실행됩니다. 문제를 하나의 데모 파일로 끓여서 [codepad.org] (http://codepad.org/) 또는 [ideone.com] (http://ideone.com/)에 게시 한 다음 우리에게 그것에 대한 링크. – phihag

+0

죄송합니다 코드를 편집하십시오. 나는 약간의 실수를했다. test_class1에 대한 확장 부분을 참조하십시오. – Controvi

+0

아, PHP에서 버그를 발견 한 것 같습니다. 그럼에도 불구하고 코드가 올바르지 않습니다. 생성자에서 하위 클래스를 인스턴스화 할 수 없습니다. 나는 PHP는 버그를 게시 일단 나는 내가 당신의 대답을 기대하고있다 .... – phihag

답변

1

Main_Class, 또는 하위 유형 중 하나의 객체를 만들 때마다 생성자가 호출됩니다.

new Main_Class()   calls ... 
Constructor of Main_Class calls ... 
new Test_Class1()   calls ... 
Constructor of Test_Class1 calls ... 
Constructor of Main_Class calls ... 
new Test_Class1()   calls ... 
... 

를 대신, 당신이해야 :

당신이 만드는 동안 서브 타입의 새로운 개체를 만드는 때문에, 당신은 메모리가 소진되거나 메모리 한계에 도달하면 종료 무한 루프로 실행 정적 방법으로 개체를 만듭니다. 그러나 목표를 달성하더라도 중요한 목표 인 encapsulation을 위반하고 극도로 열악한 디자인으로 이어질 수 있습니다. 대신, 당신은 아마 (즉, 이러한 클래스의 모든 하나의 방법 test가) 형 Main_Class의 임의의 객체에서 작동하는 방법이 있고, 방법을 재정의합니다.

+0

설명과 팁 주셔서 감사합니다. – Controvi

0

이 스레드를 확인하십시오 Allowed memory size of 33554432 bytes exhausted (tried to allocate 43148176 bytes) in php 도움이 될 수 있습니다. 실제로 스크립트와 관련이 없지만 구성과 관련 될 수 있습니다.

또한 오류로 인한 메모리 사용을 읽기가 까다로울 수 있으므로 인스턴스화를 확인하십시오. 어쩌면 어떤 종류의 고리가있을 수 있습니다. 플러그인과 함께 일부 프레임 워크를 사용하고 있습니까? 세 개의 클래스가 기본 클래스를 확장하고 메일 클래스의 생성자는 3 개 클래스를 호출하기 때문에

1

야이 메모리 소모 오류는을 만들려고 할 때

을 의미합니다 .. 발생 왜주고있다 오류가있어 다시 은 그러므로 당신이 소진되는 무한 loop..and PHP는 메모리에 .. 다시 호출들은 부모 클래스로 이동합니다 하위 클래스의 인스턴스 ..

만약 당신이 확장하려고 노력하고 있습니다. 그리고 그 일없이 잘할 수 있습니다 ..

이제 다음 부분은 다른 2 클래스의 속성을 얻는 방법입니다.

먼저이 경우가 필요한 이유가 표시되지 않습니다. 클래스의 모든 함수를 정의하고 확장 할 수 있습니다. 모두를 호출하고 그들을 호출 ... 당신은 여전히 ​​다른 선택의 여지가 있지만 인스턴스를 별도로 만드는 ... 계속하면 ... :)

1

무한 재귀가 나타납니다. Test_Class1

를 인스턴스화 할 때 기본 생성자로 호출을 방지하기 Test_Class1 같은
function Test_Class1() {} 

로 생성자 함수를 추가하십시오

편집 : 일반적인 참고로, 같은 클래스 또는 하위 클래스의 인스턴스를해서는 안됩니다 클래스 생성자에서이 문제가 무한 재귀로 이어지게됩니다. 다행히 PHP는 자식 생성자를 상속하고 지정할 때 부모 생성자를 자동으로 호출하지 않습니다. 그러나 대부분의 다른 OO 언어에서이 패턴은 100 %의 시간을 망칩니다.

+0

부모 생성자가 확장 될 때 호출되지 않는다는 것을 알았 기 때문에 그것을 시도했습니다. 하지만 지금은 내가 알 수없는 좋은 아이디어가 적어도 생성자에서 클래스를 인스턴스화하는 것입니다 – Controvi

관련 문제