On Wed, Apr 22, 2020 at 11:10 PM Barney Laurance <bar...@redmagic.org.uk> wrote:
>
> The union of all other types is the top type, but I think as used in phpDoc
> mixed is often really a dynamic type, rather than a top type.
>
> The top type (e.g. Typescript's 'unknown') is the supertype of all other
> types,
> while the dynamic type (e.g. Typescripts 'any') is simultaneously a
> supertype
> and a subtype of all other types.

In Typescript (statically typed), both `any` and `unknown` are
"supertype", but the former basically disables compile-time type
checking (and opens for runtime errors) while the latter requires you
write type checks/assertions. I guess `undefined` would be the actual "subtype".
(By the way, unlike PHP, Typescript considers `void` a data type, i.e.
you can have a "void variable" and assign it the value `undefined`.)

Anyway, <https://docs.phpdoc.org/latest/guides/types.html> defines
`mixed` as "A value with this type can be literally anything; the
author of the documentation is unable to predict which type it will
be" (even if some also use it where a union of a subset of types would
be more accurate).

> Taking a random example, arguments to str_replace documented as mixed
> accept string|array and not anything else.

Indeed, 
<https://www.php.net/manual/en/language.pseudo-types.php#language.types.mixed>
currently says that, in the PHP documentation, "`mixed` indicates that
a parameter may accept multiple (but not necessarily all) types", and
gives two examples:
<https://www.php.net/manual/en/function.gettype.php> is accurate, but
<https://www.php.net/manual/en/function.str-replace.php> IMO should
just use `string|array` rather than `mixed` (that's already the case
in 
<https://github.com/php/php-src/blob/master/ext/standard/basic_functions.stub.php#L649-L655>).

> So maybe the LSP rules shouldn't apply as described in the RFC to mixed. If
> str_replace was a class method it might be OK for a subclass to change the
> param type to e.g.  array|string|int.
>
> That would leave scope for adding a real top type in a later RFC.

I'd rather have the docs "fixed" (but I suspect `str_replace` is not
the only place where `mixed` is used in an "approximate" fashion).

`mixed` as defined by this RFC (i.e. equivalent to the
currently-impossible-to-write union of all primitive types, including
resource and null [but not void that is not a data type])
is LSP-conformant.

Regards,

--
Guilliam Xavier

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

Reply via email to