【 PHP 】PHP8に入門してみた 203日目 PHPの基本 ( オブジェクト指向 遅延静的束縛)

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

オブジェクト指向

必殺!遅延静的束縛!

遅延静的束縛(Late Static Bindings)とは、静的メソッドやプロパティを継承して利用する際、
親クラスではなく呼び出し元のクラスのメソッドやプロパティを参照する仕組みです。

必殺技の名前みたいですよね😉

<!DOCTYPE html>

<html>

<?php

class ParentClass
{
    public static $property = "parent";
    public static function method()
    {
        print "parent";
    }
}

class ChildClass extends ParentClass
{
    public static $property = "child";
    public static function method()
    {
        parent::method();
        print "child";
    }
}
?>

<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
    ChildClass::method();  // 結果:parentchild
    ?>
    <br />
    <?php
    echo ChildClass::$property;  // 結果:child
    ?>
</body>

</html>

ふむふむ

なんかわかりにくいですね…

こっちで検証します。

class A
{
    public static function who()
    {
        echo "A\n";
    }
    public static function test()
    {
        self::who();
    }
}

class B extends A
{
    public static function who()
    {
        echo "B\n";
    }
}

B::test(); // 結果: A

 

このコードでは、class A と class B の2つのクラスが定義されています。
class A の中には、静的メソッド who() があり、"A" を表示するようになっています。
また、同じ class A の中に、test() というメソッドがあり、中で self::who() を呼び出しています。

これは、self で自分自身の who() メソッドを呼び出すことを意味します。class B は class A を継承しています。
そして、class B の中には、who() メソッドが再定義され、"B" を表示するようになっています。

最後に B::test() を呼び出しているのですが、結果は “A" となります。
これは、 self キーワードは、そのメソッドが定義されているクラス自身を指すため、A クラスの who() メソッドが呼び出されているためです。

static内でselfを使用すると「Aというクラスの」という意味になるみたいです。
Rubyにもそのような仕組みがあったような気がします。
「クラスもまたオブジェクト」という考え方でしたかね。

 

遅延静的束縛を使うと、クラスの型が実行時に決定されるため、このような場合でも B::test() を呼び出すと、"B" が表示されるようになります。
以下に遅延静的束縛を使ったコード例です。

class A
{
    public static function who()
    {
        echo "A\n";
    }
    public static function test()
    {
        static::who(); // ★今度はstaticを使っています!
    }
}

class B extends A
{
    public static function who()
    {
        echo "B\n";
    }
}

B::test(); // 結果: B

 

メモ

ついに「PHP8技術者認定初級試験」の通年受験がはじまりましたね!

私も学習が終わり次第受験したいと思います。

PHPPHP

Posted by raika@blog