PHPのClassの基礎基礎メモ
Classの基本
Classの使い方
こんな感じのの簡単なクラス。
<?php namespace MyClass; class MyClass { private $last_name = '鈴木'; public $first_name = '一郎'; public function my_name() { echo $this->last_name . $this->first_name; } }
使うほうはこんな感じ。
<?php require_once 'MyClass.php'; use MyClass\MyClass; $my_class = new MyClass(); $my_class->my_name(); // 鈴木一郎 $my_class->first_name = '太郎'; $my_class->my_name(); // 鈴木太郎 ?>
Classで利用できるアクセス修飾子
クラスで利用できるアクセス修飾子は3つ。
アクセス修飾子 | 説明 |
---|---|
public | どこからでも参照、呼び出しができる |
private | 自分のクラス内でのみ参照、呼び出しができる |
protected | 自分のクラス、もしくは自分のクラスを継承しているクラスのみ参照、呼び出しができる |
privateのプロパティにアクセスしようとするとエラーになる。
<?php require_once 'MyClass.php'; use MyClass\MyClass; $my_class = new MyClass(); $my_class->last_name = '伊藤'; // Uncaught Error: Cannot access private property $my_class->my_name(); ?>
クラス内でprivateプロパティにアクセスしてみる。
<?php namespace MyClass; class MyClass { function __construct() { echo '私の名前は'; } private $last_name = '鈴木'; public $first_name = '一郎'; public function my_name() { echo $this->last_name . $this->first_name,PHP_EOL; } public function change_last_name() { $this->last_name = '伊藤'; } }
以下のように変更することができる。
<?php require_once 'MyClass.php'; use MyClass\MyClass; $my_class = new MyClass(); $my_class->first_name = '太郎'; $my_class->change_last_name(); $my_class->my_name(); // 伊藤太郎 ?>
クラスに未設定のプロパティについて
以下のようにクラスに未設定のプロパティの読み書きも可能です。
<?php require_once 'MyClass.php'; use MyClass\MyClass; $my_class = new MyClass(); $my_class->first_name = '太郎'; $my_class->age='30'; $my_class->my_name(); // 伊藤太郎 ?>
ただし、プログラムの見通しが悪くなるのであまり利用しないほうが良さそうです。
staticプロパティ
クラスのプロパティはインスタンスごとに管理する値のインスタンス変数になります。 staticをつけて定義した場合は、クラス全体に影響するクラス変数になります。
<?php namespace MyClass; class MyClass { private $last_name = '鈴木'; public $first_name = '一郎'; public static $biz = '株式会社ほげほげ'; public function my_name() { echo self::$biz . 'の' . $this->last_name . $this->first_name,PHP_EOL; } public function change_last_name() { $this->last_name = '伊藤'; } }
staticプロパティを書き換えた場合、クラス全体に影響します。
<?php require_once 'MyClass.php'; use MyClass\MyClass; $my_class = new MyClass(); $my_class::$biz = '有限会社フガフガ'; $my_class->first_name = '太郎'; $my_class->my_name(); // 有限会社フガフガの鈴木太郎 $my_class2 = new MyClass(); $my_class2->first_name = '次郎'; $my_class2->my_name(); // 有限会社フガフガの鈴木次郎 ?>
定数について
クラスの定数は、const
キーワードを利用します。 定数は変数のように、$
をつけません。 アクセスできる範囲はpublicです。
<?php namespace MyClass; class MyClass { const YEAR = 2019; public function shoConst(){ echo self::YEAR; } }
<?php require_once 'MyClass.php'; use MyClass\MyClass; $my_class = new MyClass(); $my_class->shoConst(); // 2019 ?>
関数
static メソッド
staticメソッドは、インスタンス化されていないくても外部から呼ぶことができます。 また、$thisを利用することができずselfを利用します。
<?php namespace MyClass; class MyClass { private static $name = '太郎'; public static function get_name(){ return self::$name; } public static function set_name($v){ self::$name = $v; } }
こんな感じになる。直接クラスから呼び出すこともできる。
<?php require_once 'MyClass.php'; use MyClass\MyClass; $my_class = new MyClass(); echo $my_class->get_name(); //太郎 MyClass::set_name('TAEO'); echo MyClass::get_name(); // TARO ?>
コンストラクタ
コンストラクタはインスタンスが作成されるタイミングで実行されます。
<?php namespace MyClass; class MyClass { private $name; public function __construct($v) { $name = $v; echo $name; } } ?>
こんな感じで、インスタンスを作ったタイミングで実行される。
<?php require_once 'MyClass.php'; use MyClass\MyClass; $name = '太郎'; $my_class = new MyClass($name); // 太郎 ?>
デコンストラクタ
インスタンスが消された(スクリプトが終了した)タイミングで実行されます。
<?php namespace MyClass; class MyClass { public function __construct() { echo 'インスタンスを作成'; } public function hello(){ echo 'hello'; } function __destruct(){ echo 'インスタンスを破棄'; } }
こんな感じ。
<?php require_once 'MyClass.php'; use MyClass\MyClass; $my_class = new MyClass(); //インスタンスを作成 $my_class->hello(); // hello // インスタンスを破棄 ?>
継承
クラスの継承はextends
キーワードを利用します。
class subClass extends SuperClass{ ... }
オーバーライド
親クラスの定義を子クラスで同じ名前で定義すると上書きできることをオーバーライドと言います。
親クラス
<?php class SuperClass { public $name = '太郎'; public function show_name(){ echo $this->name; } }
子クラス
<?php require_once 'SuperClass.php'; class SubClass extends SuperClass { public $name = 'TARO'; }
実行すると$name
が子クラスの値でおきかえられます。
<?php require_once 'SubClass.php'; $my_class = new SubClass(); $my_class->show_name(); //TARO ?>
parentキーワード
子クラスの中から親クラスの操作をしたい場合はparent
キーワードを利用します。
親クラス
<?php class SuperClass { private $name = '太郎'; public function __construct($v) { $this->name = $v; } public function show_name(){ echo $this->name; } }
子クラス
子クラスから親クラスのコンストラクタを実行してみる。
<?php require_once 'SuperClass.php'; class SubClass extends SuperClass { private $name = '小太郎'; public function __construct() { parent::__construct($this->name); } }
実行してみる。
<?php require_once 'SubClass.php'; $my_class = new SubClass(); $my_class->show_name(); //小太郎 ?>
finalキーワード
finalキーワードをつけてメソッドを宣言すると、子クラスからのオーバーライドができなくなります。
親クラス
<?php class SuperClass { private $name = '太郎'; public final function show_name(){ echo $this->name; } }
子クラス
<?php require_once 'SuperClass.php'; class SubClass extends SuperClass { private $age = 25; public function show_name(){ echo $this->age; } }
実行するとエラーになる。
<?php require_once 'SubClass.php'; $my_class = new SubClass(); $my_class->show_name(); //Cannot override final method SuperClass::show_name() ?>