Php проблеммы с классами и функциями

Discussion in 'PHP' started by RaiDeRz, 30 Jun 2007.

  1. RaiDeRz

    RaiDeRz Elder - Старейшина

    Joined:
    5 Apr 2007
    Messages:
    121
    Likes Received:
    5
    Reputations:
    0
    Вообщем у меня такая проблема использую класс 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";
    }}
     
    #1 RaiDeRz, 30 Jun 2007
    Last edited: 30 Jun 2007
  2. hhover

    hhover Elder - Старейшина

    Joined:
    21 May 2007
    Messages:
    60
    Likes Received:
    36
    Reputations:
    11
    Вся проблема в области видимости разных переменных.

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

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

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

    RaiDeRz Elder - Старейшина

    Joined:
    5 Apr 2007
    Messages:
    121
    Likes Received:
    5
    Reputations:
    0
    Нет, если передавать в качестве параметра или во всех функциях обьявлять все равно непашет ((
    точнее, если 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. RaiDeRz

    RaiDeRz Elder - Старейшина

    Joined:
    5 Apr 2007
    Messages:
    121
    Likes Received:
    5
    Reputations:
    0
    Ну, что никто незнает в чем проблемма?
     
  5. hhover

    hhover Elder - Старейшина

    Joined:
    21 May 2007
    Messages:
    60
    Likes Received:
    36
    Reputations:
    11
    Внутри методов класса, которые ты вызываешь внутри отдельных функций могут создаваться переменные, которые так и останутся в пределах видимости функции. Из-за этого скорее всего все перебои работоспособности, поэтому тебе нужно сделать их все глобальными...
    Берешь то класс, который используешь и дописываешь свои функции внутри него.
     
  6. Helios

    Helios Elder - Старейшина

    Joined:
    14 Jan 2007
    Messages:
    414
    Likes Received:
    180
    Reputations:
    103
    По первому посту:

    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 и все, по идее, заработает.
     
Loading...
Similar Threads - проблеммы классами функциями
  1. GAiN
    Replies:
    4
    Views:
    6,881