Вообщем у меня такая проблема использую класс 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"; }}
Вся проблема в области видимости разных переменных. Скорее всего может заработать, если функции logout() передавать $SDK в качестве параметра, потому-что ты его объявляешь внутри первой функции и соответственно в глобальной области его нет. Еще можно попробывать объявлять $SDK вне функций и во всех указывать ему global, либо передавать его в качестве параметра. Но лучшее решение - просто дописать к классу свои методы и не париться.
Нет, если передавать в качестве параметра или во всех функциях обьявлять все равно непашет (( точнее, если 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"; }}
Внутри методов класса, которые ты вызываешь внутри отдельных функций могут создаваться переменные, которые так и останутся в пределах видимости функции. Из-за этого скорее всего все перебои работоспособности, поэтому тебе нужно сделать их все глобальными... Берешь то класс, который используешь и дописываешь свои функции внутри него.
По первому посту: 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 и все, по идее, заработает.