46
43

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 5 years have passed since last update.

PHPでクラスを使う

Last updated at Posted at 2016-04-21

##はじめに
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 トレイト名,トレイト名;

###トレイトの注意点

便利な半面、むやみに使っていると、複雑な依存関係をもってしまい密結合になってしまう。

##まとめ
クラスの基礎の基礎くらいは理解できたかもしれません。
インターフェイスなども調べていこうと思います。

46
43
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
46
43

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?