今回はトレイトのお話をしていきます。
公式ドキュメントとやっていることは同じかもしれませんが、
個人的にわかりやすいようにメモのような形で解説していきます。
1〜3は公式ドキュメントと挙動が同じですが、
4は個人的に気になったところを書いていきます。
1.基本的な使い方
test_sample.php
<?php
require_once(__DIR__ . '/HelloWorld.php');
$app = new say();
$app->sayHello();
$app->sayWorld();
?>
HelloWorld.php
<?php
trait HelloWorld
{
public function sayHello(){
echo 'Hello ';
}
}
class say
{
use HelloWorld;
public function sayWorld(){
echo 'world';
}
}
?>
$ php test_sample.php
Hello world
useでトレイトを読み込めば使えます。
2.同じメソッド名の場合
test_sample.php
<?php
require_once(__DIR__ . '/HelloWorld.php');
$app = new say();
$app->sayHelloWorld();
?>
HelloWorld.php
<?php
trait HelloWorld
{
public function sayHelloWorld(){
echo '1';
}
}
class say
{
use HelloWorld;
public function sayHelloWorld(){
echo '2';
}
}
?>
$ php test_sample.php
2
上記の場合は、sayクラスのメソッドが優先されています。
3.トレイトが複数の場合
test_sample.php
<?php
require_once(__DIR__ . '/HelloWorld.php');
$app = new say();
$app->sayHello();
$app->sayWorld();
$app->sayHelloWorld();
?>
HelloWorld.php
<?php
trait Hello
{
public function sayHello(){
echo 'Hello ';
}
}
trait World
{
public function sayWorld(){
echo 'World';
}
}
class say
{
use Hello, World;
public function sayHelloWorld(){
echo '!';
}
}
?>
$ php test_sample.php
Hello World!
複数の場合は、カンマ区切りでいけます。
4.コンストラクタとデストラクタは使える?
ここからが個人的に気になるところなので検証します
test_sample.php
<?php
require_once(__DIR__ . '/HelloWorld.php');
$app = new say();
$app->sayHelloWorld();
?>
HelloWorld.php
<?php
trait Hello
{
public function __construct(){
echo 'Hello';
}
public function __destruct(){
echo 'world';
}
}
class say
{
use Hello;
public function sayHelloWorld(){
echo '_';
}
}
?>
$ php test_sample.php
Hello_world
結論:コンストラクタもデストラクタも呼ばれる
ちなみに、トレイトを親クラスとして継承させるのは無理みたいです。
逆も無理です。
例1.
class say extends Hello
例2.
trait Hello extends say