第1章
第1章 · 初心者向け

PHP・オブジェクト指向の基礎

専門用語はあとにします。まずは「設計図」と「実物」の違いだけ押さえましょう。

1. クラスとは

クラス=ものの設計図(まだ実物ではない)
たとえ

クッキーの抜き型がクラス、焼いたクッキーがオブジェクトです。抜き型だけでは食べられません。でも抜き型があるから、同じ形を何個でも作れます。

プログラムでも「ユーザー」や「商品」を扱うとき、先に設計図を書きます。

class User
{
}
  • class「これから設計図を書きます」という宣言
  • User設計図の名前(大文字始まりが慣例)
  • { }この中に中身を書く。今は空
いま覚えること

クラスを書いただけでは、まだ何も動きません。「設計図を用意しただけ」です。

2. オブジェクトとnew

new=設計図から実物を作るスイッチ

実物のことをオブジェクト(またはインスタンス)と呼びます。

$user = new User();
  • new User()User設計図から1つ作る
  • $user =作った実物に名前(変数)をつける

同じ設計図から、別々の実物を何個でも作れます。

$taro = new User();
$hanako = new User();
// $taro と $hanako は別人(別オブジェクト)
つまずきやすい点

User(クラス)と $user(オブジェクト)は別物です。大文字・小文字と $ の有無に注目してください。

3. プロパティとメソッド

プロパティ=持っているデータ / メソッド=できること(処理)
たとえ

人でいうと、名前や年齢がプロパティ。自己紹介する・歩く、がメソッドです。

class User
{
    public $name;  // プロパティ(データ)

    public function showName()  // メソッド(処理)
    {
        echo $this->name;
    }
}

function のあとの名前がメソッド名です。末尾の () は「呼び出すときに使う」印、と思ってください。

4. -> の意味

->=「このオブジェクトの〜」と読む矢印

日本語にするとこうなります。

$user = new User();
$user->name = 'Taro';   // $user の name に Taro を入れる
$user->showName();     // $user の showName を実行する
読み方のコツ

$user->name は「ユーザーの名前」。$user->showName() は「ユーザーに自己紹介させる」。

5. $this の意味

$this=いま動いている自分自身のオブジェクト

メソッドの中では、外側の $user という名前が見えません。なので「自分の名前」を指す特別な言葉 $this を使います。

class User
{
    public $name;

    public function showName()
    {
        echo $this->name;
    }
}

ここで出てくる短い式がこれです。

$this->name

意味は「このオブジェクトが持っている name」です。

たとえ

教室で先生が「自分の名前を書いて」と言うときの「自分」が $this です。太郎なら太郎、花子なら花子を指します。

CakePHPでも同じ

あとで出てくる $this->set()$this->request も、「今のController自身の〜」という意味です。

6. public / protected / private

「外から触ってよいか」のルール(鍵の種類)
  • public … 誰でも触ってOK(公開)
  • protected … 自分と、引き継いだ子クラスだけ
  • private … そのクラスの中だけ(非公開)
class User
{
    public $name;        // 外から見える
    protected $role;     // 家族(継承先)まで
    private $password;   // 自分の中だけ
}
初心者への案内

最初は「だいたい public で書いてある」と読み流してOKです。パスワードのような秘密は private、とだけ覚えておきましょう。

7. コンストラクタ __construct()

__construct()new した瞬間に自動で走る「初期セット」

作った直後に名前を入れておきたい、というときに使います。

class User
{
    public $name;

    public function __construct($name)
    {
        $this->name = $name;
    }
}

$user = new User('Taro');
// 作った瞬間に name が Taro になる
名前の覚え方

construct=組み立てる。組み立てた直後の処理、と覚えると楽です。

8. クラス定数・const

const=変わらない値に名前を付けたもの

マジックナンバー(意味の分からない数字や文字列)を減らすために使います。

class User
{
    public const ROLE_ADMIN = 'admin';
}

echo User::ROLE_ADMIN;  // admin

定数はオブジェクトではなくクラス名から、:: で取ります(次の項目)。

9. 継承とextends

extends=親の設計図を引き継いで、少し改造する
たとえ

「動物」の設計図を引き継いで「犬」を作る、イメージです。犬は動物の性質を持ちつつ、鳴き方だけ変えられます。

class Animal
{
    public function speak()
    {
        echo '...';
    }
}

class Dog extends Animal
{
    public function speak()
    {
        echo 'wan';
    }
}
CakePHPでの登場シーン

class TodosController extends AppController のように、「CakePHP用意のControllerを引き継ぐ」形で必ず使います。

10. parent::::

::=クラス側のものを呼ぶ / parent::=親クラスのものを呼ぶ

矢印 -> は「実物の〜」、二重コロン :: は「設計図(クラス)の〜」と分けると混乱しにくいです。

class Dog extends Animal
{
    public function speak()
    {
        parent::speak();  // まず親の speak を実行
        echo ' wan';
    }
}

第1章 やってみよう

EXERCISE

Product(商品)を作る

  1. Product クラスを作る
  2. プロパティ $name$price を持たせる
  3. コンストラクタで両方セットする
  4. show() で「本: 1200円」のように表示する

ヒント: 第1章の User クラスを、名前を変えて写すところから始めましょう。