Bug #71518 [Opn->Sus]: Return type hinting for resources
| From: | requinix@php.net | Date: | Wed, 03 Feb 2016 23:06:41 +0000 |
| Subject: | Bug #71518 [Opn->Sus]: Return type hinting for resources | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-199038@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=71518&edit=1
ID: 71518
Updated by: requinix@php.net
Reported by: almamu at almamu dot com
Summary: Return type hinting for resources
-Status: Open
+Status: Suspended
Type: Bug
Package: Variables related
Operating System: Ubuntu 12.04
PHP Version: 7.0.2
Block user comment: N
Private report: N
New Comment:
IIRC resources were specifically not considered because of two main reasons:
1. "resource" alone isn't helpful: you could have a file handle or GD image or mysqli
connection handle with prepareCURLResource() and PHP wouldn't know that you're using the
wrong type of value.
2. resources are old and really should be converted into classes and objects instead. GMP is an
example. That would, of course, take quite a bit of work, plus there's the logistics of how to
handle things like is_resource().
Check the internals mailing list for discussions about this stuff.
RFCs:
- https://wiki.php.net/rfc/scalar_type_hints_v5
- https://wiki.php.net/rfc/return_types
- https://wiki.php.net/rfc/resource_typehint
Previous Comments:
------------------------------------------------------------------------
[2016-02-03 22:57:26] almamu at almamu dot com
Whopsie, wrote a fast example and made a mistake on one of the var names. The last line of the
example should be:
echo htmlentities(curl_exec($res));
Although, this does not change the current result of the code as it stops at the $res declaration
------------------------------------------------------------------------
[2016-02-03 22:55:39] almamu at almamu dot com
Description:
------------
The return type hinting is not working as expected, in this case I want to return a
"resource" (such as the ones returned by curl functions, mysql functions, etc) but PHP
thinks I must return an instance of an (non-existant) "resource" class, which breaks the
purpose of the return type hinting in this function, the documentation on this lacks some specific
information for some php types (like mixed, object and resource), so I may be making a mistake here
(and probably too much assumptions).
Test script:
---------------
<?php
declare(strict_types=1);
function prepareCURLResource(string $url) : resource
{
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_COOKIEFILE, "/tmp");
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 3);
return $curl;
}
$res = prepareCURLResource("http://localhost");
echo htmlentities(curl_exec($curl));
Expected result:
----------------
The source code of the given URL (http://localhost) in this case.
Actual result:
--------------
[Wed Feb 03 22:46:42 2016] [warn] [client 192.168.100.2] mod_fcgid: stderr: PHP Fatal error:
Uncaught TypeError: Return value of prepareCURLResource() must be an instance of resource, resource
returned in /var/www/test.php:12
[Wed Feb 03 22:46:42 2016] [warn] [client 192.168.100.2] mod_fcgid: stderr: Stack trace:
[Wed Feb 03 22:46:42 2016] [warn] [client 192.168.100.2] mod_fcgid: stderr: #0
/var/www/test.php(15): prepareCURLResource('http://localhost')
[Wed Feb 03 22:46:42 2016] [warn] [client 192.168.100.2] mod_fcgid: stderr: #1 {main}
[Wed Feb 03 22:46:42 2016] [warn] [client 192.168.100.2] mod_fcgid: stderr: thrown in
/var/www/test.php on line 12
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=71518&edit=1