Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
Php проблеммы с классами и функциями |

30.06.2007, 00:41
|
|
Участник форума
Регистрация: 05.04.2007
Сообщений: 123
Провел на форуме: 507350
Репутация:
27
|
|
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..
|
|
|

30.06.2007, 02:41
|
|
Познающий
Регистрация: 21.05.2007
Сообщений: 61
Провел на форуме: 79888
Репутация:
145
|
|
Вся проблема в области видимости разных переменных.
Скорее всего может заработать, если функции logout() передавать $SDK в качестве параметра, потому-что ты его объявляешь внутри первой функции и соответственно в глобальной области его нет.
Еще можно попробывать объявлять $SDK вне функций и во всех указывать ему global, либо передавать его в качестве параметра.
Но лучшее решение - просто дописать к классу свои методы и не париться.
|
|
|

30.06.2007, 11:45
|
|
Участник форума
Регистрация: 05.04.2007
Сообщений: 123
Провел на форуме: 507350
Репутация:
27
|
|
Нет, если передавать в качестве параметра или во всех функциях обьявлять все равно непашет ((
точнее, если 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";
}}
|
|
|

04.07.2007, 12:25
|
|
Участник форума
Регистрация: 05.04.2007
Сообщений: 123
Провел на форуме: 507350
Репутация:
27
|
|
Ну, что никто незнает в чем проблемма?
|
|
|

04.07.2007, 12:35
|
|
Познающий
Регистрация: 21.05.2007
Сообщений: 61
Провел на форуме: 79888
Репутация:
145
|
|
Внутри методов класса, которые ты вызываешь внутри отдельных функций могут создаваться переменные, которые так и останутся в пределах видимости функции. Из-за этого скорее всего все перебои работоспособности, поэтому тебе нужно сделать их все глобальными...
Сообщение от hhover
Но лучшее решение - просто дописать к классу свои методы и не париться.
Берешь то класс, который используешь и дописываешь свои функции внутри него.
|
|
|

04.07.2007, 19:39
|
|
Постоянный
Регистрация: 14.01.2007
Сообщений: 459
Провел на форуме: 1469995
Репутация:
589
|
|
По первому посту:
1) Раз уж
то замени
на
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 и все, по идее, заработает.
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|