見出し画像

7day

静的メソッド(static)

◇ 静的メソッド(static) ◇

  • 静的メソッドの定義

→ アクセス修飾子 static function [メソッド名](引数)

  • 自クラスがもつ静的メソッドをコール

→ self : : [静的メソッド名]

  • 自クラス以外の静的メソッドをコールする。

→ [クラス名] : : [静的メソッド]

※ :: のことをスコープ定義演算子という。
あるメソッドの処理が、インスタンスごとの状態に左右される必要がなく、引数の値に応じて一定の戻り値を返すだけの時は、定義することができる。
インスタンスに左右されない、クラスを直接呼び出して処理をするイメージ。

// ord — 文字列の先頭バイトを、0 から 255 までの値に変換する。アスキーコード値をもとに文字を返す関数。

print ord('A') // 65
print chr(ord('A')); // A

main.php

<?php declare(strict_types=1); ?>
<body>
<?php
    require_once dirname(__FILE__) . '/Function.php';

    print ExcelColumnConverter::AlfabetName(3) . '<br>';
    print ExcelColumnConverter::NumberName('F');
?>
</body>

fucntion.php

<?php
declare(strict_types=1);

class ExcelColumnConverter
{
    public static function AlfabetName(int $number) : string
    {
// 数値で表された列の番号をもとに、あるが別途表記の列名を返す。
        return chr(ord('A') + $number);
    }
    
// アルファベット表記の列名をもとに、数値で表された列の番号を返す。
    public static function NumberName(string $alfabet) : int{
        return ord($alfabet) - ord('A');
    }
}

※ そのクラスがインスタンスごとの状態を持つべきでないという積極的な理由があるときのみ、静的メソッドで定義するようにしましょう。

◇ 静的プロパティ ◇

プログラム全体でクラスの1つの状態(プロパティを持つ値)を共有したい場合があります。
通常のプロパティは、インスタンス化しないといけないため、インスタンスごとに異なるプロパティ値を持つことになる。
一方で、静的プロパティは、インスタンスでなくクラスが持っているため、クラスをインスタンス化することなしに、2つ以上のプログラム処理で同じプロパティ値を共有することができます。

プロパティ$point は静的プロパティ。
プログラム中のどの処理から読み書きされてても、同一の値が参照されるということです。
countUpPointメソッドのような静的メソッドからであれば、自クラス内で静的プロパティにアクセスすることも可能。
まとめ

  1. 静的メソッド (Static Method):

    • クラスのインスタンスを作成せずに呼び出せるメソッドです。

    • 通常のメソッドとは異なり、特定のインスタンスにバインドされず、クラス自体に紐づいています。

    • クラス内で static キーワードを用いて宣言されます。

    • 静的メソッドは、他の静的メソッドや静的プロパティにアクセスする際に便利です。

  2. 静的プロパティ (Static Property):

    • クラスのインスタンスを作成せずにアクセスできる変数です。

    • 通常のプロパティとは異なり、特定のインスタンスに紐づかず、クラス自体に紐づいています。

    • クラス内で static キーワードを用いて宣言されます。

    • 静的プロパティは、同じクラスのすべてのインスタンスで共有される値を保持するのに役立ちます。

静的メソッドや静的プロパティは、特定のインスタンスに依存しない処理や、共有データの管理に使用されます。例えば、あるクラスに関連するユーティリティ関数を実装する場合や、全てのインスタンスで共通の設定を保存する場合などに利用されます。

●静的メソッドと静的プロパティは
→ 自クラスのインスタンスメソッド/インスタンスプロパティを使うことができない。
→ 両者の実態が異なる領域で管理されているため。

<?php declare(strict_types=1); ?>
<body>
<?php
    class SomeClass
    {
        // インスタンスプロパティ
        private $instanceProperty;
        // 静的メソッド
        public static function staticMethod()
        {
            // insutanceProperty にアクセスする。
            // エラー
            $this->instanceProperty= 1;
        }
    }
    SomeClass::staticMethod();
?>
</body>

管理されている場所がクラスでなくインスタンスであるため、アクセスできない。
静的メソッド内で自クラス、外部のクラスのインスタンスを新たに作ったうえで、そのインスタンスメソッド/プロパティを呼び出すことであればアクセスは可。
とおる例 ↓

<?php
// ------------------------ 何らかのクラス ------------------------------ //
class SomeClass
{
    private $instanceProperty;
    public function isntanceMethod()
    {
        print 'instanceMethod() called <br>';
    }
// クラス内の 静的メソッド
    public static function staticMethod()
    {
        $someClass = new SomeClass();
        $someClass->isntanceMethod();

        $exClass = new EXClass();
        $exClass->exMethod();
    }
}
// ーーーーーーーーー 外部クラス ーーーーーーーーーーーーー //
class EXClass
    {
// 外部クラスのインスタンスメソッド
        public function exMethod()
        {
            print 'exMethod() called <br>';
        }
    }
// ---------------------- メインルーチン ------------------------ //
SomeClass::staticMethod();

◇プロパティもメソッドももたない空のクラス◇

<?php declare(strict_types=1); ?> 
<body>
<pre>
<?php
    function printData(object $data) : void
    {
        print_r($data);
    }

    $data = new stdClass();
    $data->name = 'tarou';
    $data->adress = '東京';
    $data->age = 29;
    printData($data);
?>
</pre>
</body>

プロパティもメソッドももたない → stdClass というクラス がある。
配列や連想配列のように複数のデータをまとめて扱う目的で利用される。
クラスをわざわざ定義するほどでもない、変数でまとめて取り扱いたいときに重宝する。



~~~~~~~ コメント ~~~~~~~~~~~

昨日は会社の飲み会でできなかった。。。くそう。。
目標としていたところまで100ページもある。。。。
まにあわない。。。。

これ一か月でおわるんかいな・・・・:)

静的メソッド結構あやふやなところだからしっかりおぼえていかないと!
次からは継承とかはいってくるからしっかりしなきゃ。。。

この記事が気に入ったらサポートをしてみませんか?