parent
90f2dd06f6
commit
d39bd7fdbd
3 changed files with 164 additions and 0 deletions
@ -0,0 +1,103 @@ |
|||||||
|
--TEST-- |
||||||
|
Trait-composed methods override inherited methods in virtual dispatch |
||||||
|
--FILE-- |
||||||
|
<?php |
||||||
|
|
||||||
|
class DispatchBase |
||||||
|
{ |
||||||
|
public function dispatch(): string |
||||||
|
{ |
||||||
|
return $this->perform(); |
||||||
|
} |
||||||
|
|
||||||
|
protected function perform(): string |
||||||
|
{ |
||||||
|
return 'base'; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
trait DirectOverride |
||||||
|
{ |
||||||
|
protected function perform(): string |
||||||
|
{ |
||||||
|
return 'direct-trait'; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
final class DirectConsumer extends DispatchBase |
||||||
|
{ |
||||||
|
use DirectOverride; |
||||||
|
} |
||||||
|
|
||||||
|
trait NestedOverride |
||||||
|
{ |
||||||
|
protected function perform(): string |
||||||
|
{ |
||||||
|
return 'nested-trait'; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
trait NestedComposition |
||||||
|
{ |
||||||
|
use NestedOverride; |
||||||
|
} |
||||||
|
|
||||||
|
final class NestedConsumer extends DispatchBase |
||||||
|
{ |
||||||
|
use NestedComposition; |
||||||
|
} |
||||||
|
|
||||||
|
trait AliasedOverride |
||||||
|
{ |
||||||
|
protected function replacement(): string |
||||||
|
{ |
||||||
|
return 'aliased-trait'; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
final class AliasedConsumer extends DispatchBase |
||||||
|
{ |
||||||
|
use AliasedOverride { |
||||||
|
replacement as perform; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
class PrivateDispatchBase |
||||||
|
{ |
||||||
|
public function dispatch(): string |
||||||
|
{ |
||||||
|
return $this->perform(); |
||||||
|
} |
||||||
|
|
||||||
|
private function perform(): string |
||||||
|
{ |
||||||
|
return 'private-base'; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
trait PrivateNameCollision |
||||||
|
{ |
||||||
|
protected function perform(): string |
||||||
|
{ |
||||||
|
return 'trait'; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
final class PrivateConsumer extends PrivateDispatchBase |
||||||
|
{ |
||||||
|
use PrivateNameCollision; |
||||||
|
} |
||||||
|
|
||||||
|
function main(): void |
||||||
|
{ |
||||||
|
var_dump((new DirectConsumer())->dispatch()); |
||||||
|
var_dump((new NestedConsumer())->dispatch()); |
||||||
|
var_dump((new AliasedConsumer())->dispatch()); |
||||||
|
var_dump((new PrivateConsumer())->dispatch()); |
||||||
|
} |
||||||
|
?> |
||||||
|
--EXPECT-- |
||||||
|
string(12) "direct-trait" |
||||||
|
string(12) "nested-trait" |
||||||
|
string(13) "aliased-trait" |
||||||
|
string(12) "private-base" |
||||||
Loading…
Reference in new issue