2016-05-01 5 views
0

В этой проблеме уже много потоков, но по какой-то причине я не могу заставить ее работать.Устанавливает переменную переменной в родительском конструкторе из дочерней функции

В TestClass :: test(), $ db NULL.

Значение $ db устанавливается в конструкторе App, и я пытаюсь восстановить это значение из расширенной функции класса. (поэтому мне не нужно каждый раз устанавливать $ db).

Некоторая помощь была бы принята с благодарностью, спасибо.

файла: index.php

<?php  
    include('classes/App.class.php'); 
    $oApp = new App(); 
    echo TestClass::test(); 
?> 

Файл: App.class.php

<?php 
class App { 
    protected $db; 

    public function __construct() { 
     include_once("CAutoLoader.class.php"); 
     $oCAutoLoader = new CAutoLoader(); 

     $this->db = "someValue"; 
    } 
} 
?> 

Файл: TestClass.class.php

<?php 
class TestClass extends App 
{ 
    function __construct() { 
    } 

    public static function test() { 
     return $db; 
    } 
} 
?> 

Файл: CAutoLoader.class.php

<?php 
class CAutoLoader { 
    CONST CLASS_EXTENSION = '.class.php'; 

    public function __construct() { 
     spl_autoload_register(array($this, 'loader')); 
    } 

    private function loader ($className) { 
     include $className . self::CLASS_EXTENSION; 
    } 
} 
?> 
+0

В классе App, изменение '$ db' для статического свойства и в изменении конструктора это' $ this-> дб = "SomeValue", '' к самостоятельной :: $ дб = "SomeValue"; ' – AliN11

ответ

0

Вы забыли this в вашем TestClass и статический метод не может получить доступ к не-статические свойства. Удалите ключевое слово static и верните правильное значение.

public function test() { 
    return $this->db; 
} 

Edit:

Если вы имели в виду, чтобы получить экземпляр db через статический метод, вы должны объявить переменную как статические.

class App { 
    protected static $db = 'hey'; 
    ... 
} 

class TestCase extends App { 
    public static function test() { 
     return parent::$db; 
    } 
} 

echo TestCase::test(); // returns hey 
+0

Да, это работает, если я делаю: $ CTestClass = new TestClass; echo $ CTestClass -> test(); Но я не могу напрямую вызвать TestClass :: test(); (используя $ this, если не в объектном контексте) – WerdZerg

+0

@WerdZerg: См. мое редактирование – marvinhagemeister

+0

Я пробовал, как вы сказали, но у меня все еще есть проблема с использованием $ this, если не в контексте объекта. Что-то должно отсутствовать, но я не знаю, что. Спасибо за вашу помощь. – WerdZerg

Смежные вопросы