473,581 Members | 6,641 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

how it works? pass a function as array(&$sess_ha ndler, '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 <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 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) ;
}
}
?>
Apr 17 '06 #1
4 149160
_Mario.lat wrote:
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?


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
Apr 17 '06 #2
_Mario.lat wrote:
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.


<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.
js*******@attgl obal.net
=============== ===
Apr 17 '06 #3
> 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.

Apr 17 '06 #4
d
"Sjoerd" <sj******@gmail .com> wrote in message
news:11******** *************@g 10g2000cwb.goog legroups.com...
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.


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
2200
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 "include". There are two functions written in this included file: ===========================================================================
4
2032
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 value=2>Two</OPTION>" Response.Write "<OPTION value=3>Three</OPTION>" Response.Write "</SELECT>" Response.Write "</form>"
4
15020
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 //DB.attachAdapter // DB.isOpen // do this function - which does something different every time
4
2785
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 with only "" displayed in an otherwise empty window. To restore the datagrid in that window, I have to use the browsers "back" button. How can I...
1
1806
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 like to include survey.asp in a different asp file, let's call it main.asp, and display several surveys.
3
2532
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(){} private:
4
1558
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 having to do with an "Unhandled exception:access violation". I'm new to vectors, and from what I can tell I did something wrong with the 2-dim...
7
8405
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' program and the file containing the user function included. 3. When the program is invoked, the user is asked how his function is named (f.e. function1)....
4
15774
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) {...}
0
7788
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it. First, let's disable language...
0
8137
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed. This is as boiled down as I can make it. ...
0
8299
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that...
1
7887
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For...
0
6543
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then...
1
5667
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules. He will explain when you may want to use classes...
0
5355
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one. At the time of converting from word file to html my equations which are in the word document file was convert...
0
3797
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols. I succeeded, with both firewalls in...
1
1397
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.

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.