Progateを使ってPHPのオブジェクト指向をマスター?

ProgateのPHPコース2の学習はオブジェクト指向を中心に学んでいきます。オブジェクト指向はクラスとかがでてくるやつですね。
PHPのクラス
class クラス名{} とかけばいいようですね。クラス名は大文字みたいですね。
<?php
class Myclass{}
//インスタンス化はクラスの外で
$person = new Myclass();
?>
PHPのメンバー
PHPではメンバーという呼び方はあってるかわかりませんが、プロパティやメソッドがあるようです。フィールドという呼び方ではなくプロパティというようですね。
プロパティ
プロパティのアクセスは -> を使って行うことと、$は必要ないことに注意です。
<?php
class Menu {
// $nameというプロパティを定義してください
public $name;
}
$curry = new Menu();
$pasta = new Menu();
// $curryのnameプロパティに'CURRY'を代入してください
$curry->name="CURRY";
// $pastaのnameプロパティに'PASTA'を代入してください
$pasta->name="PASTA";
// $curryのnameプロパティをechoしてください
echo $curry->name;
echo '<br>';
// $pastaのnameプロパティをechoしてください
echo $pasta->name;
?>
メソッド
phpのメソッド呼び出しも -> 矢印みたいな記号を使います。
<?php
class Menu {
public $name;
public function hello(){
echo "私はMenuクラスのインスタンスです";
}
}
$curry = new Menu();
$pasta = new Menu();
$curry->name = 'CURRY';
$pasta->name = 'PASTA';
$curry->hello();
$pasta->hello();
?>
thisキーワード
thisキーワードはインスタンス自身。phpのthisは $thisとかいてメンバーにアクセスするときは -> 矢印みたいな記号を使う
<?php
class Menu {
public $name;
public function hello() {
echo "私は{$this->name}です";
}
}
$curry = new Menu();
$pasta = new Menu();
$curry->name = 'CURRY';
$pasta->name = 'PASTA';
$curry->hello();
echo '<br>';
$pasta->helo();
?>
コンストラクター
コンストラクターはインスタンス生成時に自動で実行される構文 PHP のコンストラクターは
public function __construct(){} でとくにクラス名指定などがない
<?php
class Menu {
public $name;
// コンストラクタを定義してください
public function __construct(){
echo "1つのメニューが作られました";
}
public function hello() {
echo '私は'.$this->name.'です';
}
}
?>
引数ありのコンストラクターでプロパティを初期化する
<?php
class Menu {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
?>
htmlへPHP文の埋め込み
htmlへphpを埋め込むときに、phpの内容を表示させるにはecho を使用すればよいようです。
<p><?php echo $curry->name ?></p> <p><?php echo $pasta->name ?></p>
endキーワードを使用したphp構文の埋め込み
if,for,while,switchなど{}ブロックをもつものは
<?php for($i = 0; $i < 5; $i++): ?> //ここに処理 <?php endfor?>
のような形でわかりやすく書くことができるようです。コロンキーワードを使うとよいようですね。
たとえばインスタンスを格納した配列を出力したい場合に endforeach を使ってhtmlにphpを埋め込むと以下のような形になるようです。
<?php foreach($menus as $menu):?>
<h3><?php echo $menu->name?></h3>
<?php endforeach?>
定義ファイルの切り分け(requier_once(“”))
クラスを定義したりメンバーを定義したりと、全部一緒だとごちゃごちゃしてくるので、クラス定義、データ定義、メインのフィアルを切り分けて、require_once(“”)を使って呼び出す。
クラス定義ファイルは主にプロパティやメソッドなどのメンバーを記述(myclass.php)
<?php class MyClass{//メンバー}?>データ定義ファイルはそれをインスタンス化されたデータなどを記述しておけばよいみたいです。(data.php)
<?php
require_once("myclassphp");
$person = new MyClass("tanaka");
$person2 = new MyClass("suzuki");
?>
メインのファイルにdata.phpを読みこんで使いやすくする
<?php
require_once("data.php");
?>
クラス定義ファイルやデータ定義ファイルの活用
html属性にphpファイルで定義した値を使用したり、htmlタグの中身にphpファイルで定義した値を使用できたりする。
<?php
//クラス定義ファイル(myclass.php)
calss MyClass(){
public $name;
public $site;
public function __construct($name, $site){
$this->name = $name;
$this->site = $site;
}
}
?>
<?php
//データ定義ファイル(data.php)
require_once("myclass.php");
$person = new MyClass("tanaka", "http://example.com");
?>
<?php
//メインのファイル(main.php)
require_once("data.php");
<a href="<?php echo $person->site ?>"><?php echo $person->name?>さんのサイトです</a>
?>
ようするにhtmlの属性にもphpを埋め込めるんだという理解で良いかと思います。プロパティやメソッドにアクセスするときにインスタンスをわすれたり、表示したいけどechoを書き忘れることが多いので注意します。
カプセル化
プロパティをprivateにしてクラス外部からプロパティに直接アクセスできなくするやつですね。privateなプロパティの値を取得したり変更したりするにはゲッターとセッターを使うようです。セッターで値の変更を行うなどはデータ定義用のファイルで行えばよいようですね。
- ゲッター -> 値の取得を行う
- セッター -> 値の変更を行う
<?php
//class定義ファイル(myclass.php)
private $name;
public function getName(){
return $this->name;
}
public function setName($name){
$this->name = $name;
}
?>
連想配列を使ったphpのサンプルコード
以下はクラス定義ファイルやデータ定義ファイルがぬけているが、phpを活用するにはこんな感じで使う。連想配列でmenuを呼び出し。それをゲッターを使って呼び出している。
<form method="post" action="confirm.php">
<div class="menu-items">
<?php foreach ($menus as $menu): ?>
<div class="menu-item">
<img src="<?php echo $menu->getImage() ?>" class="menu-item-image">
<h3 class="menu-item-name"><?php echo $menu->getName() ?></h3>
<p class="price">¥<?php echo $menu->getTaxIncludedPrice() ?>(税込)</p>
<input type="text" value="0" name="<?php echo $menu->getName();?>">
<span>個</span>
</div>
<?php endforeach ?>
</div>
<input type="submit" value="注文する">
</form>
htmlのinputタグのname属性にphpを埋め込む例
<?php
//クラス定義ファイル(myclass.php)
private $name;
public function __construct($name){$this->name = $name;}
public function getName(){return $this->name;}
public function setName($name){$this->name = $name;}
?>
<?php
//データが定義されたファイル(data.php)
require_once("myclass.php");
$person = new MyClass("tanaka");
$person2 = new MyClass("suzuki");
?>
<?php
//mainのphpファイル
require_once("data.php");
?>
<from method="post" action="confirm.php">
<input type="text" value="0" name="<?php $person->getName()?>">
<input type="submit" value="送信">
</from>
フォームで送信した値を受け取るconfirm.php
<?php
//confirm.php
require_once("data.php");
$personname = $_POST[$preson->getName()];
<p>名前は <?php echo $personname?> です</p>
?>
こんな使い方は普通しないかもしれないが、name属性の値にphpを埋め込んだりできるようです。
メソッド呼び出し
同じクラスのメソッドをメソッドの中で呼び出したいときはthisキーワードを使用する
<?php
//メソッド定義の例
public function getTotalPrice(){
return $this->getTaxIncludedPrice() * $this->getOrderCount();
}
?>
Progate PHPコース2まとめ
ProgateのPHPコース2はオブジェクト指向を中心に学んでいく。このコース2は途中から有料会員じゃないとできなくなっているので、やりたい人は980円をはらって有料会員になる必要がある。
オブジェクト指向は複数のファイルをつかったりするので結構難しい。Progateは内容が指示されているので結構簡単だが、これをいちから自分で作るとなると相当難しい気がする。
重要なのは以下のものだろうか・・・
- プロパティとメソッド、コンストラクター
- 外部のphpを読みこむrequire_once
- クラス自身をあらわすthisキーワード
- phpの構文をわかりやすくする endキーワード
- クラス外部から値を変更するprivate修飾子
- ゲッターとセッター
- $_POST[]で値をうけとる
コメント