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
Форумы портала PHP.SU :: Версия для печати :: Не видит объекты, если require
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Не видит объекты, если require

Страниц (2): [1] 2 »
 

1. Tox - 07 Сентября, 2012 - 11:50:34 - перейти к сообщению
В начале файла создаются экземпляры классов. Далее, в зависимости от адреса, по которому перешел юзер, подключается определенная страница. Тут все нормально. Подключаемые страницы лежат в отдельной папке. И если я в этих страницах вызываю метод определенного класса, то ошибка:
CODE (htmlphp):
скопировать код в буфер обмена
  1. Call to a member function

php не видит, что написано в этих подключаемых страницах , а именно нельзя обратиться к св-ву нужного класса, экземпляр которого создан в самом начале индексного файла. Создавать новый экземпляр не вижу смысла - если он уже существует.
Пример. В самом начале индексного файла:

В подключаемом файле хочу получить доступ к паблик-свойству db (которое, существует, иначе, как бы выводились мета-теги и прочее, которые находятся в бд):

CODE (htmlphp):
скопировать код в буфер обмена
  1. Notice: Undefined variable: db
  2. Trying to get property of non-object

Может, я что-то не понял, но почему так происходит? Из подключаемой страницы свойства, методы и объекты не видно. Объясните, пожалуйста, в процедурном все работало
(Добавление)
То есть чтобы все работало, я должен в подключаемом файле заново создать экземпляр класса, тогда можно получить доступ к свойствам и методам.
Но почему? Ведь они все объявлены в индексном в самом начале
2. Мелкий - 07 Сентября, 2012 - 12:06:07 - перейти к сообщению
require не при чём. Упускаете какую-то вещь, например, что пытаетесь обратиться к объекту из метода, функции - в общем, из области видимости, где тот не существует. include и ко работают в той же области видимости, из которой были вызваны.
3. Tox - 07 Сентября, 2012 - 12:12:12 - перейти к сообщению
Мелкий
до подключаемого файла - все работает. В подключаемом
PHP:
скопировать код в буфер обмена
  1. if( isset($db) ) {
  2.         echo 213;
  3. }

Ничего не выводит
4. EuGen - 07 Сентября, 2012 - 12:15:00 - перейти к сообщению
Убедитесь, что создаваемый объект и место его проверки находятся в одной области видимости.
5. Tox - 07 Сентября, 2012 - 12:15:31 - перейти к сообщению
EuGen
А как это сделать?
6. caballero - 07 Сентября, 2012 - 12:38:29 - перейти к сообщению
небось обращение к екземпляру производится внутри какой то функции
7. Tox - 07 Сентября, 2012 - 12:45:45 - перейти к сообщению
caballero
нет. Экземпляр создается в начале индексного файла, обращение к свойству класса - из подключаемого к индексному файлу. Никаких функций, я поэтому и спросил, потому что непонятно, почему они друг друга не видят
(Добавление)
Виновником является метод другого класса:
PHP:
скопировать код в буфер обмена
  1. function metaSelector(){
  2.                 if (file_exists("pages/".$this->page_id.".php")) {
  3.                         require_once "pages/".$this->page_id.".php";
  4.                 }
  5.                 else {
  6.                         require_once 'pages/index.php';
  7.                 }
  8.         }

В индексном файле он и решает, какая страница будет подключена. Просто не стал вызывать этот метод и подключил сразу через require - все заработало.
Значит, они в разной зоне видимости? А самый оптимальный вариант, чтобы можно было обращаться к св-вам других объектов - это передавать в него объекты?
8. caballero - 07 Сентября, 2012 - 13:06:31 - перейти к сообщению
если речь о соединениии с Бд которое нужно во многих местах
то лучше всего использовать синглетон.

Есть еще дедовский вариант - через global но это считается некошерным способом
хотя если речь идет о единственной глобальной переменной - проблем лично я не вижу

ну или чтобы не возражали grammar nazy вынимать переменную с $GLOBALS

но лучше таки синглетон - тогда объект создается только когда он нужен
9. Tox - 07 Сентября, 2012 - 13:10:08 - перейти к сообщению
Разобрался. Разная область видимости, так как require был вообще в другом классе и т.д. Переделал метод, чтобы тот возвращал строки и стал подключать в индексном - все норм. Спасибо!

Ох, уж это ооп
10. caballero - 07 Сентября, 2012 - 13:27:49 - перейти к сообщению
вообще то нормальные люди автолоад юзают
11. Tox - 07 Сентября, 2012 - 13:49:27 - перейти к сообщению
caballero
он есть, там где нужен
12. digi - 07 Сентября, 2012 - 14:01:10 - перейти к сообщению
Tox пишет:
он есть, там где нужен
, а где он нужен и где не нужен? ;)
13. Tox - 07 Сентября, 2012 - 14:07:54 - перейти к сообщению
digi
__autoload - насколько мне известно, для классов. В процедурном он не нужен. не?
14. digi - 07 Сентября, 2012 - 14:20:28 - перейти к сообщению
ну ветка то "Объектно-ориентированное программирование " ;)
15. caballero - 07 Сентября, 2012 - 14:35:07 - перейти к сообщению
Цитата:
насколько мне известно, для классов. В процедурном он не нужен. не?

так у тебя классы и есть
или ты не в курсе что ж это классы?

 

Powered by ExBB FM 1.0 RC1