2016-08-30 2 views
1

У меня есть три класса, которые структурированы, как показано ниже. За исключением случаев, когда он запускается, он навсегда зацикливается на себе и выплевывает ошибки о константе RandomSetting, которая уже определена. Если я создам метод для установки переменной $ App и запускаю ее, то любые унаследованные классы не могут использовать методы, спускаемые подобно Add(). Что я делаю не так?PHP Inheritance Loop

<?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

Найденный! Проблема была в работе с окнами, а групповая политика. Идк, но как я пошел домой, и все работает отлично. – lemoney