загрузчик классов __autoload()

Зека

Новичок
загрузчик классов __autoload()

Почитал, понял, что пора дробить простыню, слишком много кода, путаюсь.
Решил попробовать, в итоге я не могу достучатся из класса А в метода класса Б.
Fatal error: Call to a member function _authorize() on a non-object in ....

что имею
include_once 'loader.php';
__autoload('authorization');
__autoload('forms');
$Authorization = new Authorization;
$Forms = new Forms;
$Forms->_clickform();

срабатывает _clickform() далее пытаюсь запустить $this->Authorization->_authorize() пробовал и $Authorization->_authorize()

объясните, спасибо.
 

Splurov

Новичок
Откуда в $this у Forms само появится свойство Authorization c объектом Authorization?
И при чем тут autoload?
И включи вывод ошибок.
 

Зека

Новичок
Вы имели ввиду свойство _authorize()?, объясни конструкцию пожалуйста.
ошибки включены.
автолоад использую, для загрузки файлов классов.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Ммм, кажется у тебя в голове каша. Автозагрузку ты используешь неправильно на мой взгляд.

Читать долго и смотреть примеры тут: http://php.net/manual/en/language.oop5.autoload.php

Посмотри список классов, которые у тебя есть, так как если ты создаешь объект типа $Authorization = new Authorization; то потом точно должен писать $Authorization->_authorize() а не через $this.
 

Зека

Новичок
пробовал и $Authorization->_authorize()

-~{}~ 27.10.10 14:54:

я видимо автолоад не понял верно? мне казалось это метод автоматического загрузки классов и их регистрации?!

-~{}~ 27.10.10 14:55:

$Authorization->_authorize()

Call to a member function _authorize() on a non-object in \class\forms.class.php on line 13
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Зека
понимаешь ли в чем дело, если тебе пишет Fatal error: Call to a member function _authorize() on a non-object in - следовательно ты пытаешься вызвать метод не на объекте а на чем-то еще. Отсюда вывод, а создался ли вообще объект нужного тебе типа?

print_r(get_declared_classes()); в нужном месте - раз, два - читать о правильно использовании автозагрузки. И в довершении про ООП. Ты спутал тут пространство имен класса и локальное пространство имен
 

Зека

Новичок
[220] => Authorization [221] => Forms
классы за декларированы если я Вас верно понял.

-~{}~ 27.10.10 15:07:

добавил global $Authorization; в класс forms и все заработало, а чем занимается тогда автолоадер? существует ли встроенный механизм автозагрузки и регистрации классов? или каждый раз его нужно поднимать через global?
 

Духовность™

Продвинутый новичок
забудьте про global и никогда не используйте его, если пишите с помощью классов.
 

Urville

Новичок
скорее всего ты в объекте класса Forms использовал объект класса Authorization, но сам объект, видимо, не существует в области видимости объекта класса Forms
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Тебе нужно сделать функцию автоподгрузки классов не таким образом.

Нужно взять, например, создать метод в определенном классе, который будет заниматься подгрузкой:

class classAutoload {
public static function autoload($className) {
if (file_exists(SYSPATH . $className . EXT)) {
require SYSPATH . $className . EXT;
}
}
}
потом вешаем через spl это все до вызова классов

spl_autoload_register(array('classAutoload', 'autoload'));

Далее как только ты попытаешься вызвать класс которого нет, php обратится к этому методу и проверит, есть ли класс, который тебе нужен по указанному пути. Ну и имя класса в примере должно совпадать с именем файла, без учета расширения.

Если класса нет - получишь фатал эррор.
 

Духовность™

Продвинутый новичок
для его задачи достаточно одной функции __autoload, без класса и spl_autoload_register, но он не понимает зачем вообще нужна автозагрузка и как она действует.
 

Вурдалак

Продвинутый новичок
triumvirat, как только он подключит стороннюю библиотеку со своим автозагрузчиком, то его __autoload() перестанет работать.
 

Зека

Новичок
вот
spl_autoload_register('autoload');
function autoload($className)
{
$fileName = 'class/'.$className.'.class.php';
include $fileName;
}

вызываю forms::_clickform(); работает

у меня так же есть mysqli, теперь с ним проблемы
Non-static method mysqli::real_escape_string() cannot be called statically

в чем разница между статикой и не статикой? к ней как то по особенному обращаться?
 

Вурдалак

Продвинутый новичок
Зека, ты не должен сам вызывать автозагрузчик. Он автоматически вызывается интерпретатором, как только тот натыкается на неизвестный ему класс во время исполнения.
 

Духовность™

Продвинутый новичок
с его непониманием автозагрузки, он и spl_autoload_register не сможет использовать как надо. кстати, а что в сторонней библиотеке будет делать __autoload?..
 

Зека

Новичок
Вурдалак никак, мне создать новый топик? логично обсудить в нем же, разве нет?
 

Вурдалак

Продвинутый новичок
Автор оригинала: triumvirat
что в сторонней библиотеке будет делать __autoload?..
— spl_autoload_register() там будет для регистрации автозагрузчика классов этой библиотеки. Во время появления неизвестного класса сначала твой загрузчик попробует его найти, потом уже дойдёт очередь до загрузчика из этой библиотеки, который как раз знает об этом классе.
 

Зека

Новичок
$mysqli = new mysqli($this->mysql_host, $this->mysql_user, $this->mysql_pass, $this->mysql_dbnm);

вызываю $mysqli->real_escape_string()
Call to a member function real_escape_string() on a non-object
 

Вурдалак

Продвинутый новичок
Автор оригинала: Зека
Вурдалак никак, мне создать новый топик? логично обсудить в нем же, разве нет?
— абсолютно нелогично. Это называется «оффтопик» и это запрещено правилами форума.
 
Сверху