##はじめに
jsしか書いたことがなかったので、馴染みのない書き方が結構ありました。
間違っているかもしれないので、コメントください。
##クラスの基本設定
<?php
class User
{
//メンバー
public $name;
private $nickname;
//コンストラクタ
public function __construct($name,$nickname){
//引数をメンバー変数に格納
$this->name = $name;
$this->nickname = $nickname;
}
}
//インスタンス化
$user = new User('sato','unko');
echo $user->name;
echo $user->nickname;//Fatal error: Cannot access private property
?>
###コンストラクタ
コンストラクタは__construct
でメソッドを作成します。
###メンバーへのアクセス
メンバー変数へのアクセスは、->
を使う。jsでのthis.name
と似た感じ?
$this->$name = $name;
ではなく、$this->name = $name;
なのはPHPのルール。
###アクセス修飾子
アクセス修飾子 | 意味 |
---|---|
public | 外部から参照できる |
private | 変数、関数を宣言したクラス内のみ参照できる |
protected | 変数、関数を宣言したクラスと継承されたクラスから参照できる |
下記のように何も宣言しない場合は、publicとして扱われる。
<?php
class User
{
$name;
##クラスを継承
<?php
class User
{
//メンバー
public $name;
//コンストラクタ
public function __construct($name){
//引数をメンバー変数に格納
$this->name = $name;
}
protected function changeName($new_name){
$this->name = $new_name;
}
}
//classを継承
class ChildUser extends User{
public function subChangeName($new_name){
//protectedの関数は子クラスから呼ぶことは可能
$this->changeName($new_name);
}
};
//インスタンス化
$user = new User('sato');
echo $user->name;//sato
//Userクラスを継承したクラスをインスタンス化
$new_user = new ChildUser('kato');
$new_user->subChangeName('chinko');
echo $new_user->name;//chinko
?>
###継承方法
継承するには、extendsキーワードを使います。
※多重継承はできません。
class クラス名 extends 継承するクラス{}
###オーバーライド
変数や、関数は同じ名前を子クラスに定義すれば、親クラスの変数、関数を上書きすることができます。
<?php
class User
{
//メンバー
private $name;
//コンストラクタ
public function __construct($name)
{
//引数をメンバー変数に格納
$this->name = $name;
}
public function changeName($new_name){
$this->name = $new_name;
}
}
//classを継承
class ChildUser extends User{
public function changeName($new_name){
$this->name = $new_name . 'です。';
}
};
//インスタンス化
$user = new User('sato');
//echo $user->name;//sato
$new_user = new ChildUser('sato');
$new_user->changeName('chinko');
echo $new_user->name;//chinkoです。
?>
オーバーライドされたくない場合は、final
キーワードを使用します。
オーバーライドされた場合、エラーメッセージが表示されます。
<?php
class User
{
//メンバー
private $name = '佐藤';
final public function changeName($new_name){
$this->name = $new_name;
}
}
//classを継承
//Fatal error: Cannot override final method
class ChildUser extends User{
public function changeName($new_name){
$this->name = $new_name . 'です。';
}
};
?>
###クラス内で定数を使う
クラス内の定数はdefine
ではなく、const
キーワードを使う。
<?php
class User
{
const CITY = 'TOKYO';
public function __construct($name){
//定数を表示
echo self::CITY;//TOKYO
}
}
####constの使い方
クラス自身を指すself
キーワードと::
を使用する。
self::定数名
##トレイト
コードの再利用をする為の仕組み。多重継承のような、使い勝手を実現してくれます。
<?php
trait GreetAtrait{
public function morning(){
echo $this -> name . 'です。おはようございます。';
}
public function evening(){
echo $this -> name . 'です。こんにちわ。';
}
}
trait GreetBtrait{
public function morningB(){
echo $this -> name . 'です。眠いです。';
}
public function eveningB(){
echo $this -> name . 'です。まだ眠いです。';
}
}
class User
{
//トレイトを指定
use GreetAtrait,GreetBtrait;
private $name;
//コンストラクタ
public function __construct($name){
//引数をメンバー変数に格納
$this->name = $name;
}
}
$user = new User('佐藤');
$user -> morning();//佐藤です。おはようございます。
$user -> evening();//佐藤です。こんにちわ
$user -> morningB();//佐藤です。眠いです。
$user -> eveningB();//佐藤です。まだ眠いです。
?>
###トレイトを追加
class User{
use トレイト名;
###トレイトを複数追加
class User{
use トレイト名,トレイト名;
###トレイトの注意点
便利な半面、むやみに使っていると、複雑な依存関係をもってしまい密結合になってしまう。
##まとめ
クラスの基礎の基礎くらいは理解できたかもしれません。
インターフェイスなども調べていこうと思います。