By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
458,146 Members | 1,631 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 458,146 IT Pros & Developers. It's quick & easy.

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

P: n/a
Hallo,
I have a little question:
In the function session_set_save_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_save_handler(array(&$sess_handler, 'open'),
array(&$sess_handler, 'close'), array(&$sess_handler, 'read'),
array(&$sess_handler, 'write'), array(&$sess_handler, 'destroy'),
array(&$sess_handler, 'gc'));

How does it works?
why it use "array(&$sess_handler, 'open')" and not "$sess_handler->open"
? How "array(&$sess_handler, '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 <on*****@xoops.org>
* @copyright copyright (c) 2000-2003 XOOPS.org
*/
/**
* Handler for a session
* @package kernel
*
* @author Kazumi Ono <on*****@xoops.org>
* @copyright copyright (c) 2000-2003 XOOPS.org
*/
class XoopsSessionHandler
{

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

/**
* Constructor
*
* @param object &$mf reference to a XoopsManagerFactory
*
*/
function XoopsSessionHandler(&$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('session'), $this->db->quoteString($sess_id));
if (false != $result = $this->db->query($sql)) {
if (list($sess_data) = $this->db->fetchRow($result)) {
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($sess_id);
list($count) = $this->db->fetchRow($this->db->query("SELECT COUNT(*) FROM ".$this->db->prefix('session')." 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('session'), time(), $this->db->quoteString($sess_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('session'), $sess_id, time(), $this->db->quoteString($_SERVER['REMOTE_ADDR']), $this->db->quoteString($sess_data));
}
if (!$this->db->queryF($sql)) {
return false;
}
return true;
}

/**
* Destroy a session
*
* @param string $sess_id
*
* @return bool
**/
function destroy($sess_id)
{
$sql = sprintf('DELETE FROM %s WHERE sess_id = %s', $this->db->prefix('session'), $this->db->quoteString($sess_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('session'), $mintime);
return $this->db->queryF($sql);
}
}
?>
Apr 17 '06 #1
Share this Question
Share on Google+
4 Replies


P: n/a
_Mario.lat wrote:
How does it works?
why it use "array(&$sess_handler, 'open')" and not
"$sess_handler->open" ? How "array(&$sess_handler, 'open')" works?


You should read this as array(reference_to_object, object_method_to_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
Apr 17 '06 #2

P: n/a
_Mario.lat wrote:
Hallo,
I have a little question:
In the function session_set_save_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_save_handler(array(&$sess_handler, 'open'),
array(&$sess_handler, 'close'), array(&$sess_handler, 'read'),
array(&$sess_handler, 'write'), array(&$sess_handler, 'destroy'),
array(&$sess_handler, 'gc'));

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


<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_handler, '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_save_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.
js*******@attglobal.net
==================
Apr 17 '06 #3

P: n/a
> session_set_save_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_save_handler, when an open occurs, it calls
$sess_handler->$name_of_method. 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($functionname) {
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::Open');
?>

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.

Apr 17 '06 #4

P: n/a
d
"Sjoerd" <sj******@gmail.com> wrote in message
news:11*********************@g10g2000cwb.googlegro ups.com...
session_set_save_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_save_handler, when an open occurs, it calls
$sess_handler->$name_of_method. 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($functionname) {
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::Open');
?>

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.


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.
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.

Apr 17 '06 #5

This discussion thread is closed

Replies have been disabled for this discussion.