Req #72285 [Asn]: SessionHandlerInterface Function Signatures

From: Date: Wed, 09 Dec 2020 15:27:45 +0000
Subject: Req #72285 [Asn]: SessionHandlerInterface Function Signatures
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-230958@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=72285&edit=1

 ID:                 72285
 Updated by:         cmb@php.net
 Reported by:        hpdl at oscommerce dot com
 Summary:            SessionHandlerInterface Function Signatures
 Status:             Assigned
 Type:               Feature/Change Request
 Package:            Session related
 Operating System:   *
 PHP Version:        7.0.7
 Assigned To:        yohgaki
 Block user comment: N
 Private report:     N

 New Comment:

> Then we can argument with covariance if someone leaves the
> scalar types out (=> no BC break) and it still works when people
> use the scalar types.

For the record, this is basically done for PHP 8: scalar parameter
types are specified relying on contravariance to not break BC.
Scalar return types are not specified, again for BC reasons.


Previous Comments:
------------------------------------------------------------------------
[2016-05-30 11:05:07] bwoebi@php.net

Perhaps we just could specify types on internal (non-final) classes and interfaces function
parameters.

Then we can argument with covariance if someone leaves the scalar types out (=> no BC break) and
it still works when people use the scalar types.

------------------------------------------------------------------------
[2016-05-30 09:34:09] yohgaki@php.net

Change Request would be the suitable bug type.

------------------------------------------------------------------------
[2016-05-30 09:31:42] yohgaki@php.net

Object API in session is the main source of session module problems...

------------------------------------------------------------------------
[2016-05-30 05:29:02] krakjoe@php.net

This is not a problem particular to this interface; Many such documentation pages are not in sync
with the code.

The problem is we can't change the code without breaking BC, so I think this is a documentation
problem.

I think we should make effort to inform people that prototypes in documentation don't always
match code, and that it's code (reflection) that you need to look at if you are extending
internal classes.

------------------------------------------------------------------------
[2016-05-30 00:24:33] hpdl at oscommerce dot com

Description:
------------
The documentation for the following functions include parameter type declarations:

SessionHandler::open(string $save_path, string $session_name)
SessionHandler::read(string $session_id)
SessionHandler::write(string $session_id, string $session_data)
SessionHandler::destroy(string $session_id)
SessionHandler::gc(int $maxlifetime)

http://php.net/manual/en/class.sessionhandler.php

however using the same type declarations in the session handler class returns a PHP fatal error.

Also tested with PHP 7.1.0-dev rc3495d5 with the same result.

Test script:
---------------
<?php
class SessionTest implements \SessionHandlerInterface
{
    public function __construct()
    {
        session_set_save_handler($this, true);
    }

    public function open(string $save_path, string $name): bool
    {
        return true;
    }

    public function close(): bool
    {
        return true;
    }

    public function read(string $session_id): string
    {
        return '';
    }

    public function write(string $session_id, string $session_data): bool
    {
        return true;
    }

    public function destroy(string $session_id): bool
    {
        return true;
    }

    public function gc(int $maxlifetime): bool
    {
        return true;
    }
}

$SessionTest = new SessionTest();


Expected result:
----------------
No error should be expected.

Actual result:
--------------
Fatal error: Declaration of SessionTest::open(string $save_path, string $name): bool must be
compatible with SessionHandlerInterface::open($save_path, $session_name) in C:\SessionTest.php on
line 2

Fatal error: Declaration of SessionTest::read(string $session_id): string must be compatible with
SessionHandlerInterface::read($key) in C:\SessionTest.php on line 2

Fatal error: Declaration of SessionTest::write(string $session_id, string $session_data): bool must
be compatible with SessionHandlerInterface::write($key, $val) in C:\SessionTest.php on line 2

Fatal error: Declaration of SessionTest::destroy(string $session_id): bool must be compatible with
SessionHandlerInterface::destroy($key) in C:\SessionTest.php on line 2

Fatal error: Declaration of SessionTest::gc(int $maxlifetime): bool must be compatible with
SessionHandlerInterface::gc($maxlifetime) in C:\SessionTest.php on line 2


------------------------------------------------------------------------



--
Edit this bug report at https://bugs.php.net/bug.php?id=72285&edit=1


Thread (6 messages)

« previous php.bugs (#230958) next »