Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   Php проблеммы с классами и функциями (https://forum.antichat.xyz/showthread.php?t=43388)

RaiDeRz 30.06.2007 00:41

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";
}} 


hhover 30.06.2007 02:41

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

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

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

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

RaiDeRz 30.06.2007 11:45

Нет, если передавать в качестве параметра или во всех функциях обьявлять все равно непашет ((
точнее, если 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"
}} 


RaiDeRz 04.07.2007 12:25

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

hhover 04.07.2007 12:35

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

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

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

Helios 04.07.2007 19:39

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

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 и все, по идее, заработает.


Время: 07:55