Hi PHPers,
As I have been following the discussion about the need for a "true" type to
allow documenting that a function should only be able to return true vs. bool
which would allow false, and in the past the same argument for false vs. true,
it occurs to me that there is another approach to address this rather than add
values to be types which AFAIK has not been mentioned on the list before.
An alternate solution to possibly consider might be to add the concept of
"constraints" to PHP that could work alongside types. This occured to me
because I am mostly doing Go programming now and constraints is effectively how
Go handled an equivalent conundrum for the Generics they just added.
Consider if PHP allowed the following and if PHP would allow type hints to use
*either* a type *or* a constraint where the values on the right hand side are
expressions (I was just spitballing the syntax; other syntaxes or even concept
names might represent this concept better):
constraint true: true
constraint false: false
If we had constraints in PHP we could also have things like this:
constraint Truthy: !empty($this)
constraint Falsey: empty($this)
constraint Percent: is_numeric($this) && 0 <= $this && $this <=100
constraint DateTimeable: is_object($this)
&& (get_class=($this) == DateTime::class || get_class=($this)
== DateTimeImmutable::class)
constraint ProductID: is_string($this) && strlen($this)==10
&& preg_match("#[A-Z]{2}[0-9]{8}#",$this)
With the above, we could write functions like this and know they are more "type
safe" than otherwise:
function product_exists(ProductID $product_id):bool {...}
Constraints could also be limited to using only standard library functions so
that it would be possible to do static analysis on a constraint. Clearly a
static analyzer could evaluate the constraints I represented above. And I
*think* this could be backward compatible with false as a type, and even true
with a type.
FWIW I am just offering up an approach that seems to have worked well in Go for
consideration. If you like it, please discuss it. If not, it was worth a try.
-Mike
P.S. I am sure there are many ways to improve what I proposed. Note this is
*just* a straw man proposal; please offer suggestions for improvement.