LoginSignup
0
0

More than 3 years have passed since last update.

PHP トレイトの検証

Last updated at Posted at 2020-05-24

今回はトレイトのお話をしていきます。
公式ドキュメントとやっていることは同じかもしれませんが、
個人的にわかりやすいようにメモのような形で解説していきます。
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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0