PDA

Просмотр полной версии : Php проблеммы с классами и функциями


RaiDeRz
30.06.2007, 00:41
Вообщем у меня такая проблема использую класс IPBSDK и при работе классе в какой либо функции, он нехочет пахать
простой пример:
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 нет(( если

И еще если сделать так, тоже непашет почему-то и ошибка БД возникает:
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";
}}

hhover
30.06.2007, 02:41
Вся проблема в области видимости разных переменных.

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

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

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

RaiDeRz
30.06.2007, 11:45
Нет, если передавать в качестве параметра или во всех функциях обьявлять все равно непашет ((
точнее, если global везде делаешь, работает только is_loggedin(), а logout непашет
а без этого вообще ничего непашет
и + еще если сделать так, тоже непашет почему-то и ошибка БД возникает:
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
04.07.2007, 12:25
Ну, что никто незнает в чем проблемма?

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

Берешь то класс, который используешь и дописываешь свои функции внутри него.

Helios
04.07.2007, 19:39
По первому посту:

1) Раз уж

echo test();

то замени

echo $output;

на

return $output;


2) Определение одной функции в теле другой:

function test() {
.....
if($SDK->is_loggedin()) {
$output = "User";
} else {
$output = "Guest";
if(isset($_GET) && $_GET['action'] == 'logout') {
_logout();
}
}

function _logout() { ... }
}


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

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