On 09.03.2017 at 21:09, Rowan Collins wrote:

> On 08/03/2017 23:32, Andrey Andreev wrote:
>
>> For example, a Cookie object may have the cookie attributes (domain,
>> path, etc.) as value objects, but they can easily be created from raw
>> strings, while other types would be ambiguous.
>> A similar effect could be desirable for HTTP headers.
> 
> OK, now we have some concrete examples, thanks. I would say that in
> these cases, what you actually want is a much tighter contract: not just
> "can be converted to string", but "intended to be used in this context".
> 
> It fits with what I was saying before about "if you can't name it, maybe
> it isn't the right abstraction". In this case, you want to accept some
> particular value objects but not, say, Exceptions - which are as useless
> for your purpose as an integer, even though (string)$foo would work fine
> on both.
> 
> So you want objects that have promised to behave appropriately for this
> context; that could be as simple as:
> 
> interface HTTPHeaderObject {
>     public function __toString();
> }
> 
> ....with appropriate documentation that objects declaring that they
> implement this interface promise to behave in a specific way when cast
> to string. This is much clearer than detecting __toString(), which only
> promises "I can be cast to string" - the same promise that is made by
> all scalar values.
> 
> In order to accept this or a string in a type hint, you need Union Types:
> 
> function setHeaderValue(string|HTTPHeaderObject $value) { ...

Or you could require the client to pass a respective string wrapper
which extends HTTPHeaderObject instead of a plain string.

-- 
Christoph M. Becker


-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to