開発ノート【PHP基本文法:object】
開発ノート【PHP基本文法:object】です。
当サイトは、Bootstrap5で製作しています。
PHP基本文法:object
ソースコードの入力ルール
命名規則
クラス名
-
Item
単語の先頭を大文字にする。
クラス(class)を作る
- Itemという名前のクラスを作る。
class Item {
// プロパティ(変数)を定義する
public string $name; // 品名($nameというプロパティ)
public int $price; // 価格($priceというプロパティ)
}
-
public:アクセス修飾子
どこからでも使うことが出来る、という宣言。 - string、intなど、型の記述は省略可。(記述が望ましい)
-
クラスを作るメリット。
グループにすることで、要素がわかりやすくなる。
class Item {
// プロパティ(変数)を定義する
public string $name; // 品名($nameというプロパティ)
public int $price; // 価格($priceというプロパティ)
}
$php_basic = new Item();
$php_basic->name = 'PHP入門';
$php_basic->price = 1500;
echo $php_basic->name, '/', $php_basic->price;
echo "\n";
$java_basic = new Item();
$java_basic->name = 'java入門';
$java_basic->price = 3600;
echo $java_basic->name, '/', $java_basic->price;
実行結果PHP入門/1500
java入門/3600
インスタンスを作る
- クラスからインスタンスを作るときは、「new」という記述から始める。
$php_basic = new Item();
$php_basic->name = 'PHP入門';
$php_basic->price = 1500;
echo $php_basic->name, '/', $php_basic->price;
- $php_basic:「$php_basic」という変数に、「Item」というインスタンスが代入される。(1行目)
-
インスタンスが生成されると、Itemクラスの$nameと$priceプロパティ(変数)にアクセスが可能になる。
代入:3行目と4行目。
参照:6行目。
PHP入門/1500
メソッドを作る
- クラス内に作る。
class Item {
// プロパティ(変数)を定義する
public string $name; // 品名($nameというプロパティ)
public int $price; // 価格($priceというプロパティ)
// 価格を取得するメソッドを定義する
public function getPrice(string $end = '') {
return number_format($this->price) . $end;
}
}
$php_basic = new Item();
$php_basic->name = 'PHP入門';
$php_basic->price = 1500;
echo $php_basic->name, '/', $php_basic->price;
echo "\n";
echo $php_basic->name, '/', $php_basic->getprice('円');
- $this:クラス定義をすると使える特殊な変数(自分自身のクラスという意味)
PHP入門/1500
PHP入門/1,500円
コンストラクターでプロパティ(変数)の初期化をする
-
コンストラクター
クラスを作るときの処理。
直接、プロパティに値を代入しなくても、コンストラクターに値を代入することで、自動的にプロパティに値が設定出来る。 -
Itemというクラスを作るときは、$nameと$priceは必ず値を設定しなければいけない。(上記「メソッドを作る」の13行目と14行目)
このようなときに使えるのがコンストラクター。 -
必ず、publicにして、ファンクション名は、__construct()にする。
public function __construct()
※このように記述しないと動作しない。
class Item {
// プロパティ(変数)を定義する
public string $name; // 品名($nameというプロパティ)
public int $price; // 価格($priceというプロパティ)
// コンストラクター
public function __construct(string $name, int $price = 0) {
$this->name = $name;
$this->price = $price;
}
// 価格を取得するメソッドを定義する
public function getPrice(string $end = '') {
return number_format($this->price) . $end;
}
}
$php_basic = new Item('PHP入門');
echo $php_basic->name, '/', $php_basic->price;
echo "\n";
echo $php_basic->name, '/', $php_basic->getprice('円');
echo "\n";
$java_basic = new Item('java入門', 2300);
echo $java_basic->name, '/', $java_basic->getprice('円');
実行結果PHP入門/0
PHP入門/0円
java入門/2,300円
ゲッターとセッター
-
上記「メソッドを作る」の13行目と14行目のように、直接プロパティの値を変えるのは望ましくない。
※protectedやprivateを使って、クラスの中でしかプロパティの値を変えることが出来ないようにしてしまう。(クラスが責任を持って値が正しいことを保証する)
※protectedとprivateは、継承クラスを作ったときに違いが出てくる。 -
プロパティの値の操作は、メソッド(クラス内でゲッター(getter)とセッター(setter))を使う。
getter:値を取得する。
setter:値を設定する。 -
メソッド(getterとsetter)を使うメリット。
※例えば、if構文を使って値のチェックが出来る。
class Item {
// プロパティ(変数)を定義する
public string $name; // 品名($nameというプロパティ)
private int $price; // 価格($priceというプロパティ)
// コンストラクター
public function __construct(string $name, int $price = 0) {
$this->name = $name;
$this->price = $price;
}
//価格を設定するメソッドを定義する(setter)
public function setprice(int $price) {
if ($price < 0) {
return false;
}
$this->price = $price;
return true;
}
// 価格を取得するメソッドを定義する(getter)
public function getPrice(string $end = '') {
return number_format($this->price) . $end;
}
}
$php_basic = new Item('PHP入門', 2000000);
$php_basic->setPrice(100);
echo $php_basic->name, '/', $php_basic->getprice('円');
echo "\n";
$java_basic = new Item('java入門', 2300);
echo $java_basic->name, '/', $java_basic->getprice('円');
実行結果PHP入門/100円
java入門/2,300円
- 28行目の値を-(マイナス)にしたとき。
$php_basic->setPrice(-100);
実行結果PHP入門/2,000,000円
java入門/2,300円
クラスを継承して子クラスを作る
-
下記27行目。
Itemクラスを継承して、Bookという子クラスを作っている。 - Bookは、継承元のItemで定義しているプロパティやメソッドをそのまま使うことが出来る。
class Item {
// プロパティ(変数)を定義する
public string $name; // 品名($nameというプロパティ)
private int $price; // 価格($priceというプロパティ)
// コンストラクター
public function __construct(string $name, int $price = 0) {
$this->name = $name;
$this->price = $price;
}
//価格を設定するメソッドを定義する(setter)
public function setprice(int $price) {
if ($price < 0) {
return false;
}
$this->price = $price;
return true;
}
// 価格を取得するメソッドを定義する(getter)
public function getPrice(string $end = '') {
return number_format($this->price) . $end;
}
}
class Book extends Item {
public int $page; // 書籍の頁数($pageというプロパティ)
}
$php_basic = new Item('PHP入門', 2000);
$php_basic->page = 100;
$php_basic->setPrice(1500);
echo $php_basic->name, '(',$php_basic->page, '頁)/', $php_basic->getprice('円');
echo "\n";
$java_basic = new Item('java入門', 2300);
$java_basic->page = 300;
echo $java_basic->name, '(',$java_basic->page, '頁)/', $java_basic->getprice('円');
- 31行目と38行目は、下記のように記述しても大丈夫。
$php_basic = new Book('PHP入門', 2000);
$java_basic = new Book('java入門', 2300);
実行結果PHP入門(100頁)/1,500円
java入門(300頁)/2,300円
***
実行結果***
実行結果***
実行結果