Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Общий вопрос по функциям и классам, Принцип работы выражения global 
:(
    Опции темы
Icaros
Дата 13.9.2006, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 26.5.2006

Репутация: нет
Всего: нет



Добрый день. 
Есть класс, который предназначен для формирования html страницы и вывода кода на экран (в смысле, echo). Есть функция (не в классе), которая генерирует ошибки (в случае их возникновения) и передает информацию вышеупомянутому классу.
Суть проблемы: файл с функцией загружается первым (require_once в смысле), затем загружается файл с классом и инициируется сам класс (в смысле $tmpl = new ...). В функции для генерации ошибок я ставлю строку
Код

<?php
  global $tmpl;
?>

Вопрос вот в чем: когда загружается файл с функцией, но сама функция еще никем не вызвана, инициируется ли внутри переменная $tmpl. Из функции я не могу воспользоваться ни одним методом, как будто такого класса нет, хотя никакой ошибки (это точно, проверял) не выдается. А после того, как класс инициирован (в смысле $tmpl = new ...) всем можно воспользоваться.  

Пример:
файл funct.php
Код

function show_error($err) {
 global $tmpl;
 $tmpl->add_to_body($err);
 return true;
}

файл index.php
Код

require_once './funct.php';
require_once './class.php';
$tmpl = new template();

файл class.php
Код

class template {
 var $html = array();

 function template() {
 ...
 }

 function add_to_body($msg) {
   $this->html['body'] .= $msg;
 }
}

Если в файле index.php добавить в конце $tmpl->add_to_body('some text...'), то все работает, а если внутри функции show_error() вставить $tmpl->add_to_body('some text...'), то не работает (в смысле переменная $html['body'] пуста), хотя эта функция в процессе работы вызывается.


Это сообщение отредактировал(а) Icaros - 13.9.2006, 13:04
PM MAIL   Вверх
AztEK
Дата 13.9.2006, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 723
Регистрация: 4.1.2005

Репутация: 6
Всего: 18



Ты неправильно понимаешь суть конструкции global.
Все глобальный переменные расположены в супермассиве $GLOBALS. Они видны вне функций (не важно, обычных или методов класса), у самих функций другая область видимости. Для этого и юзается global. Конструкция
Код

global $tmpl;

По сути обозначает вот что:
Код

$tmpl = &$GLOBALS['tmpl'];

Т.е. мы берем переменную (точнее ссылку) из суперглобального массива и присваиваем её новой переменной.
Как видишь, переменная НЕ создаётся. Она берется из GLOBALS, куда мы её ложим в твоём случае с помощью оператора new.
Из-за этого твой код и не работает. Объект $tmpl надо определить перед вызовом ф-ции.


--------------------
Linux is like wigwam -- no windows, no gates, apache inside.
PM MAIL Jabber   Вверх
Vaulter
Дата 13.9.2006, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1724
Регистрация: 30.12.2002
Где: бункер

Репутация: 6
Всего: 22



Icaros, возможный путь решения:
сохраняй ошибки во внутренней статичной переменной функции ошибок если не найден класс (isset($tmpl))
если ж найден скидывай из переменной в обьект $tmpl




--------------------
PM MAIL WWW ICQ   Вверх
Icaros
  Дата 14.9.2006, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 26.5.2006

Репутация: нет
Всего: нет



 smile  Мужчины, спасибо. Повысил бы вам репутацию, да постов мало... Проблема оказалась в чересчур говеной идеологии моей же программы  smile , ну это я как-нибудь исправлю (надеюсь). Но раз уж так хорошо объяснили, подскажите еще момент. До вызова функции переменные в этой функции как я понимаю не инициируются или при просмотре скрипта интерпритатор ПХП создает сразу переменные (в моем случае $tmpl) ? 
PM MAIL   Вверх
AztEK
Дата 14.9.2006, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 723
Регистрация: 4.1.2005

Репутация: 6
Всего: 18



Цитата(Icaros @  14.9.2006,  14:10 Найти цитируемый пост)
До вызова функции переменные в этой функции как я понимаю не инициируются

Перечитай мой первый пост. При использовании global переменные не создаются, а берутся уже инициализированные. Так что да, не инициализируются.



--------------------
Linux is like wigwam -- no windows, no gates, apache inside.
PM MAIL Jabber   Вверх
Vaulter
Дата 14.9.2006, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1724
Регистрация: 30.12.2002
Где: бункер

Репутация: 6
Всего: 22



Icaros, четвертый так вообще не интепретирует в изначальном смысле
а сначала компилирует, и выполняет.
отнесись к global как к оператору расширения области видимости переменной.
а НЕ как к оператору создания, копирования или еще чтолибо.


--------------------
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0466 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.