загрузчик классов __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()

объясните, спасибо.
 
Откуда в $this у Forms само появится свойство Authorization c объектом Authorization?
И при чем тут autoload?
И включи вывод ошибок.
 
Вы имели ввиду свойство _authorize()?, объясни конструкцию пожалуйста.
ошибки включены.
автолоад использую, для загрузки файлов классов.
 
Ммм, кажется у тебя в голове каша. Автозагрузку ты используешь неправильно на мой взгляд.

Читать долго и смотреть примеры тут: 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
 
Зека
понимаешь ли в чем дело, если тебе пишет 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?
 
скорее всего ты в объекте класса Forms использовал объект класса Authorization, но сам объект, видимо, не существует в области видимости объекта класса Forms
 
Тебе нужно сделать функцию автоподгрузки классов не таким образом.

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

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