Edited at

PHPでクラスを使う

More than 3 years have passed since last update.


はじめに

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 トレイト名,トレイト名;


トレイトの注意点

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


まとめ

クラスの基礎の基礎くらいは理解できたかもしれません。

インターフェイスなども調べていこうと思います。