2016-08-30 2 views
1

아래처럼 구조화 된 세 개의 클래스가 있습니다. 그것은 실행될 때를 제외하고는 자신을 영원히 반복하고 이미 정의 된 RandomSetting 상수에 대한 오류를 발생시킵니다. $ App 변수를 설정하는 메소드를 만들고 실행하면 상속 된 클래스는 Add()와 같은 메소드를 사용할 수 없습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?PHP 상속 루프

<?php 
abstract class start 
{ 
    public $var; 

    public function __construct() 
    { 
     $this->var = 1; 
     define('RandomSetting', 'RandomText'); 
    } 

    public function Add($v, $b) 
    { 
     return $v + $b; 
    } 
} 

abstract class second extends start 
{ 
    public $foo; 

    public function __construct() 
    { 
     parent::__construct(); 
     $this->foo = $this->var; 
    } 
} 

class end extends second 
{ 
    public $App; 

    public function GetTheVar() 
    { 
     print $this->foo; 
    } 
} 
$bar = new end(); 
$bar->GetTheVar(); 
+2

'new second()'?!? 'second'는 추상으로 정의되어 있으므로 오류가 발생합니다. –

+0

코드가 유효하지 않습니다. 추상 클래스의 객체를 인스턴스화하는 것은 금지되어 있습니다. –

+0

그러나 상수가 이미 존재하고 동일한 이름으로 상수를 정의하려고하면 오류가 발생합니다. 그것을 정의하기 전에 상수가 [정의 된] (http://php.net/manual/en/function.defined.php)인지 확인하십시오 –

답변

1

클래스 end의 모든 새로운 인스턴스는 클래스 start까지 부모의 생성자를 호출합니다. 즉, 모든 인스턴스 생성 중에 상수 'RandomSetting'이 재정의되도록 시도됩니다. 그것은 통지로 이어집니다. 그 상수가 이미 정의되어 있는지 확인하면 하나를 피할 수 있습니다. 아래 코드를 참조하십시오 :

abstract class start 
{ 
    public $var; 

    public function __construct() 
    { 
     $this->var = 1; 
     if (!defined('RandomSetting')) { 
      define('RandomSetting', 'RandomText'); 
     } 
    } 

    public function Add($v, $b) 
    { 
     return $v + $b; 
    } 
} 
+0

이것은 여전히 ​​영원히 반복되고 스크립트 실행 시간 max가 그것을 죽일 때까지 요청은 결코 멈추지 않습니다. BTW PHP 7.0.10을 사용하고 있습니다. – lemoney

+0

PHP7.0.5에서 테스트했는데 루프가 표시되지 않습니다. http://sandbox.onlinephpfunctions.com/code/e69b3e62fec7e1473a91a3e405484ed498ca9cfb @lemoney –

+0

발견! 나는 창문에있어 그룹 정책이 문제였다. Idk. 그러나 나는 집으로 돌아갔다. 그리고 그것은 잘 움직인다. – lemoney