how it works? pass a function as array(&$sess_handler, 'open') instead of '$sess_handler->open'

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • _Mario.lat

    how it works? pass a function as array(&$sess_handler, 'open') instead of '$sess_handler->open'

    Hallo,
    I have a little question:
    In the function session_set_sav e_handler I can pass the name of function
    which deal with session.
    In Xoops code I see the use of this function like that:

    session_set_sav e_handler(array (&$sess_handler , 'open'),
    array(&$sess_ha ndler, 'close'), array(&$sess_ha ndler, 'read'),
    array(&$sess_ha ndler, 'write'), array(&$sess_ha ndler, 'destroy'),
    array(&$sess_ha ndler, 'gc'));

    How does it works?
    why it use "array(&$sess_h andler, 'open')" and not "$sess_hand ler->open"
    ? How "array(&$sess_h andler, 'open')" works?
    Thank you in advance for the time you'll spend for me. Mario.


    Following the code of the class $sess_handler:

    <?php
    // $Id: session.php,v 1.3 2004/01/02 19:15:13 okazu Exp $
    // ------------------------------------------------------------------------ //
    // XOOPS - PHP Content Management System //
    // Copyright (c) 2000 XOOPS.org //
    // <http://www.xoops.org/> //
    // ------------------------------------------------------------------------ //
    // This program is free software; you can redistribute it and/or modify //
    // it under the terms of the GNU General Public License as published by //
    // the Free Software Foundation; either version 2 of the License, or //
    // (at your option) any later version. //
    // //
    // You may not change or alter any portion of this comment or credits //
    // of supporting developers from this source code or any supporting //
    // source code which is considered copyrighted (c) material of the //
    // original comment or credit authors. //
    // //
    // This program is distributed in the hope that it will be useful, //
    // but WITHOUT ANY WARRANTY; without even the implied warranty of //
    // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
    // GNU General Public License for more details. //
    // //
    // You should have received a copy of the GNU General Public License //
    // along with this program; if not, write to the Free Software //
    // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA //
    // ------------------------------------------------------------------------ //
    // Author: Kazumi Ono (AKA onokazu) //
    // URL: http://www.myweb.ne.jp/, http://www.xoops.org/, http://jp.xoops.org/ //
    // Project: The XOOPS Project //
    // ------------------------------------------------------------------------- //
    /**
    * @package kernel
    *
    * @author Kazumi Ono <onokazu@xoops. org>
    * @copyright copyright (c) 2000-2003 XOOPS.org
    */


    /**
    * Handler for a session
    * @package kernel
    *
    * @author Kazumi Ono <onokazu@xoops. org>
    * @copyright copyright (c) 2000-2003 XOOPS.org
    */
    class XoopsSessionHan dler
    {

    /**
    * Database connection
    *
    * @var object
    * @access private
    */
    var $db;

    /**
    * Constructor
    *
    * @param object &$mf reference to a XoopsManagerFac tory
    *
    */
    function XoopsSessionHan dler(&$db)
    {
    $this->db =& $db;
    }

    /**
    * Open a session
    *
    * @param string $save_path
    * @param string $session_name
    *
    * @return bool
    */
    function open($save_path , $session_name)
    {
    return true;
    }

    /**
    * Close a session
    *
    * @return bool
    */
    function close()
    {
    return true;
    }

    /**
    * Read a session from the database
    *
    * @param string &sess_id ID of the session
    *
    * @return array Session data
    */
    function read($sess_id)
    {
    $sql = sprintf('SELECT sess_data FROM %s WHERE sess_id = %s', $this->db->prefix('sessio n'), $this->db->quoteString($s ess_id));
    if (false != $result = $this->db->query($sql)) {
    if (list($sess_dat a) = $this->db->fetchRow($resu lt)) {
    return $sess_data;
    }
    }
    return '';
    }

    /**
    * Write a session to the database
    *
    * @param string $sess_id
    * @param string $sess_data
    *
    * @return bool
    **/
    function write($sess_id, $sess_data)
    {
    $sess_id = $this->db->quoteString($s ess_id);
    list($count) = $this->db->fetchRow($th is->db->query("SELEC T COUNT(*) FROM ".$this->db->prefix('sessio n')." WHERE sess_id=".$sess _id));
    if ( $count > 0 ) {
    $sql = sprintf('UPDATE %s SET sess_updated = %u, sess_data = %s WHERE sess_id = %s', $this->db->prefix('sessio n'), time(), $this->db->quoteString($s ess_data), $sess_id);
    } else {
    $sql = sprintf('INSERT INTO %s (sess_id, sess_updated, sess_ip, sess_data) VALUES (%s, %u, %s, %s)', $this->db->prefix('sessio n'), $sess_id, time(), $this->db->quoteString($_ SERVER['REMOTE_ADDR']), $this->db->quoteString($s ess_data));
    }
    if (!$this->db->queryF($sql) ) {
    return false;
    }
    return true;
    }

    /**
    * Destroy a session
    *
    * @param string $sess_id
    *
    * @return bool
    **/
    function destroy($sess_i d)
    {
    $sql = sprintf('DELETE FROM %s WHERE sess_id = %s', $this->db->prefix('sessio n'), $this->db->quoteString($s ess_id));
    if ( !$result = $this->db->queryF($sql) ) {
    return false;
    }
    return true;
    }

    /**
    * Garbage Collector
    *
    * @param int $expire Time in seconds until a session expires
    * @return bool
    **/
    function gc($expire)
    {
    $mintime = time() - intval($expire) ;
    $sql = sprintf('DELETE FROM %s WHERE sess_updated < %u', $this->db->prefix('sessio n'), $mintime);
    return $this->db->queryF($sql) ;
    }
    }
    ?>


  • Janwillem Borleffs

    #2
    Re: how it works? pass a function as array(&amp;$ses s_handler, 'open') instead of '$sess_handler-&gt;open'

    _Mario.lat wrote:[color=blue]
    > How does it works?
    > why it use "array(&$sess_h andler, 'open')" and not
    > "$sess_hand ler->open" ? How "array(&$sess_h andler, 'open')" works?
    >[/color]

    You should read this as array(reference _to_object, object_method_t o_call);

    In this case, when the session starts, the 'open' method within the
    $sess_handler object instance is called with $savePath and $sessName as its
    arguments. Where $sess_handler->open is a property call, the passing of the
    array containing the object instance and the method (handler) name, only
    sets up the specific session handler for later usage.

    BTW, there are other functions using the same scheme, like call_user_func:

    class Foo {
    function Bar($name) {
    print "Hello $name";
    }
    }

    call_user_func( array(new Foo, 'Bar'), 'John');


    HTH;
    JW


    Comment

    • Jerry Stuckle

      #3
      Re: how it works? pass a function as array(&amp;$ses s_handler, 'open')instead of '$sess_handler-&gt;open'

      _Mario.lat wrote:[color=blue]
      > Hallo,
      > I have a little question:
      > In the function session_set_sav e_handler I can pass the name of function
      > which deal with session.
      > In Xoops code I see the use of this function like that:
      >
      > session_set_sav e_handler(array (&$sess_handler , 'open'),
      > array(&$sess_ha ndler, 'close'), array(&$sess_ha ndler, 'read'),
      > array(&$sess_ha ndler, 'write'), array(&$sess_ha ndler, 'destroy'),
      > array(&$sess_ha ndler, 'gc'));
      >
      > How does it works?
      > why it use "array(&$sess_h andler, 'open')" and not "$sess_hand ler->open"
      > ? How "array(&$sess_h andler, 'open')" works?
      > Thank you in advance for the time you'll spend for me. Mario.
      >
      >[/color]

      <code snipped>

      You can't just pass $sess)handler->open to the function because it is a member
      (method) of a class. And to call a non-static method, you need an object of
      that class.

      $sess_handler->open is just a pointer to the function; it doesn't have an object
      associated to it. So if you were to call it, there would be no object for the
      method to use.

      OTOH, when you pass array(&$sess_ha ndler, 'open'), you are passing an object
      ($sess_handler) by reference. You are also passing the name of a method
      ('open') as a string. So session_set_sav e_handler has all it needs to use the
      class - an object and a method. And it has this information for each of the six
      methods it needs.

      Hope this is clear.


      --
      =============== ===
      Remove the "x" from my email address
      Jerry Stuckle
      JDS Computer Training Corp.
      jstucklex@attgl obal.net
      =============== ===

      Comment

      • Sjoerd

        #4
        Re: how it works? pass a function as array(&amp;$ses s_handler, 'open') instead of '$sess_handler-&gt;open'

        > session_set_sav e_handler(array (&$sess_handler , 'open'),

        The first parameter would be the object on which to invoke a method.
        The second parameter would be the name of the method ('open').

        In session_set_sav e_handler, when an open occurs, it calls
        $sess_handler->$name_of_metho d. The method $sess_handler->open is
        actually a callback function.

        Without the use of objects, a callback function would be a normal
        function. You would pass the name of the function as a parameter:

        <?php
        function foo($functionna me) {
        echo $functionname(' hello');
        }

        foo('strtoupper ');
        ?>

        As you can see, 'strtoupper' is passed as a parameter and then used as
        a function.

        This won't work for objects:
        <?php
        foo('$obj->open');
        foo('Object::Op en');
        ?>

        The first does not work because the variable $obj is not passed
        correctly. The second way also does not work, but I can not think of a
        good reason why it doesn't.

        The right way, design-wise, to set a handler is to pass an object which
        implements an interface. The interface specifies which methods an
        object has to have, such as open, close, etc. You then pass an object
        which implements this interface and the methods within this object can
        be called.

        Comment

        • d

          #5
          Re: how it works? pass a function as array(&amp;$ses s_handler, 'open') instead of '$sess_handler-&gt;open'

          "Sjoerd" <sjoerder@gmail .com> wrote in message
          news:1145274125 .993793.71410@g 10g2000cwb.goog legroups.com...[color=blue][color=green]
          >> session_set_sav e_handler(array (&$sess_handler , 'open'),[/color]
          >
          > The first parameter would be the object on which to invoke a method.
          > The second parameter would be the name of the method ('open').
          >
          > In session_set_sav e_handler, when an open occurs, it calls
          > $sess_handler->$name_of_metho d. The method $sess_handler->open is
          > actually a callback function.
          >
          > Without the use of objects, a callback function would be a normal
          > function. You would pass the name of the function as a parameter:
          >
          > <?php
          > function foo($functionna me) {
          > echo $functionname(' hello');
          > }
          >
          > foo('strtoupper ');
          > ?>
          >
          > As you can see, 'strtoupper' is passed as a parameter and then used as
          > a function.
          >
          > This won't work for objects:
          > <?php
          > foo('$obj->open');
          > foo('Object::Op en');
          > ?>
          >
          > The first does not work because the variable $obj is not passed
          > correctly. The second way also does not work, but I can not think of a
          > good reason why it doesn't.[/color]

          It's because of the :: - that's part of the language, and not a part of the
          variable name. $object::$func would be the equivalent, but that requires
          two parameters to pass, whereas using an array means it's one parameter,
          which means it's the same for functions and member functions.
          [color=blue]
          > The right way, design-wise, to set a handler is to pass an object which
          > implements an interface. The interface specifies which methods an
          > object has to have, such as open, close, etc. You then pass an object
          > which implements this interface and the methods within this object can
          > be called.
          >[/color]


          Comment

          Working...