Coercion polymorphism

Нека първо си припомним какво е Implicit type casting в PHP.

<?php
declare(strict_types = 1);

$x = '25';
var_dump($x);       // string(2) "25"
var_dump($x * 2);   // int(50)

Виждаме как PHP сам е извършил type cast към integer за да изпълни аритметичната операция.

Explicit type casting е зададен програмно от нас, когато сами кастваме променлива към друг тип.

При Coercion polymorphism можем да използваме и двата вида type casting, като например с помоща на вторият вид (explicit), може например да кастваме връщаният резултат.

PHP поддържа Coercion polymorphism само ако зададем declare(strict_types = 0); за да разрешим на PHP функциите да приемат аргументи от различен от зададеният тип.

<?php

class SomeClass
{
    private int $a;

    public function setA(int $a): void
    {
        $this->a = $a;
        var_dump($this->a);
    }
}

$p = new SomeClass;
$p->setA(123);      // int(123)
$p->setA(123.45);   // int(123)

Ясно се вижда идеята на тoзи вид полиморфизъм – PHP сам, имплицитно преобразува подаденият аргумент и по този начин можем да използваме въпросният метод както с целочислени, така и с дробни аргументи.