Π’ΡΠ΅ΠΉΡΡ
Π‘ΠΏΠΎΡΠΎΠ±, ΠΊΠΎΡΠΎΡΡΠΌ Π² ΡΠ·ΡΠΊΠ΅ PHP ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ ΠΊΠΎΠ΄ Π²Π½Π΅Π΄ΡΡΡΡ Π² Π½Π΅ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ ΠΈΠ΅ΡΠ°ΡΡ
ΠΈΠΈ ΠΊΠ»Π°ΡΡΠΎΠ²,
Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΡΡΠ΅ΠΉΡΠ°ΠΌΠΈ (Π°Π½Π³Π». Traits).
Π’ΡΠ΅ΠΉΡΡ β ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅Ρ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ Π² ΡΠ·ΡΠΊΠ°Ρ
Ρ ΠΎΠ΄ΠΈΠ½ΠΎΡΠ½ΡΠΌ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ PHP. ΠΠ°Π΄Π°ΡΠ° ΡΡΠ΅ΠΉΡΠ° β
ΡΠΌΠ΅Π½ΡΡΠΈΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΎΠ΄ΠΈΠ½ΠΎΡΠ½ΠΎΠ³ΠΎ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ, ΡΠ°Π·ΡΠ΅ΡΠ°Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΡ Π»Π΅Π³ΠΊΠΎ
ΠΏΠ΅ΡΠ΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π°Π±ΠΎΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² Π² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΡ
ΠΊΠ»Π°ΡΡΠ°Ρ
,
ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π°Ρ
ΠΎΠ΄ΡΡΡΡ Π² ΡΠ°Π·Π½ΡΡ
ΠΈΠ΅ΡΠ°ΡΡ
ΠΈΡΡ
Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ. Π‘Π΅ΠΌΠ°Π½ΡΠΈΠΊΡ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠΈ ΡΡΠ΅ΠΉΡΠΎΠ²
ΠΈ ΠΊΠ»Π°ΡΡΠΎΠ² ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ»ΠΈ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΡΠ½ΠΈΠ·ΠΈΡΡ ΡΡΠΎΠ²Π΅Π½Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΈ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ
ΡΠΈΠΏΠΈΡΠ½ΡΡ
ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΡΠ²ΠΎΠΉΡΡΠ²Π΅Π½Π½ΡΡ
ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠΌΡ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΡΠΌ (Π°Π½Π³Π». Mixins).
Π’ΡΠ΅ΠΉΡ ΠΏΠΎΡ
ΠΎΠΆ Π½Π° ΠΊΠ»Π°ΡΡ, Π½ΠΎ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ Π³ΡΡΠΏΠΏΠΈΡΠΎΠ²ΠΊΠΈ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΠΈ
ΡΠΎΠ½ΠΊΠΎ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΠ΅ΠΌΡΠΌ ΠΈ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ. ΠΠ΅Π»ΡΠ·Ρ ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΡΡΠ΅ΠΉΡΠ°.
Π’ΡΠ΅ΠΉΡ Π΄ΠΎΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΠΎΠ΅ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅Ρ Π²ΡΡΡΡΠ°ΠΈΠ²Π°ΡΡ
Π³ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»ΡΠ½ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ; Π΄ΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, ΡΡΠ΅ΠΉΡ ΠΈΠ³ΡΠ°Π΅Ρ ΡΠΎΠ»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΊ ΡΠ»Π΅Π½Π°ΠΌ ΠΊΠ»Π°ΡΡΠ°,
ΠΊΠΎΡΠΎΡΠΎΠ΅ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ.
ΠΡΠΈΠΌΠ΅Ρ #1 ΠΡΠΈΠΌΠ΅Ρ ΡΡΠ΅ΠΉΡΠ°
<?php
trait TraitA {
public function sayHello()
{
echo 'Hello';
}
}
trait TraitB {
public function sayWorld()
{
echo 'World';
}
}
class MyHelloWorld
{
use TraitA, TraitB; // ΠΠ»Π°ΡΡ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅Ρ Π²Π½Π΅Π΄ΡΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠ΅ΠΉΡΠΎΠ²
public function sayHelloWorld()
{
$this->sayHello();
echo ' ';
$this->sayWorld();
echo "!\n";
}
}
$myHelloWorld = new MyHelloWorld();
$myHelloWorld->sayHelloWorld();
?>
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°:
ΠΡΠΈΠΎΡΠΈΡΠ΅Ρ
Π§Π»Π΅Π½, ΠΊΠΎΡΠΎΡΡΠΉ ΠΊΠ»Π°ΡΡ ΡΠ½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π» ΠΈΠ· Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°, ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΡΠ»Π΅Π½ΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ Π²Π½Π΅Π΄ΡΠΈΠ»ΡΡ ΡΡΠ΅ΠΉΡΠΎΠΌ.
ΠΠΎΡΡΠ΄ΠΎΠΊ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ° Π²ΡΡΡΡΠ°ΠΈΠ²Π°Π΅ΡΡΡ ΡΠ°ΠΊ, ΡΡΠΎ ΠΌΠ΅ΡΠΎΠ΄Ρ ΡΡΠ΅ΠΉΡΠ° ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌΠΈ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΠΊΠ»Π°ΡΡΠ°,
Π° ΠΌΠ΅ΡΠΎΠ΄Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΊΠ»Π°ΡΡ ΡΠ½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π» ΠΈΠ· Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°, ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌΠΈ ΡΡΠ΅ΠΉΡΠ°.
ΠΡΠΈΠΌΠ΅Ρ #2 ΠΡΠΈΠΌΠ΅Ρ ΡΠΎΠ³ΠΎ, Π² ΠΊΠ°ΠΊΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅ Π²ΡΡΡΡΠ°ΠΈΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ
ΠΠ΅ΡΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ ΠΊΠ»Π°ΡΡ ΡΠ½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π» ΠΈΠ· Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°, ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ Π²Π½Π΅Π΄ΡΠΈΠ»ΡΡ
Π² ΠΊΠ»Π°ΡΡ MyHelloWorld ΠΈΠ· ΡΡΠ΅ΠΉΡΠ° SayWorld. ΠΠ΅ΡΠΎΠ΄Ρ ΡΡΠ΅ΠΉΡΠ° Π²Π΅Π΄ΡΡ ΡΠ΅Π±Ρ ΠΊΠ°ΠΊ ΠΌΠ΅ΡΠΎΠ΄Ρ
ΠΊΠ»Π°ΡΡΠ° MyHelloWorld. ΠΠΎΡΡΠ΄ΠΎΠΊ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ° ΡΠ°ΠΊΠΎΠΉ: ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌΠΈ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΠΊΠ»Π°ΡΡΠ°
ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ ΡΡΠ΅ΠΉΡΠ°, ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ
Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°.
<?php
class Base
{
public function sayHello()
{
echo 'Hello ';
}
}
trait SayWorld
{
public function sayHello()
{
parent::sayHello();
echo 'World!';
}
}
class MyHelloWorld extends Base
{
use SayWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
?>
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°:
ΠΡΠΈΠΌΠ΅Ρ #3 ΠΡΠΈΠΌΠ΅Ρ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΡΠ΄ΠΊΠ° ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ°
<?php
trait HelloWorld
{
public function sayHello()
{
echo 'Hello World!';
}
}
class TheWorldIsNotEnough
{
use HelloWorld;
public function sayHello()
{
echo 'Hello Universe!';
}
}
$o = new TheWorldIsNotEnough();
$o->sayHello();
?>
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°:
ΠΠ΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠ΅ΠΉΡΠΎΠ²
ΠΠ°Π·Π²Π°Π½ΠΈΡ ΡΡΠ΅ΠΉΡΠΎΠ² ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»ΡΡΡ ΡΠ΅ΡΠ΅Π· Π·Π°ΠΏΡΡΡΡ Π² ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ use,
ΡΡΠΎΠ±Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² ΠΊΠ»Π°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠ΅ΠΉΡΠΎΠ².
ΠΡΠΈΠΌΠ΅Ρ #4 ΠΡΠΈΠΌΠ΅Ρ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
ΡΡΠ΅ΠΉΡΠΎΠ²
<?php
trait Hello
{
public function sayHello()
{
echo 'Hello ';
}
}
trait World
{
public function sayWorld()
{
echo 'World';
}
}
class MyHelloWorld
{
use Hello, World;
public function sayExclamationMark()
{
echo '!';
}
}
$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
$o->sayExclamationMark();
?>
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°:
Π Π°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΎΠ²
ΠΡΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π΄Π²ΡΠΌΡ ΡΡΠ΅ΠΉΡΠ°ΠΌΠΈ ΠΌΠ΅ΡΠΎΠ΄Π° Ρ ΠΎΠ΄Π½ΠΈΠΌ ΠΈ ΡΠ΅ΠΌ ΠΆΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΡΠ°ΡΠ°Π»ΡΠ½Π°Ρ
ΠΎΡΠΈΠ±ΠΊΠ°, Π΅ΡΠ»ΠΈ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡ ΡΠ²Π½ΠΎ Π½Π΅ ΡΠ°Π·ΡΠ΅ΡΠΈΠ»ΠΈ.
ΠΠΏΠ΅ΡΠ°ΡΠΎΡ insteadof ΡΠ°Π·ΡΠ΅ΡΠ°Π΅Ρ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΡ ΠΈΠΌΡΠ½ ΠΈ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ,
ΠΌΠ΅ΡΠΎΠ΄ ΠΊΠ°ΠΊΠΎΠ³ΠΎ ΡΡΠ΅ΠΉΡΠ° ΠΈΡΠΊΠ»ΡΡΠΈΡΡ ΠΈΠ· ΠΊΠ»Π°ΡΡΠ°, ΠΊΠΎΠ³Π΄Π° Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Π° ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΡΠ΅ΠΉΡΠ° ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ
Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ ΠΌΠ΅ΡΠΎΠ΄Π° Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΡΡΠ΅ΠΉΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΠΊΠ»ΡΡΠΈΠ»ΠΈ Π² ΡΡΠΎΡ ΠΆΠ΅ ΠΊΠ»Π°ΡΡ.
ΠΠ»Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΠΏΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌΠ° ΠΌΠ΅ΡΠΎΠ΄Ρ ΡΡΠ΅ΠΉΡΠ° ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ as,
ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΡΠΊΠ»ΡΡΠ°Π΅Ρ ΠΌΠ΅ΡΠΎΠ΄Ρ.
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ as
Π½Π΅ ΠΏΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²ΡΠ²Π°Π΅Ρ ΠΌΠ΅ΡΠΎΠ΄ ΠΈ Π½Π΅ Π²Π»ΠΈΡΠ΅Ρ Π½ΠΈ Π½Π° ΠΊΠ°ΠΊΠΈΠ΅ Π΄ΡΡΠ³ΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ.
ΠΡΠΈΠΌΠ΅Ρ #5 ΠΡΠΈΠΌΠ΅Ρ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΎΠ²
Π ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π² ΠΊΠ»Π°ΡΡ Talker Π²ΠΊΠ»ΡΡΠΈΠ»ΠΈ ΡΡΠ΅ΠΉΡΡ A ΠΈ B.
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π² ΡΡΠ΅ΠΉΡΠ°Ρ
A ΠΈ B ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΡΡΠΏΠ°ΡΡ Π² ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡ,
ΠΊΠ»Π°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π²Π°ΡΠΈΠ°Π½Ρ ΠΌΠ΅ΡΠΎΠ΄Π° smallTalk ΠΈΠ· ΡΡΠ΅ΠΉΡΠ° B, Π° Π²Π°ΡΠΈΠ°Π½Ρ ΠΌΠ΅ΡΠΎΠ΄Π° bigTalk ΠΈΠ· ΡΡΠ΅ΠΉΡΠ° A.
ΠΠΏΠ΅ΡΠ°ΡΠΎΡ as Π² ΠΊΠ»Π°ΡΡΠ΅ Aliased_Talker
ΡΠ°Π·ΡΠ΅ΡΠ°Π΅Ρ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ bigTalk ΡΡΠ΅ΠΉΡΠ° B
ΠΏΠΎ ΠΏΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌΡ talk.
<?php
trait A
{
public function smallTalk()
{
echo 'a';
}
public function bigTalk()
{
echo 'A';
}
}
trait B
{
public function smallTalk()
{
echo 'b';
}
public function bigTalk()
{
echo 'B';
}
}
class Talker
{
use A, B {
B::smallTalk insteadof A;
A::bigTalk insteadof B;
}
}
class Aliased_Talker
{
use A, B {
B::smallTalk insteadof A;
A::bigTalk insteadof B;
B::bigTalk as talk;
}
}
?>
ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΌΠ΅ΡΠΎΠ΄Π°
Π‘ΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠΌ as ΡΠΌΠ΅Π΅Ρ ΡΠ°ΠΊΠΆΠ΅ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°ΡΡ
Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Π° Π² ΠΊΠ»Π°ΡΡΠ΅.
ΠΡΠΈΠΌΠ΅Ρ #6 ΠΡΠΈΠΌΠ΅Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΌΠ΅ΡΠΎΠ΄Π°
<?php
trait HelloWorld
{
public function sayHello()
{
echo 'ΠΡΠΈΠ²Π΅Ρ, ΠΌΠΈΡ!';
}
}
// ΠΠ·ΠΌΠ΅Π½ΠΈΠΌ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Π° sayHello
class MyClass1
{
use HelloWorld {
sayHello as protected;
}
}
// Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΏΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌ ΠΌΠ΅ΡΠΎΠ΄Π° ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΡ ΡΡΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π°.
// ΠΠΈΠ΄ΠΈΠΌΠΎΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Π° sayHello Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»Π°ΡΡ
class MyClass2
{
use HelloWorld {
sayHello as private myPrivateHello;
}
}
?>
ΠΠΌΠΏΠΎΡΡ ΡΡΠ΅ΠΉΡΠΎΠ² Π² ΡΡΠ΅ΠΉΡΡ
Π’ΡΠ΅ΠΉΡΡ Π²Π½Π΅Π΄ΡΡΡΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΊΠ»Π°ΡΡΡ, Π½ΠΎ ΠΈ Π² Π΄ΡΡΠ³ΠΈΠ΅ ΡΡΠ΅ΠΉΡΡ.
Π’ΡΠ΅ΠΉΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Π°ΡΡ ΠΈΠ· Π΄ΡΡΠ³ΠΈΡ
ΡΡΠ΅ΠΉΡΠΎΠ² ΠΏΡΡΡΠΌ ΠΈΠΌΠΏΠΎΡΡΠ° Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΡ
ΡΡΠ΅ΠΉΡΠΎΠ² Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΡΠ΅Π»Π΅Π²ΠΎΠ³ΠΎ.
Π§Π»Π΅Π½Ρ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ
ΡΡΠ΅ΠΉΡΠΎΠ² ΡΡΠ°Π½ΠΎΠ²ΡΡΡΡ ΡΠ°ΡΡΡΡ ΡΠ΅Π»Π΅Π²ΠΎΠ³ΠΎ.
ΠΡΠΈΠΌΠ΅Ρ #7 ΠΡΠΈΠΌΠ΅Ρ ΡΡΠ΅ΠΉΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΎΡΡΠΎΡΡ ΠΈΠ· ΡΡΠ΅ΠΉΡΠΎΠ²
<?php
trait Hello
{
public function sayHello()
{
echo 'Hello ';
}
}
trait World
{
public function sayWorld()
{
echo 'World!';
}
}
trait HelloWorld
{
use Hello, World;
}
class MyHelloWorld
{
use HelloWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
?>
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°:
ΠΠ±ΡΡΡΠ°ΠΊΡΠ½ΡΠ΅ ΡΠ»Π΅Π½Ρ ΡΡΠ΅ΠΉΡΠΎΠ²
Π’ΡΠ΅ΠΉΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ, ΡΡΠΎΠ±Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ
ΠΊ ΠΊΠ»Π°ΡΡΡ, Π² ΠΊΠΎΡΠΎΡΡΠΉ Π²Π½Π΅Π΄ΡΠΈΡΡΡ ΡΡΠ΅ΠΉΡ.
ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ ΠΎΠ±ΡΠ΅Π΄ΠΎΡΡΡΠΏΠ½ΡΠ΅, Π·Π°ΡΠΈΡΡΠ½Π½ΡΠ΅ ΠΈ Π·Π°ΠΊΡΡΡΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ.
ΠΠΎ PHP 8.0.0 ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π»ΠΈΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ±ΡΠ΅Π΄ΠΎΡΡΡΠΏΠ½ΡΠ΅ ΠΈ Π·Π°ΡΠΈΡΡΠ½Π½ΡΠ΅ Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ.
ΠΡΠ΅Π΄ΠΎΡΡΠ΅ΡΠ΅ΠΆΠ΅Π½ΠΈΠ΅
ΠΠ°ΡΠΈΠ½Π°Ρ Ρ PHP 8.0.0 Π²ΡΠ΄Π°ΡΡΡΡ ΡΠ°ΡΠ°Π»ΡΠ½Π°Ρ ΠΎΡΠΈΠ±ΠΊΠ°, Π΅ΡΠ»ΠΈ ΡΠΈΠ³Π½Π°ΡΡΡΠ° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π°
Π½Π΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΡΠ°Π²ΠΈΠ»Π°ΠΌ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΠΈ ΡΠΈΠ³Π½Π°ΡΡΡ.
Π Π°Π½ΡΡΠ΅ ΠΏΡΠΈ Π½Π΅ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠΈ ΡΠΈΠ³Π½Π°ΡΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Π° ΠΎΡΠΈΠ±ΠΊΠ° Π½Π΅ Π²ΡΠ΄Π°Π²Π°Π»Π°ΡΡ.
ΠΡΠΈΠΌΠ΅Ρ #8 ΠΡΠΈΠΌΠ΅Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΊ ΠΊΠ»Π°ΡΡΡ ΡΠ΅ΡΠ΅Π· Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ ΡΡΠ΅ΠΉΡΠ°
<?php
trait Hello
{
public function sayHelloWorld()
{
echo 'Hello' . $this->getWorld();
}
abstract public function getWorld();
}
class MyHelloWorld
{
private $world;
use Hello;
public function getWorld()
{
return $this->world;
}
public function setWorld($val)
{
$this->world = $val;
}
}
?>
Π‘ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ»Π΅Π½Ρ ΡΡΠ΅ΠΉΡΠ°
Π ΡΡΠ΅ΠΉΡΠ°Ρ
ΡΠ°Π·ΡΠ΅ΡΠ°Π΅ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅, ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΈ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π°.
ΠΠ°ΠΌΠ΅ΡΠ°Π½ΠΈΠ΅:
ΠΠ°ΡΠΈΠ½Π°Ρ Ρ PHP 8.1.0 ΠΏΡΡΠΌΠΎΠΉ Π²ΡΠ·ΠΎΠ² ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π°
ΠΈΠ»ΠΈ ΠΏΡΡΠΌΠΎΠΉ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΌΡ ΡΠ²ΠΎΠΉΡΡΠ²Ρ Π² ΡΡΠ΅ΠΉΡΠ΅ ΡΡΡΠ°ΡΠ΅Π»ΠΈ.
ΠΠΎΡΡΡΠΏ ΠΊ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌ ΠΈ ΡΠ²ΠΎΠΉΡΡΠ²Π°ΠΌ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΊΠ»Π°ΡΡΠ΅, Π² ΠΊΠΎΡΠΎΡΡΠΉ Π²Π½Π΅Π΄ΡΠΈΠ»ΠΈ ΡΡΠ΅ΠΉΡ.
ΠΡΠΈΠΌΠ΅Ρ #9 Π‘ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅
<?php
trait Counter
{
public function inc()
{
static $c = 0;
$c = $c + 1;
echo "$c\n";
}
}
class C1
{
use Counter;
}
class C2
{
use Counter;
}
$o = new C1();
$o->inc();
$p = new C2();
$p->inc();
?>
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°:
ΠΡΠΈΠΌΠ΅Ρ #10 Π‘ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ
<?php
trait StaticExample
{
public static function doSomething()
{
return 'ΠΠ΅Π»Π°Π΅ΠΌ ΡΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ';
}
}
class Example
{
use StaticExample;
}
echo Example::doSomething();
?>
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°:
ΠΡΠΈΠΌΠ΅Ρ #11 Π‘ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π°
ΠΡΠ΅Π΄ΠΎΡΡΠ΅ΡΠ΅ΠΆΠ΅Π½ΠΈΠ΅
ΠΠΎ PHP 8.3.0 Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΡ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π»ΠΈ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π°, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠ΅ ΠΊΠ»Π°ΡΡΡ
ΠΏΠΎΠ»ΡΡΠ°Π»ΠΈ ΠΈΠ· ΡΡΠ΅ΠΉΡΠ°, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΡΡΠ΅ΠΉΡ ΡΠ²Π½ΠΎ Π²Π½Π΅Π΄ΡΡΠ»ΡΡ Π² Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΊΠ»Π°ΡΡ.
ΠΠ°ΡΠΈΠ½Π°Ρ Ρ PHP 8.3.0 ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΡΡΠ΅ΠΉΡΠ° ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ Π² Π΄ΠΎΡΠ΅ΡΠ½Π΅ΠΌ ΠΊΠ»Π°ΡΡΠ΅ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ,
ΠΊΠΎΡΠΎΡΠΎΠ΅ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΊΠ»Π°ΡΡ ΡΠ½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π» ΠΈΠ· ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ.
<?php
trait T
{
public static $counter = 1;
}
class A
{
use T;
public static function incrementCounter()
{
static::$counter++;
}
}
class B extends A
{
use T;
}
A::incrementCounter();
echo A::$counter, "\n";
echo B::$counter, "\n";
?>
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° Π² PHP 8.3:
Π‘Π²ΠΎΠΉΡΡΠ²Π°
Π ΡΡΠ΅ΠΉΡΠ°Ρ
Π΄ΠΎΡΡΡΠΏΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠ²ΠΎΠΉΡΡΠ².
ΠΡΠΈΠΌΠ΅Ρ #12 ΠΡΠΈΠΌΠ΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠ²ΠΎΠΉΡΡΠ² Π² ΡΡΠ΅ΠΉΡΠ΅
<?php
trait PropertiesTrait
{
public $x = 1;
}
class PropertiesExample
{
use PropertiesTrait;
}
$example = new PropertiesExample();
$example->x;
?>
Π ΠΊΠ»Π°ΡΡΠ΅ Π½Π΅Π»ΡΠ·Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ ΠΊΠ°ΠΊ Ρ ΡΠ²ΠΎΠΉΡΡΠ²Π° ΡΡΠ΅ΠΉΡΠ°,
Π΅ΡΠ»ΠΈ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΠΊΠ»Π°ΡΡΠ° Π½Π΅ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎ ΡΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎΠΌ ΡΡΠ΅ΠΉΡΠ° ΠΏΠΎ ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΈ ΡΠΈΠΏΡ,
ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ readonly ΠΈ Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠΌΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΈΠ½Π°ΡΠ΅ PHP Π²ΡΠ΄Π°ΡΡ ΡΠ°ΡΠ°Π»ΡΠ½ΡΡ ΠΎΡΠΈΠ±ΠΊΡ.
ΠΡΠΈΠΌΠ΅Ρ #13 Π Π°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΎΠ²
<?php
trait PropertiesTrait
{
public $same = true;
public $different1 = false;
public bool $different2;
public bool $different3;
}
class PropertiesExample
{
use PropertiesTrait;
public $same = true;
public $different1 = true; // Π€Π°ΡΠ°Π»ΡΠ½Π°Ρ ΠΎΡΠΈΠ±ΠΊΠ°
public string $different2; // Π€Π°ΡΠ°Π»ΡΠ½Π°Ρ ΠΎΡΠΈΠ±ΠΊΠ°
readonly protected bool $different3; // Π€Π°ΡΠ°Π»ΡΠ½Π°Ρ ΠΎΡΠΈΠ±ΠΊΠ°
}
?>
ΠΠΎΠ½ΡΡΠ°Π½ΡΡ
ΠΠ°ΡΠΈΠ½Π°Ρ Ρ Π²Π΅ΡΡΠΈΠΈ PHP 8.2.0 Π² ΡΡΠ΅ΠΉΡΠ°Ρ
ΡΠ°Π·ΡΠ΅ΡΠΈΠ»ΠΈ ΡΠ°ΠΊΠΆΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ.
ΠΡΠΈΠΌΠ΅Ρ #14 ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΡΠ°Π½Ρ
<?php
trait ConstantsTrait
{
public const FLAG_MUTABLE = 1;
final public const FLAG_IMMUTABLE = 5;
}
class ConstantsExample
{
use ConstantsTrait;
}
$example = new ConstantsExample;
echo $example::FLAG_MUTABLE;
?>
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°:
Π ΠΊΠ»Π°ΡΡΠ΅ Π½Π΅Π»ΡΠ·Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ ΠΊΠ°ΠΊ Ρ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ ΡΡΠ΅ΠΉΡΠ°,
Π΅ΡΠ»ΠΈ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ° ΠΊΠ»Π°ΡΡΠ° Π½Π΅ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠ° Ρ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠΎΠΉ ΡΡΠ΅ΠΉΡΠ° ΠΏΠΎ ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ,
Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠΌΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ final, ΠΈΠ½Π°ΡΠ΅ PHP Π²ΡΠ΄Π°ΡΡ ΡΠ°ΡΠ°Π»ΡΠ½ΡΡ ΠΎΡΠΈΠ±ΠΊΡ.
ΠΡΠΈΠΌΠ΅Ρ #15 Π Π°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΎΠ²
<?php
trait ConstantsTrait
{
public const FLAG_MUTABLE = 1;
final public const FLAG_IMMUTABLE = 5;
}
class ConstantsExample
{
use ConstantsTrait;
public const FLAG_IMMUTABLE = 5; // Π€Π°ΡΠ°Π»ΡΠ½Π°Ρ ΠΎΡΠΈΠ±ΠΊΠ°
}
?>
ΠΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ
ΠΠ°ΡΠΈΠ½Π°Ρ Ρ PHP 8.3.0 ΠΌΠ΅ΡΠΎΠ΄Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π»ΠΈ ΠΈΠ· ΡΡΠ΅ΠΉΡΠΎΠ²,
ΡΠ°Π·ΡΠ΅ΡΠΈΠ»ΠΈ Π΄Π΅Π»Π°ΡΡ ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»ΡΠ½ΡΠΌΠΈ ΡΠ΅ΡΠ΅Π· ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ as
ΠΈ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡ final.
ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Π° ΡΡΠ΅ΠΉΡΠ° ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»ΡΠ½ΡΠΌ Π·Π°ΠΏΡΠ΅ΡΠ°Π΅Ρ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΌ ΠΊΠ»Π°ΡΡΠ°ΠΌ
ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΠΌΠ΅ΡΠΎΠ΄. ΠΠΎ ΡΠ°ΠΌΠΎΠΌΡ ΠΊΠ»Π°ΡΡΡ, Π² ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π»ΠΈ ΡΡΠ΅ΠΉΡ
ΠΈ Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΠ΄Π΅Π»Π°Π»ΠΈ ΠΌΠ΅ΡΠΎΠ΄ ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»ΡΠ½ΡΠΌ, ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ Π΄ΠΎΡΡΡΠΏΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Π°.
ΠΡΠΈΠΌΠ΅Ρ #16
ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Π° ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»ΡΠ½ΡΠΌ
ΠΏΡΡΡΠΌ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° final ΠΏΡΠΈ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΠΈ ΡΡΠ΅ΠΉΡΠ°
<?php
trait CommonTrait
{
public function method()
{
echo 'ΠΡΠΈΠ²Π΅Ρ';
}
}
class FinalExampleA
{
use CommonTrait {
CommonTrait::method as final; // ΠΠ°ΡΠΈΠ½Π°Ρ Ρ PHP 8.3.0 ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡ final
// Π·Π°ΠΏΡΠ΅ΡΠΈΡ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΠΌΠ΅ΡΠΎΠ΄ Π² Π΄ΠΎΡΠ΅ΡΠ½ΠΈΡ
ΠΊΠ»Π°ΡΡΠ°Ρ
}
}
class FinalExampleB extends FinalExampleA
{
public function method() {}
}
?>
ΠΡΠ²ΠΎΠ΄ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° Π±ΡΠ΄Π΅Ρ ΠΏΠΎΡ
ΠΎΠΆ Π½Π°:
Fatal error: Cannot override final method FinalExampleA::method() in ...