473,289 Members | 1,829 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,289 software developers and data experts.

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_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
4 132679
_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
_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
> 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
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 thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

7
by: knoak | last post by:
Hi there, I have a site with just a few pages. (e.g. home.php) In every page there is another page included with things like the header etc. The included file is in a subdirectory called...
4
by: Jack | last post by:
Hello, <%@ Language=VBScript %> <% Response.Write "<form name=form1>" Response.Write "<SELECT id=select1 name=select1>" Response.Write "<OPTION value=1>One</OPTION>" Response.Write "<OPTION...
4
by: R Reyes | last post by:
trying to shorten up code by passing a function name as a parameter. Here is what it looks like: function doSomething(function myFunctionName()) { // some code like: // DB.createAdapter...
4
by: KenG | last post by:
Hi: I have a datagrid that builds a hyperling which uses javascript to open a new window. The new window opens and displays fine, however, the original window that has the grid, is now blank...
1
by: jacobyv | last post by:
hi i created survey.asp which displays the survey passed through the name paramter in the url. it works fine if i open the page like this. http://url/survey.asp?name=survey1 but now i would...
3
by: jimhce | last post by:
Hi, How can a child class passes its non-static member function to the parent class? class A { public: typedef void *(*object_t)(void *); A(object_t f) : func(f) {} virtual ~A(){}...
4
by: demonbunny666 | last post by:
I'm trying to get this program to work, but I am running into a problem and as hard as I try I can't figure it out. It compiles fine( VS Studio 6.0) but when it executes a problem occurs, something...
7
by: dries | last post by:
Hello lads, I'd like to do the following in C: 1. The user writes a function with predefined arguments and return value in a separate file. 2. The program is compiled as my written 'main'...
4
by: soni2926 | last post by:
hi, is it possible to pass a function into another function as a parameter? Say i have these: function SaveMe(text) {...} function SaveMeNow(text) {...}
2
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 7 Feb 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:30 (7.30PM). In this month's session, the creator of the excellent VBE...
0
by: DolphinDB | last post by:
The formulas of 101 quantitative trading alphas used by WorldQuant were presented in the paper 101 Formulaic Alphas. However, some formulas are complex, leading to challenges in calculation. Take...
0
by: DolphinDB | last post by:
Tired of spending countless mintues downsampling your data? Look no further! In this article, you’ll learn how to efficiently downsample 6.48 billion high-frequency records to 61 million...
0
by: Aftab Ahmad | last post by:
Hello Experts! I have written a code in MS Access for a cmd called "WhatsApp Message" to open WhatsApp using that very code but the problem is that it gives a popup message everytime I clicked on...
0
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...
0
by: marcoviolo | last post by:
Dear all, I would like to implement on my worksheet an vlookup dynamic , that consider a change of pivot excel via win32com, from an external excel (without open it) and save the new file into a...
1
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...
0
by: jfyes | last post by:
As a hardware engineer, after seeing that CEIWEI recently released a new tool for Modbus RTU Over TCP/UDP filtering and monitoring, I actively went to its official website to take a look. It turned...
1
by: PapaRatzi | last post by:
Hello, I am teaching myself MS Access forms design and Visual Basic. I've created a table to capture a list of Top 30 singles and forms to capture new entries. The final step is a form (unbound)...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.