はじめに
PHP・WEB開発を独学中のアラフィフ主婦の忘備録です。
メソッドの種類
PHPでは クラスメソッド と インスタンスメソッド という2種類のメソッドがあります。
- インスタンスメソッドは、インスタンス生成後にアクセスが可能なメソッドです。インスタンス毎に引数を代入する為、それぞれのメソッドで値が異なります。
- クラスメソッドはインスタンスを生成せずにアクセスが可能なメソッドです。クラス自体に紐づく為、インスタンスに関わらず共通の処理を行います。
クラスメソッドを実行するには、クラスの中からと外からで書き方が違います。
クラスメソッドをクラス外から実行する
class Customer
{
// クラスメソッドの定義
public static function sayHello() { // アクセス修飾子に続けて static を記述
echo "Hello\n";
}
}
// クラス外からの実行
Customer::sayHello(); // クラス名::(スコープ演算子)クラスメソッド名();
出力結果
Hello
インスタンス生成なしでクラスの中のsayHello()
メソッド(関数)を実行できる。
クラスメソッドをクラス内から実行する
class Customer
{
public function __construct() { // __construct(コンストラクタ)を使えばインスタンス生成と同時に実行される
// クラス内からの実行
self::sayHello(); // self::(スコープ演算子)クラスメソッド([実引数]);
}
// クラスメソッドの定義
public static function sayHello() { // アクセス修飾子に続けて static を記述
echo "Hello\n";
}
}
$customer = new Customer(); // インスタンス生成
出力結果
Hello
クラス内で__construct
(コンストラクタ)を使っているので、インスタンス生成だけで出力されるが、クラス外から実行するよりもコードが長くなる。
注意点
【アクセス可】インスタンスメソッド ⇒ ○ クラス変数 / メソッド
【アクセス不可】クラスメソッド ⇒ × インスタンス変数 / メソッド
class User
{
// インスタンス変数を定義
public $name = "きらり";
// クラスメソッドの定義
public static function showName()
{
// クラスメソッドからインスタンス変数・インスタンスメソッドへのアクセスは不可
echo $this->name; // "きらり"にはアクセスできない
// Fatal error: 出力結果はエラー
// Uncaught Error: Using $this when not in object context
}
// インスタンスメソッドの定義
public function callShowName()
{
// インスタンスメソッドからクラスメソッドへのアクセスは可能
self::showName(); // $this->name を出力できる
}
}
// クラスメソッドをクラス外から実行
User::showName(); // クラス名とクラス変数の間に ::(スコープ演算子)を用いてアクセス
// インスタンス生成しての実行
$user = new User();
$user->callShowName();
出力結果
PHP Fatal error: Uncaught Error: Using $this when not in object context in /workspace/Main.php:11
Stack trace:
#0 /workspace/Main.php(25): User::showName()
#1 {main}
thrown in /workspace/Main.php on line 11
クラスメソッドからインスタンス変数・インスタンスメソッドへのアクセスできないので、いずれにしてもエラーになる。
修正します
インスタンス変数を static
を用いてクラス変数として定義することでアクセスできるようになります。
class User
{
public static $name = "きらり"; // static を用いてクラス変数として定義する
public static function showName()
{
echo self::$name . "\n"; // self:: を付けてクラス変数へアクセスできる
}
public function callShowName()
{
self::showName();
}
}
User::showName();
$user = new User();
$user->callShowName();
出力結果
きらり
きらり
クラスメソッド ”まとめ”
- アクセス修飾子に続けて
static
を記述して定義する - クラス内から実行するには
self::クラスメソッド名()
- クラス外から実行するには
クラス名::クラスメソッド名()
(インスタンスを生成せずにアクセスが可能) - 【アクセス不可】クラスメソッド ⇒ × インスタンス変数 / メソッド
最後に
クラスはとにかくややこしくて、学習中のサイトの解説だけでは分からない部分が多かった。自分なりにかみ砕いて1つ1つ理解していくことが必要でした。