ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > PHP, PERL, MySQL, JavaScript
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Php проблеммы с классами и функциями
  #1  
Старый 30.06.2007, 00:41
Аватар для RaiDeRz
RaiDeRz
Участник форума
Регистрация: 05.04.2007
Сообщений: 123
Провел на форуме:
507350

Репутация: 27
Отправить сообщение для RaiDeRz с помощью ICQ
По умолчанию Php проблеммы с классами и функциями

Вообщем у меня такая проблема использую класс IPBSDK и при работе классе в какой либо функции, он нехочет пахать
простой пример:
PHP код:
echo test();
function 
test() {
include_once(
'ipbsdk/ipbsdk/ipbsdk_class.inc.php');
$SDK = new IPBSDK();
$member $SDK->get_advinfo();
if(
$SDK->is_loggedin()) {
$output "User";
} else {
$output "Guest";
if(isset(
$_GET) && $_GET['action'] == 'logout') {_logout();}
}

    function 
_logout() {
    global 
$SDK;
    
$thisfromurl=$_SERVER["REQUEST_URI"];
    
$thisfromurl=str_replace("action=logout"""$thisfromurl);
    if(!
$SDK->is_loggedin()) {$systemstatus "Вы не авторизированы";}
    else {
$SDK->logout(); header('Location: '.$thisfromurl);}
    
    return 
$output;
    }
echo 
$output;

если ставишь global $SDK в функции(без нее ошибка вообще), то тогда is_loggedin пашет, но другая функция logout нет(( если

И еще если сделать так, тоже непашет почему-то и ошибка БД возникает:
PHP код:
include_once('ipbsdk/ipbsdk/ipbsdk_class.inc.php');
$SDK = new IPBSDK();
echo 
test();
function 
test() {
$member $SDK->get_advinfo();
if(
$SDK->is_loggedin()) {
$output "User";
} else {
$output "Guest";
}} 

Последний раз редактировалось RaiDeRz; 30.06.2007 в 00:59..
 
Ответить с цитированием

  #2  
Старый 30.06.2007, 02:41
Аватар для hhover
hhover
Познающий
Регистрация: 21.05.2007
Сообщений: 61
Провел на форуме:
79888

Репутация: 145
По умолчанию

Вся проблема в области видимости разных переменных.

Скорее всего может заработать, если функции logout() передавать $SDK в качестве параметра, потому-что ты его объявляешь внутри первой функции и соответственно в глобальной области его нет.

Еще можно попробывать объявлять $SDK вне функций и во всех указывать ему global, либо передавать его в качестве параметра.

Но лучшее решение - просто дописать к классу свои методы и не париться.
 
Ответить с цитированием

  #3  
Старый 30.06.2007, 11:45
Аватар для RaiDeRz
RaiDeRz
Участник форума
Регистрация: 05.04.2007
Сообщений: 123
Провел на форуме:
507350

Репутация: 27
Отправить сообщение для RaiDeRz с помощью ICQ
По умолчанию

Нет, если передавать в качестве параметра или во всех функциях обьявлять все равно непашет ((
точнее, если global везде делаешь, работает только is_loggedin(), а logout непашет
а без этого вообще ничего непашет
и + еще если сделать так, тоже непашет почему-то и ошибка БД возникает:
PHP код:
include_once('ipbsdk/ipbsdk/ipbsdk_class.inc.php'); 
$SDK = new IPBSDK(); 
echo 
test(); 
function 
test() { 
$member $SDK->get_advinfo(); 
if(
$SDK->is_loggedin()) { 
$output "User"
} else { 
$output "Guest"
}} 
 
Ответить с цитированием

  #4  
Старый 04.07.2007, 12:25
Аватар для RaiDeRz
RaiDeRz
Участник форума
Регистрация: 05.04.2007
Сообщений: 123
Провел на форуме:
507350

Репутация: 27
Отправить сообщение для RaiDeRz с помощью ICQ
По умолчанию

Ну, что никто незнает в чем проблемма?
 
Ответить с цитированием

  #5  
Старый 04.07.2007, 12:35
Аватар для hhover
hhover
Познающий
Регистрация: 21.05.2007
Сообщений: 61
Провел на форуме:
79888

Репутация: 145
По умолчанию

Внутри методов класса, которые ты вызываешь внутри отдельных функций могут создаваться переменные, которые так и останутся в пределах видимости функции. Из-за этого скорее всего все перебои работоспособности, поэтому тебе нужно сделать их все глобальными...
Цитата:
Сообщение от hhover  
Но лучшее решение - просто дописать к классу свои методы и не париться.
Берешь то класс, который используешь и дописываешь свои функции внутри него.
 
Ответить с цитированием

  #6  
Старый 04.07.2007, 19:39
Аватар для Helios
Helios
Постоянный
Регистрация: 14.01.2007
Сообщений: 459
Провел на форуме:
1469995

Репутация: 589
Отправить сообщение для Helios с помощью ICQ
По умолчанию

По первому посту:

1) Раз уж
PHP код:
echo test(); 
то замени
PHP код:
echo $output
на
PHP код:
return $output
2) Определение одной функции в теле другой:
PHP код:
function test() { 
.....
    if(
$SDK->is_loggedin()) { 
        
$output "User"
    } else { 
        
$output "Guest"
        if(isset(
$_GET) && $_GET['action'] == 'logout') {
            
_logout();
        } 
    } 

    function 
_logout() { ... }

При объявлении таким образом функция _logout() не будет существовать до тех пор, пока интерпритатор не выполнит все что было до ее объявления, а потом интерпретирует и его. У тебя же получается, что вызов функции идет раньше ее определения, отсюда и ошибка.

Вынеси _logout из тела test и все, по идее, заработает.
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Books PHP FRAGNATIC PHP, PERL, MySQL, JavaScript 186 21.02.2010 02:41
Books PSalm69 Избранное 248 27.10.2009 04:52
На PHP, как на "Новые ворота"... Mertvii-Listopad Чужие Статьи 7 18.09.2006 12:42
Безопасность в Php, Часть Iii k00p3r Чужие Статьи 0 11.07.2005 19:02
Защищаем Php. Шаг за шагом. k00p3r Чужие Статьи 0 13.06.2005 11:31



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ