0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PHPのstaticの理解〜初心者用〜

Last updated at Posted at 2020-05-17

##はじめに
PHPを勉強し始めると、すぐに出てくるstaticというキーワードですが
自分が理解をするのに時間がかかってしまったので
アウトプットも兼ねてまとめていきます。

##staticとは

インスタンスを作らずにクラス変数もしくは、
クラスメソッドを宣言すればアクセスすることができます。

staticは、インスタンス(個別の実体)ではなく
クラス側にプロパティやメソッドを持たせることができます。
クラス側に持たせた変数は「クラス変数」
関数を「クラスメソッド」といいます。

###注意点

1.staticの変数はオブジェクトからのアロー演算子->でアクセス不可
2.sutaticではないメソッドをstaticをつけたものと同じ方法で呼び出すとエラーになる

詳しくは、PHPドキュメントのこちらをご確認ください。

###クラス変数やクラスメソッドの呼び出し方

クラス変数やクラスメソッドでは、アロー演算子->が使えないため
->の代わりにスコープ定義演算子(::)を
$thisの代わりにselfを使います。

Nekoクラスにクラス変数とクラスメソッドを使ってみます。

test.php

<?php

<?php

class Neko {
    public static $type = "飼いネコ";
    public $suffix = "";
    
    public $hp = 20;
    public $power = 10;
    
    function __construct($suffix) {
        $this->suffix = $suffix;
    }
    
    function name() {
        return $this::$type . "の" . $this->suffix;
    }
    
    function attack($owner) {
        print $this->name() . "が" . $owner . "を攻撃し" . $this->power . "ポイントのダメージを与えた!" . PHP_EOL;
    }
    
    //クラスメソッド
    static function description() {
        print self::$type . "は、凶暴だが最愛の家族だ。" . PHP_EOL;
    }
}

Neko::description();

$neko_A = new Neko("モカ");
$neko_B = new Neko("カフェ");

$neko_A->attack("飼い主");
$neko_B->attack("他のネコ");

コンソール入力

$php tex.php

実行結果


飼いネコは、凶暴だが最愛の家族だ。
飼いネコのモカが飼い主を攻撃し10ポイントのダメージを与えた!
飼いネコのカフェが他のネコを攻撃し10ポイントのダメージ

クラスの説明をする関数
description()という名前のクラスメソッドを用意しました。

Neko::description();と書いて呼び起こしていますが
アロー関数->を使うとどうでしょう。


// Neko::description(); だったものを
Neko->description();

実行結果


PHP Parse error:  syntax error, unexpected '->' (T_OBJECT_OPERATOR)

となり、変なところに->があるねん!という内容になります。
なので、staticをつけた変数や関数はクラス名::○○と書く必要があるということですね。(変数を参照したい場合はスコープ定義演算子の後に$を入れてください)

###まとめ

スコープ定義演算子が出てきた時は、
アロー演算子を覚えたばかりだと戸惑ってしまいますが
staticを使った関数の場合はアロー演算子ではなく
スコープ定義演算子を使うと覚えれば良さそうです。


・クラス名::○○ static宣言されたメソッドやプロパティへアクセスする
・self::○○ 自クラスのクラス変数、クラスメソッドへアクセスする
・parent:: 指定した親クラスを示す
・インスタンス変数::○○ (self::○○) インスタンスが持つクラス変数やクラスメソッドへアクセスする

0
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?