Доступ к объектам и переменным родительского класса через $ this? - PullRequest
0 голосов
/ 06 января 2012

У меня есть один главный класс «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-> exist просто приводит к Call to a member function exists() on a non-object.

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

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

Ответы [ 3 ]

0 голосов
/ 06 января 2012

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

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

<?
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 не будет инициализирована.

0 голосов
/ 06 января 2012

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

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

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

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

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

0 голосов
/ 06 января 2012

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

parent::cache->exists('key')
...