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

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
Tox
Отправлено: 07 Сентября, 2012 - 11:50:34
Post Id



Посетитель


Покинул форум
Сообщений всего: 314
Дата рег-ции: Нояб. 2011  
Откуда: Россия


Помог: 0 раз(а)




В начале файла создаются экземпляры классов. Далее, в зависимости от адреса, по которому перешел юзер, подключается определенная страница. Тут все нормально. Подключаемые страницы лежат в отдельной папке. И если я в этих страницах вызываю метод определенного класса, то ошибка:
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

Может, я что-то не понял, но почему так происходит? Из подключаемой страницы свойства, методы и объекты не видно. Объясните, пожалуйста, в процедурном все работало
(Добавление)
То есть чтобы все работало, я должен в подключаемом файле заново создать экземпляр класса, тогда можно получить доступ к свойствам и методам.
Но почему? Ведь они все объявлены в индексном в самом начале


-----
In Console We Trust. Code hard. Or die.
 
 Top
Мелкий Супермодератор
Отправлено: 07 Сентября, 2012 - 12:06:07
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




require не при чём. Упускаете какую-то вещь, например, что пытаетесь обратиться к объекту из метода, функции - в общем, из области видимости, где тот не существует. include и ко работают в той же области видимости, из которой были вызваны.


-----
PostgreSQL DBA
 
 Top
Tox
Отправлено: 07 Сентября, 2012 - 12:12:12
Post Id



Посетитель


Покинул форум
Сообщений всего: 314
Дата рег-ции: Нояб. 2011  
Откуда: Россия


Помог: 0 раз(а)




Мелкий
до подключаемого файла - все работает. В подключаемом
PHP:
скопировать код в буфер обмена
  1. if( isset($db) ) {
  2.         echo 213;
  3. }

Ничего не выводит


-----
In Console We Trust. Code hard. Or die.
 
 Top
EuGen Администратор
Отправлено: 07 Сентября, 2012 - 12:15:00
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Убедитесь, что создаваемый объект и место его проверки находятся в одной области видимости.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Tox
Отправлено: 07 Сентября, 2012 - 12:15:31
Post Id



Посетитель


Покинул форум
Сообщений всего: 314
Дата рег-ции: Нояб. 2011  
Откуда: Россия


Помог: 0 раз(а)




EuGen
А как это сделать?


-----
In Console We Trust. Code hard. Or die.
 
 Top
caballero
Отправлено: 07 Сентября, 2012 - 12:38:29
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




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

(Отредактировано автором: 07 Сентября, 2012 - 12:38:51)



-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Tox
Отправлено: 07 Сентября, 2012 - 12:45:45
Post Id



Посетитель


Покинул форум
Сообщений всего: 314
Дата рег-ции: Нояб. 2011  
Откуда: Россия


Помог: 0 раз(а)




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


-----
In Console We Trust. Code hard. Or die.
 
 Top
caballero
Отправлено: 07 Сентября, 2012 - 13:06:31
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




если речь о соединениии с Бд которое нужно во многих местах
то лучше всего использовать синглетон.

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

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

но лучше таки синглетон - тогда объект создается только когда он нужен

(Отредактировано автором: 07 Сентября, 2012 - 13:15:09)



-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Tox
Отправлено: 07 Сентября, 2012 - 13:10:08
Post Id



Посетитель


Покинул форум
Сообщений всего: 314
Дата рег-ции: Нояб. 2011  
Откуда: Россия


Помог: 0 раз(а)




Разобрался. Разная область видимости, так как require был вообще в другом классе и т.д. Переделал метод, чтобы тот возвращал строки и стал подключать в индексном - все норм. Спасибо!

Ох, уж это ооп


-----
In Console We Trust. Code hard. Or die.
 
 Top
caballero
Отправлено: 07 Сентября, 2012 - 13:27:49
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




вообще то нормальные люди автолоад юзают


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Tox
Отправлено: 07 Сентября, 2012 - 13:49:27
Post Id



Посетитель


Покинул форум
Сообщений всего: 314
Дата рег-ции: Нояб. 2011  
Откуда: Россия


Помог: 0 раз(а)




caballero
он есть, там где нужен


-----
In Console We Trust. Code hard. Or die.
 
 Top
digi
Отправлено: 07 Сентября, 2012 - 14:01:10
Post Id


Посетитель


Покинул форум
Сообщений всего: 406
Дата рег-ции: Янв. 2012  


Помог: 4 раз(а)




Tox пишет:
он есть, там где нужен
, а где он нужен и где не нужен? ;)
 
 Top
Tox
Отправлено: 07 Сентября, 2012 - 14:07:54
Post Id



Посетитель


Покинул форум
Сообщений всего: 314
Дата рег-ции: Нояб. 2011  
Откуда: Россия


Помог: 0 раз(а)




digi
__autoload - насколько мне известно, для классов. В процедурном он не нужен. не?


-----
In Console We Trust. Code hard. Or die.
 
 Top
digi
Отправлено: 07 Сентября, 2012 - 14:20:28
Post Id


Посетитель


Покинул форум
Сообщений всего: 406
Дата рег-ции: Янв. 2012  


Помог: 4 раз(а)




ну ветка то "Объектно-ориентированное программирование " ;)
 
 Top
caballero
Отправлено: 07 Сентября, 2012 - 14:35:07
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
насколько мне известно, для классов. В процедурном он не нужен. не?

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


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB