ΠΠΎΠ΄ΡΠ»Ρ ΠΏΠ΅ΡΠ΅Π³ΡΡΠ·ΠΊΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ² ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΡΠ΅Π°ΠΊΡΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΠΏΡΡΡΠΌ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ²:
ΠΡΠΈΡΠΌΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ:
$a::__add($b)$a::__sub($b)$a::__mul($b)$a::__div($b)$a::__mod($b)$a::__pow($b)ΠΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ:
$a::__assign($b)$a::__assign_add($b)$a::__assign_sub($b)$a::__assign_mul($b)$a::__assign_div($b)$a::__assign_mod($b)$a::__assign_pow($b)$a::__assign_bw_and($b)$a::__assign_bw_or($b)$a::__assign_bw_xor($b)$a::__assign_sl($b)$a::__assign_sr($b)$a::__assign_concat($b)ΠΠΎΠ±ΠΈΡΠΎΠ²ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ:
$a::__bw_and($b)$a::__bw_or($b)$a::__bw_xor($b)$a::__bw_not()$a::__sl($b)$a::__sr($b)ΠΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ:
$a::__is_equal($b)$a::__is_not_equal($b)$a::__is_identical($b)$a::__is_not_identical($b)$a::__is_smaller($b)$a::__is_smaller_or_equal($b)$a::__is_greater($b)$a::__is_greater_or_equal($b)$a::__spaceship($b)ΠΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ° ΠΈ Π΄Π΅ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°:
$a::__pre_inc()$a::__post_inc()$a::__pre_dec()$a::__post_dec()Π‘ΡΡΠΎΠΊΠΎΠ²ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ:
$a::__concat($b)Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ ΠΊΠ»Π°ΡΡ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ ΠΏΡΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΠΌΠΎΠ΄ΡΠ»Ρ ΠΏΠ΅ΡΠ΅Π³ΡΡΠ·ΠΊΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ². ΠΠ»Π°ΡΡ ΠΏΠ΅ΡΠ΅Π³ΡΡΠΆΠ°Π΅Ρ Π²ΡΠ΅ Π΄ΠΎΡΡΡΠΏΠ½ΡΠ΅ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π³ΡΡΠ·ΠΊΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ.
ΠΡΠΈΠΌΠ΅Ρ #1 ΠΡΠΈΠΌΠ΅Ρ ΠΊΠ»Π°ΡΡΠ° Ρ ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΏΠ΅ΡΠ΅Π³ΡΡΠ·ΠΊΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ²
<?php
class OperatorOverloading
{
protected mixed $value;
//region Π‘ΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ
public function __get(string $name)
{
return $this->value;
}
public function __set(string $name, mixed $value)
{
$this->value = $value;
}
public function __construct(mixed $init = null)
{
$this->value = $init;
}
//endregion
//region ΠΡΠΈΡΠΌΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ
public function __add(mixed $val): int|float
{
return $this->value + $val;
}
public function __div(mixed $val): int|float
{
return $this->value / $val;
}
public function __mod(mixed $val): int
{
return $this->value % $val;
}
public function __mul(mixed $val): int|float
{
return $this->value * $val;
}
public function __pow(mixed $val): int|float
{
return $this->value ** $val;
}
public function __sub(mixed $val): int|float
{
return $this->value - $val;
}
//endregion
//region ΠΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ
public function __assign(mixed $val): mixed
{
return $this->value = $val;
}
public function __assign_add(mixed $val): mixed
{
return $this->value += $val;
}
public function __assign_bw_and(mixed $val): mixed
{
return $this->value &= $val;
}
public function __assign_bw_or(mixed $val): mixed
{
return $this->value |= $val;
}
public function __assign_concat(mixed $val): string
{
return $this->value .= $val;
}
public function __assign_div(mixed $val): mixed
{
return $this->value /= $val;
}
public function __assign_mod(mixed $val): mixed
{
return $this->value %= $val;
}
public function __assign_mul(mixed $val): mixed
{
return $this->value *= $val;
}
public function __assign_pow(mixed $val): mixed
{
return $this->value **= $val;
}
public function __assign_sl(mixed $val): mixed
{
return $this->value <<= $val;
}
public function __assign_sr(mixed $val): mixed
{
return $this->value >>= $val;
}
public function __assign_sub(mixed $val): mixed
{
return $this->value -= $val;
}
//endregion
//region ΠΠΎΠ±ΠΈΡΠΎΠ²ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ
public function __bw_and(mixed $val): int
{
return $this->value & $val;
}
public function __bw_not(): int|string
{
return ~$this->value;
}
public function __bw_or(mixed $val): int
{
return $this->value | $val;
}
public function __bw_xor(mixed $val): int
{
return $this->value ^ $val;
}
public function __sl(mixed $val): int
{
return $this->value << $val;
}
public function __sr(mixed $val): int
{
return $this->value >> $val;
}
//endregion
//region ΠΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ
public function __is_equal(mixed $val): bool
{
return $this->value == $val;
}
public function __is_greater(mixed $val): bool
{
return $this->value > $val;
}
public function __is_greater_or_equal(mixed $val): bool
{
return $this->value >= $val;
}
public function __is_identical(mixed $val): bool
{
return $this->value === $val;
}
public function __is_not_equal(mixed $val): bool
{
return $this->value != $val;
}
public function __is_not_identical(mixed $val): bool
{
return $this->value !== $val;
}
public function __is_smaller(mixed $val): bool
{
return $this->value < $val;
}
public function __is_smaller_or_equal(mixed $val): bool
{
return $this->value <= $val;
}
public function __spaceship(mixed $val): int
{
return $this->value <=> $val;
}
//endregion
//region ΠΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ° ΠΈ Π΄Π΅ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°
public function __post_dec(): mixed
{
return $this->value--;
}
public function __post_inc(): mixed
{
return $this->value++;
}
public function __pre_dec(): mixed
{
return --$this->value;
}
public function __pre_inc(): mixed
{
return ++$this->value;
}
//endregion
//region Π‘ΡΡΠΎΠΊΠΎΠ²ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ
public function __concat(mixed $val): string
{
return $this->value . $val;
}
//endregion
}Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠ΅Π°ΠΊΡΠΈΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΠΎΡΠ»Π΅ ΠΏΠ΅ΡΠ΅Π³ΡΡΠ·ΠΊΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ² Π² ΠΊΠ»Π°ΡΡΠ΅:
<?php
$a = new OperatorOverloading(5);
var_dump($a + 10);
var_dump($a - 10);
$b = new OperatorOverloading("ΠΡΠΈΠ²Π΅Ρ,");
var_dump($b . " ΠΌΠΈΡ!");ΠΡΠ²ΠΎΠ΄ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°:
int(15) int(-5) string(21) "ΠΡΠΈΠ²Π΅Ρ, ΠΌΠΈΡ!"