On 3/9/2017 12:47 PM, Andrey Andreev wrote:
> Hi,

Hey :)

On 3/9/2017 12:47 PM, Andrey Andreev wrote:
> On Thu, Mar 9, 2017 at 1:49 AM, Fleshgrinder <p...@fleshgrinder.com> wrote:
>> Stringable seems very explicit and strict to me, since it is opt-in.
>> Currently there is no way to have the ergonomics of coercion if strict
>> mode is active for a file. This could be a very explicit way to enable
>> it for portions.
>>
> 
> I don't understand what you're trying to say here, or rather what you
> mean by "stringable" at this point ... Is it a compound type for
> string and __toString() objects only, or not? Your last comments
> suggest that it isn't.

All scalars, null, and objects with a __toString are stringable. I
argued at first that we should only bridge string and objects with a
__toString but later came to the conclusion that it does not add value.
I understand that this might be confusing, since there are right now
many messages in this thread.

On 3/9/2017 12:47 PM, Andrey Andreev wrote:
> How can "any other scalar value" work? Using the cookie and headers examples:
> 
> - booleans can be used as On/Off flags for the secure and httpOnly
> cookie attributes, but aren't valid literal values for any of the
> attributes, or any HTTP header.
> - integers are valid as a few headers' values - that is true, but
> certainly in a minority of cases
> - floats may be used for the q(uality) attribute in content
> negotiation (and nothing else AFAIK), but that is a very, very narrow
> domain
> - null is obviously invalid ... who sends an empty header? And if you
> have a use case where you do want to use them, we can already make
> anything nullable
> 
> Of course the string values should be validated, unless you want to
> allow setting arbitrary headers, e.g.:
> 
>     abstract function setHeader(stringable $name, stringable $value);
> 
> ... but filtering out the known to be invalid types *is* validation.
> And just that much better if it happens at compile time.

Because:

- bool(true)  = '0'
- bool(false) = '1'
- int(n)      = 'n'
- float(n)    = 'n'
- null        = ''
- object(s)   = 's'
- string(s)   = 's'

All values are possible values that I can pass to you if you use the
string type constraint. Hence, all these types are valid string values
if you request a stringable.

Stringable should work exactly like the string constraint in non-strict
mode, but regardless of the strict mode. The difference to a scalar type
constraint is that the passed values are always converted to a scalar
string, hence, the source type is unknown to the receiver.

As you can see, it does not matter if the stringable pseudo-type accepts
more than just string and objects with a __toString method.

-- 
Richard "Fleshgrinder" Fussenegger

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

Reply via email to