Доступ к объектам и переменным родительского класса через $this?

У меня есть один основной класс main, который я использую для хранения конфигурации и нескольких объектов. Однако я не могу получить доступ к объектам и переменным в классе, который расширяет main через $this.

Вот некоторые из моего основного класса:

<?php
class main{
    // the configuration vars
    public $config = array();
    // the current user variables
    public $uid; // contains the user ID
    public $gid; // contains the group ID
    // database variables
    public $DB; // contains the connection
    public $query_id; // contains the query ID
    public $query_count; // how many queries have there been?
    // cache variables
    public $cache;
    // start up functions
    public function startup(){
        // first, set up the caching
        if(function_exists('memcache_connect') AND $this->config['use_memcache'] == true){
            // start up memcache
            require_once('memcache.class.php');
            $this->cache = Cache::getInstance();
        }
        // now, set up the DB
        $this->connectToDatabase();
        // now, set up the user session
        $this->setUserSession();
        // are we logged in? If so, update our location
        if($this->uid > 0){
            // update location
            $this->updateUserSession();
        }
    }

Вот пример другого класса

<?php
class user extends main{
        public function viewProfile($uid){
                exit($this->config['session_prefix']); // displays nothing
                if($this->cache->exists('key')){ // fails

Значение $config настроено правильно, и я могу прочитать его в main, но не в любом подклассе. Объект $cache->exists просто приводит к Call to a member function exists() on a non-object.

В index.php классы загружаются и настраиваются. Сначала настраивается класс Main, после чего вызывается функция запуска. Массив конфигурации передается перед вызовом запуска.

Может ли кто-нибудь предложить, как я могу это исправить?


person Peter    schedule 06.01.2012    source источник


Ответы (3)


Вы уверены, что ваш массив настроен правильно?

Этот простой тест работает для меня:

<?
class main {
    public $test = "Woot";
}

class test extends main {
    public function __construct() {
        echo $this->test;
    }
}

$t = new test();

Просто для целей тестирования добавьте переменную $test, как в моем примере, в класс main и попробуйте повторить ее в пользовательском конструкторе.

Я бы проверил, действительно ли ваш кеш настроен правильно. Вероятно, ошибка в этом операторе if:

if(function_exists('memcache_connect') AND $this->config['use_memcache'] == true){

Одно из этих двух условий не выполняется, поэтому ваша переменная $cache не будет инициализирована.

person kufi    schedule 06.01.2012
comment
Функция if виновата в том, что $cache не работает. Я попробовал значение $test, и оно правильно вернуло значение. Но $config пуст, а var_dump из $this->config просто дает пустой массив. Я знаю, что он не пуст, так как функция connectToDatabase() работает правильно. - person Peter; 06.01.2012

вы можете использовать parent:: для ссылки на переменные в родительском классе.

parent::cache->exists('key')
person Stefan    schedule 06.01.2012

Вы можете получить доступ к атрибутам родительского класса с помощью $this->attribute, поэтому проблема должна заключаться в том, что вы не вызываете конструктор родителя...

Как этот код отлично работает:

    <?php
    class foo {
        public $x="aa";

    }
    class bar extends foo {
        public function barbar()
        {
              echo $this->x;
        }
    }
    $b = new bar;
    $b->barbar(); 
    ?>

Хотя вы также можете получить доступ к свойствам родительского класса с помощью Parent::attr()

person Rajat Singhal    schedule 06.01.2012
comment
Я установил тестовую переменную в основном классе, и я могу получить к ней доступ в пользовательском режиме, но массив $config все еще пуст. Я знаю, что он не пустой, так как работает connectToDatabase(). - person Peter; 06.01.2012