Re: HTTP supergloblas and request body/query (was: Parsing PUT data)

From: Date: Mon, 07 Oct 2013 20:28:05 +0000
Subject: Re: HTTP supergloblas and request body/query (was: Parsing PUT data)
References: 1  Groups: php.internals 
Request: Send a blank email to internals+get-69510@lists.php.net to get a copy of this message
On 07/10/2013 18:19, Daniel Lowrey wrote:
You can't efficiently model an HTTP request with associative
arrays. Period. The fact is that for 99% of use cases, yes you can, and developers happily do so. Leaky abstraction is leaky. If this is truly an efficient model of the HTTP request then why do we fragment it out into $_SERVER and $_COOKIES and $_FILES and $_POST and $_GET and php://input? I don't know what your definition of "efficiently model" is, but it must be different from mine. Array Oriented Programming !== design.
Ah, OK, I was only really talking about $_POST and $_GET, since they were the topic of this thread. I'm not quite sure why breaking different aspects of the HTTP request into different interfaces is fundamentally a problem, but I agree that you can't model /all/ aspects of an HTTP request as associative arrays. To go through the relevant superglobals in turn: $_GET: The param=value&... format for query strings is so universal, whether or not generated by a form, that it can largely be taken for granted. Within that format, the only thing that can't be handled as a hash is a repeated key; PHP takes the approach that foo[]=bar always creates an array, and foo=bar never does, with later values "winning". This covers 99% of what people need to do with query strings. The mutability and globalness aren't great, but any method ->getQueryStringParam('foo') would be indistinguishable from ->getQueryStringHash()['foo'] $_POST: Deals with the two generally accepted form encodings for POST requests, in a way that matches $_GET, but while allowing programmers to distinguish the two rather than clobbering thm into one array. $_COOKIE: Again, the structure of the Cookie: header in PHP is fundamentally a set of name=value pairs, making a hash a perfectly reasonable structure. The asymmetry with set_cookie() is unfortunate, although some asymmetry is inevitable given the underlying headers. At least it's better than the abomination that is document.cookie :P $_REQUEST: This is an unnecessary bit of redundancy, although it reminds me that if you do want to merge query string and posted data, having them as hashes is very handy. $_FILES: A bit awkward. I can guess the argument for splitting it from $_POST, but it's crying out for a more OO representation of the individual entries. They're still name-value pairs though. $_SERVER: This is the only one that really doesn't work at all. I was going to mention it earlier, but didn't want to drift off-topic in my earlier messages. It's an awful jumble of HTTP headers, PHP-specific data, and arbitrary environment variables which happen to have come through from the SAPI. It contains the requested URL in various parts with inconsistent names, and I refuse to go near it without a sane wrapper class. HTTP headers are fundamentally key-value pairs, although they can repeat, so more like key -> array of values. Environment variables are key-value too. The rest of it, along with file_get_contents('php://input'), is odds and ends that need a separate abstraction. Well, that's the way I see it anyway. The superglobals themselves aren't great, but outside of APIs (which will generally involve a bit of framework-y-ness anyway) the associative array interface is what most people will end up wanting anyway. Regards, -- Rowan Collins [IMSoP]

« previous php.internals (#69510) next »