0
0

More than 1 year has passed since last update.

PHPのクラスについて

Posted at

はじめに

日本システム開発株式会社の藤井といいます。
タイトルにもあるようにクラスについてまとめました。
クラスとは?より、PHPのクラスについての内容になっています。

オブジェクトについて

オブジェクトは他の言語の参照と同じように扱えます。

$obj = new StdClass()を実行すると、$objにはオブジェクトのIDが代入されます。
$objを他の変数に代入すると、オブジェクトのIDがコピーされます。
$objには、オブジェクトのIDが代入されているため、nullを再代入してもオブジェクトは消えません。(他の言語の参照と同じ動作です)

<?php
$obj = new StdClass();
var_dump($obj);
$obj2 = $obj;
$obj = null;
var_dump($obj2);

プロパティに代入した無名関数の呼び出し

PHPはプロパティへのアクセス、メソッドへのアクセスをコンテキストによって判断します。
「()」がついた呼び出しはメソッドへのアクセス、それ以外はプロパティへのアクセスと判断します。
そのため、プロパティに無名関数を代入すると、直接呼び出すことができなくなります。(一度、変数に代入する必要がある)

ワンラインでプロパティに代入した無名関数を呼び出すには、
($obj->closure)()で、プロパティにアクセスしてから呼び出します。

<?php
$obj = new StdClass();
$obj->closure = function() {echo "hello";};
($obj->closure)();

静的遅延束縛

静的遅延束縛は「staticキーワード」と「スコープ定義演算子」を使います。
静的遅延束縛を使うと、親クラスから子クラスのメソッドを呼び出すことができます。

<?php
class Hoge {
    public static function func1() {
        static::func2();
    }
}
class Huga extends Hoge {
    public static function func2() {
        echo "Huga::func2" . PHP_EOL;
    }
}

Huga::func1();

staticキーワードは、直近の非転送コール(転送コール以外)に解決されます。
転送コールとは、「self」「parent」「static」を使った呼び出しを指します。
上記の例では、static::func2();にとって、Huga::func1();が直近の非転送コールにあたるため、staticHugaに解決されます。

まとめ

  • オブジェクトをインスタンス化すると、変数にはオブジェクトのIDが代入される
  • PHPは、プロパティへのアクセス、メソッドへのアクセスをコンテキストで判断する
  • 静的遅延束縛を使うと、親クラスから子クラスのメソッドを呼び出すことができる
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