Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Вызов метода класса из свойства другого класса


Автор: Azalis 13.11.2007, 21:03
Добрый день!
Может поможете, проблема такая:
Есть класс, назовём его UserProfile, в котором есть private свойство userSpells, которое в свою очередь является массивом объектов класса Spell.
Заполнение массива происходит совершенно спокойно, однако при попытке обратиться из метода класса UserProfile к методу GetSpellInfo класса Spell, вылезает следующее:
Цитата

Warning: Illegal offset type in z:\home\localhost\www\game\Class\UserProfile.php on line 90
Fatal error: Call to a member function GetSpellInfo() on a non-object in z:\home\localhost\www\game\Class\UserProfile.php on line 90


В коде это выглядит так:

Код

// Файл Spell.php
class Spell
{
    private $sid;
    private $spellInfo;
    
    function __construct($sid)
    {
        $sql = "SELECT * FROM `".Utilit::$globalVars['tbl_magicBook']."` WHERE `mid`='".$sid."'";
        $result = DBQuery($sql);
        $sqlSpell = mysql_fetch_assoc($result);
        if (!$sqlSpell) $this->spellInfo = "FALSE";
        else 
        {
            $this->spellInfo = $sqlSpell;
            $this->sid = $sid;
        }
        
        mysql_free_result($result);
    }
    
    function GetSpellInfo()
    {
        return $this->spellInfo;
    }
    
    function ExecuteSpell()
    {
        // Выпонить заклинание
    }
}


Код

// Файл UserProfile.php
require_once "./Class/Spell.php";
class UserProfile implements AnyProfile
{
    private $uid;
    private $userSpells;

    function __construct($uid)
    {
        $this->uid = $uid;

        $sql = "SELECT * FROM `".Utilit::$globalVars['tbl_magicUser']."` WHERE `uid`='".$this->uid."'";
        $result3 = DBQuery($sql);
        while ($sqlSu = mysql_fetch_assoc($result3))
        {
            $i = $sqlSu['id'];
            $this->userSpells[$i] = new Spell($sqlSu['mid']);
        }
        if (empty($this->userSpells)) $this->userSpells = "NONE";
    }
    
    function GetAllSpells()
    {
        ///////////////////////////////////////////////////
        //// Вот тут вот начинается проблема
        ///////////////////////////////////////////////////
        foreach ($this->userSpells as $v => $k)
        {
            $a = $this->userSpells[$k]->GetSpellInfo();
            print $k." -> SpellId:".$a['mid']." || Name:".$a['name']." || MinLevel:".$a['min_level'];
        }
        //return $this->userSpells;
    }
}


Кто подскажет, где ошибка, буду оч благодарен!

Автор: skyboy 14.11.2007, 00:59
конструкция 
Код

foreach ($this->userSpells as $v => $k)

начнет перебирать массив, возвращая на каждой итерации в переменной $v - очередной ключ, а в $k- значение очередного элемента.
Следовательно, чтоб обратиться к методу элемента массива, можно сделать так:
Код

$a = $k->GetSpellInfo();

А в твоем случае ты берешь значение элемента массива(не индекс!) и пытаешься найти в массиве элемент с таким же индексом.
вот на примере:
Код

$array= array('1'-> 'Вася', 'aa'-> 'Маша');
foreach($array as $index > $value) {
 echo $array[$value].'<br />'; // вернет вполне обоснованный warning, потому как ни $array['Петя'], ни $array['Маша'] не существуют. надо было обращаться $array[$index], если уж так оота поизвращаться и не работать с $value напрямую
}

Автор: Azalis 14.11.2007, 10:06
Да уж, действительно дурацкая ошибка...
Спасибо! =)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)