【 PHP 】PHP8に入門してみた 222日目 PHPの基本 ( 高度 属性 )

PHP8技術者認定初級試験 が始まるようなので 試験に向けて (できるだけ)勉強しようと思います! 使用する書籍は独習PHP 第4版(山田 祥寛)|翔泳社の本 (shoeisha.co.jp) となります。

高度

属性とは

属性というと「プロパティ(クラスのメンバ変数)」を想像してしまいますがコレとは異なるようです。
PHP8で新たに登場した機能とのこと。

他の言語では「アノテーション」とも、言ったりしますかね。

#[AttributeUsage(Attribute::TARGET_CLASS)]
class ExampleAttribute {
	public string $name;
	public function __construct(string $name) {
		$this->name = $name;
	}
}

#[ExampleAttribute('example')]
class ExampleClass {
	// ...
}

この例では、ExampleAttributeという属性クラスを定義しています。
この属性クラスは、Attribute::TARGET_CLASSという属性の使用対象がクラスであることを示す属性ターゲットを持っています。
また、コンストラクタで$nameというパラメータを受け取り、プロパティ$nameにセットしています。

ExampleClassというクラスには、#[ExampleAttribute('example')]という属性が追加されています。
この属性には、パラメータ'example'が渡されており、これはExampleAttributeクラスのコンストラクタに渡されます。

属性を使用することで、クラスに関連する追加情報を指定することができます。
また、属性を使用することで、リフレクションを使用してクラスに関する情報を取得することができます。

PHPにもリフレクション!?

PHPのリフレクションAPIには、クラス、メソッド、プロパティ、関数などのリフレクション情報を取得するための多数の関数が用意されています。
これらの関数を使用することで、実行時にクラスの構造を調べたり、メソッドやプロパティを呼び出したりすることができます。

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8" />
    <title>こんにちは!</title>
    <!-- Bootstrapを有効化 -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" />
</head>

<body>
    <?php
    class MyClass
    {
        private $foo = 1;
        protected $bar = 2;
        public $baz = 3;

        public function myMethod()
        {
            echo "hello!";
        }
    }

    $reflectionClass = new ReflectionClass('MyClass');

    // クラス名を表示する
    echo $reflectionClass->getName() . PHP_EOL;

    // クラスのプロパティを表示する
    $properties = $reflectionClass->getProperties();
    foreach ($properties as $property) {
        echo $property->getName() . PHP_EOL;
        echo $property->getModifiers() . PHP_EOL;
        echo $property->isPublic() . PHP_EOL;
        echo $property->isProtected() . PHP_EOL;
        echo $property->isPrivate() . PHP_EOL;
    }

    // クラスのメソッドを表示する
    $methods = $reflectionClass->getMethods();
    foreach ($methods as $method) {
        echo $method->getName() . PHP_EOL;
        echo $method->getModifiers() . PHP_EOL;
        echo $method->isPublic() . PHP_EOL;
        echo $method->isProtected() . PHP_EOL;
        echo $method->isPrivate() . PHP_EOL;
    }

    // インスタンスを生成してプロパティの値を取得する
    $instance = $reflectionClass->newInstance();
    $fooProperty = $reflectionClass->getProperty('foo');
    $fooProperty->setAccessible(true); // privateプロパティにアクセスするために必要
    echo $fooProperty->getValue($instance) . PHP_EOL;

    ?>
</body>

</html>

メモ

Javaより優秀な気がしました。

PHPPHP

Posted by raika@blog