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 です。太郎なら太郎、花子なら花子を指します。
あとで出てくる $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';
}
}
class TodosController extends AppController のように、「CakePHP用意のControllerを引き継ぐ」形で必ず使います。
10. parent:: と ::
::=クラス側のものを呼ぶ / parent::=親クラスのものを呼ぶ矢印 -> は「実物の〜」、二重コロン :: は「設計図(クラス)の〜」と分けると混乱しにくいです。
class Dog extends Animal
{
public function speak()
{
parent::speak(); // まず親の speak を実行
echo ' wan';
}
}
第1章 やってみよう
Product(商品)を作る
Productクラスを作る- プロパティ
$nameと$priceを持たせる - コンストラクタで両方セットする
show()で「本: 1200円」のように表示する
ヒント: 第1章の User クラスを、名前を変えて写すところから始めましょう。