Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Не видит объекты, если require
Покинул форум
Сообщений всего: 314
Дата рег-ции: Нояб. 2011 Откуда: Россия
Помог: 0 раз(а)
В начале файла создаются экземпляры классов. Далее, в зависимости от адреса, по которому перешел юзер, подключается определенная страница. Тут все нормально. Подключаемые страницы лежат в отдельной папке. И если я в этих страницах вызываю метод определенного класса, то ошибка:
php не видит, что написано в этих подключаемых страницах , а именно нельзя обратиться к св-ву нужного класса, экземпляр которого создан в самом начале индексного файла. Создавать новый экземпляр не вижу смысла - если он уже существует.
Пример. В самом начале индексного файла:
В подключаемом файле хочу получить доступ к паблик-свойству db (которое, существует, иначе, как бы выводились мета-теги и прочее, которые находятся в бд):
Может, я что-то не понял, но почему так происходит? Из подключаемой страницы свойства, методы и объекты не видно. Объясните, пожалуйста, в процедурном все работало (Добавление)
То есть чтобы все работало, я должен в подключаемом файле заново создать экземпляр класса, тогда можно получить доступ к свойствам и методам.
Но почему? Ведь они все объявлены в индексном в самом начале
----- In Console We Trust. Code hard. Or die.
Мелкий
Отправлено: 07 Сентября, 2012 - 12:06:07
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
require не при чём. Упускаете какую-то вещь, например, что пытаетесь обратиться к объекту из метода, функции - в общем, из области видимости, где тот не существует. include и ко работают в той же области видимости, из которой были вызваны.
----- PostgreSQL DBA
Tox
Отправлено: 07 Сентября, 2012 - 12:12:12
Посетитель
Покинул форум
Сообщений всего: 314
Дата рег-ции: Нояб. 2011 Откуда: Россия
Помог: 0 раз(а)
Мелкий
до подключаемого файла - все работает. В подключаемом
Покинул форум
Сообщений всего: 314
Дата рег-ции: Нояб. 2011 Откуда: Россия
Помог: 0 раз(а)
caballero
нет. Экземпляр создается в начале индексного файла, обращение к свойству класса - из подключаемого к индексному файлу. Никаких функций, я поэтому и спросил, потому что непонятно, почему они друг друга не видят (Добавление)
Виновником является метод другого класса:
В индексном файле он и решает, какая страница будет подключена. Просто не стал вызывать этот метод и подключил сразу через require - все заработало.
Значит, они в разной зоне видимости? А самый оптимальный вариант, чтобы можно было обращаться к св-вам других объектов - это передавать в него объекты?
----- In Console We Trust. Code hard. Or die.
caballero
Отправлено: 07 Сентября, 2012 - 13:06:31
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
если речь о соединениии с Бд которое нужно во многих местах
то лучше всего использовать синглетон.
Есть еще дедовский вариант - через global но это считается некошерным способом
хотя если речь идет о единственной глобальной переменной - проблем лично я не вижу
ну или чтобы не возражали grammar nazy вынимать переменную с $GLOBALS
но лучше таки синглетон - тогда объект создается только когда он нужен
Покинул форум
Сообщений всего: 314
Дата рег-ции: Нояб. 2011 Откуда: Россия
Помог: 0 раз(а)
Разобрался. Разная область видимости, так как require был вообще в другом классе и т.д. Переделал метод, чтобы тот возвращал строки и стал подключать в индексном - все норм. Спасибо!
Ох, уж это ооп
----- In Console We Trust. Code hard. Or die.
caballero
Отправлено: 07 Сентября, 2012 - 13:27:49
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.