|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2005-11-18 19:08 UTC] mike at naberezny dot com
Description:
------------
The session extension does not respect the visibility of the __sleep() method. If __sleep() is protected or private, calling serialize() will raise a fatal error. However, the session extension will still serialize it.
Reproduce code:
---------------
<?php
class Foo { protected function __sleep() {} }
$_SESSION['foo'] = new Foo();
var_dump($_SESSION['foo']);
?>
Expected result:
----------------
"Fatal error: Call to protected method Foo::__sleep() from context..." at the time of assignment.
Actual result:
--------------
object(Foo)#1 (0) {
}
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Sat Nov 15 12:00:01 2025 UTC |
The result is the same using the latest Win32 build from snaps. C:\php5.1>php -n -v PHP 5.1.0RC7-dev (cli) (built: Nov 18 2005 16:36:58) Copyright (c) 1997-2005 The PHP Group Zend Engine v2.1.0-dev, Copyright (c) 1998-2005 Zend Technologies C:\php5.1>php -n -r "class Foo { protected function __sleep() {} } $_SESSION['foo'] = new Foo(); var_dump($_SESSION['foo']);" object(Foo)#1 (0) { }That's interesting, because I get the following: object(Foo)#1 (0) { } Fatal error: Call to protected method Foo::__sleep() from context '' in Unknown on line 0 Please check your display_errors and error_reporting settings.I get these 2 error when trying to extend my session: Fatal error: Call to private method UserSession::session_write() from context '' in Unknown on line 0 Fatal error: Call to private method UserSession::session_close() from context '' in Unknown on line 0 This is how it looks (function is called in UserSession cnstructor): session_set_save_handler( array(&$this, 'session_open'), array(&$this, 'session_close'), array(&$this, 'session_read'), array(&$this, 'session_write'), array(&$this, 'session_destroy'), array(&$this, 'session_gc') ); All UserSession methods are PRIVATE and only write and close raises FATAL ERROR ... Changing visibility to public solves the problem... and I don't know why ...