Progate PHP コース3を学ぶ【オブジェクト指向をより深く】

プログラミング学習サービス「Progate」のPHPコース3

Progate php3

Progateのコースは最初のほうは無料で学べるものがあるけど、コース2あたりの途中から有料になってしまうので、やりたい人は980円を払わないといけない。とりあえず学んだことを備忘録的にかいているだけだけど、これを読んだ人が「Progateで学ぶ内容ってこんなもんか。」ってなるかもしれないし、それはそれでいいかもしれない

今回はPHPコース3だがコース2ではオブジェクト指向の基礎。クラスとかプロパティのアクセスとかカプセル化とかあまり面白くないやつだったけどやりがいはあると思う。スライドがでてわかりやすいし。

それではここから先は備忘録的に書いていこうと思います。

PHPのクラスプロパティ・クラスメソッド

クラスプロパティはインスタンス化しなくても使えるメンバーのこと。静的プロパティとかクラスプロパティとかいわれたりしている。静的なやつを宣言するときはstaticキーワードをつける。

phpの場合は静的メソッドや静的プロパティを呼び出すときに ::コロンを二回連続で使用するきまりがあるので注意。

クラスプロパティ

<?php
MyClass(){
public static $person = "田中";
}

echo MyClass::$person//田中
?>

クラスメソッド

静的プロパティも外部からクラス外部からアクセスされたくないのでprivateにすることがあるらしい。そういうときはまたゲッターを使うのだけど、ゲッターを定義するときにself::というキーワードが使えるselfはクラス自身を表している。

<?php
MyClass(){
private static $person = "田中";
public static function(){
return self::$person;
}
}

echo MyClass::$person;
?>

こんなちっちゃいプログラムでいちいちゲッターを定義したいりすることはないと思うけど、プログラムが大きくなってきたらきっとつかうんだろうなという感じです。

クラスの継承

継承はメンバーを引き継げる。メンバーとは今までに見てきたメソッドとかプロパティのこと。新たに生みだすので子クラス、継承元は親クラス。
PHPの継承は extendsキーワードを使用する。

<?php
class MyClass{
praivate $name = "tanaka";
public getName(){
return $this->name;
}
public setName($name){
$this->name = $name;
}
}

class MyClass2 extends MyClass{
private $clothes;
public getClothes(){
return $this->clothes;
}
public setClothes($clothes){
$this->clothes = $clothes;
}
}

$person = new MyClass2();
$person->setClothes("私服");

echo $person->getName()."さんの今日の洋服は".$person->getClothes()."です";
?>

間違えている部分はあるかもしれないけど、継承したクラスをインスタンス化して親のメソッドが呼び出せればいいのでしょう。

instanceof

継承したクラスのインスタンスが複数あって、いろいろまとめて処理したいときに不都合がでてくるときがあるみたいですね。そのときにどのクラスのインスタンスであるかを判断して、特定のクラスのインスタンスのときだけ処理させるというようなことが可能なようですね。

かなりぬけているところがありますがこんな感じでつかうみたいでですね↓

<?php if($menu instanceof Drink):?>
<p class="menu-item-type"><?php echo $menu->getType() ?></p>
<?php endif?>

オーバーライド

オーバーライドは親クラスのメソッドを子クラスで書き換える。

たとえばコンストラクターをオーバーライドすると

<?php
class MyClass{
protected $name = "tanaka";
public function __construct($name){
$this->name = $name;
}
public function getName(){return $this->name;}
}

class MyClass2 extends MyClass{
private $age = 30;
public function __construct($name, $age){
$this->name = $name;
$this->age = $age;
}
public function getAge(){return $this->age;}
}

$person = new MyClass2("suzuki", 50);
echo $person->getName()."さんの年齢は".$person.getAge()."です";
?>

protected修飾子

さきほどおオーバーライドの例で$nameの宣言をprivateにしているとアクセスできない。private修飾子は外部クラスからだけでなく子クラスからのアクセスもできなくなるので、子クラスで親クラスのメンバーを使いたいときにprotectedにしておくとよいみたい。

parentキーワード

見出しのオーバーライドのところでコンストラクターをオーバーライドしているが$this->name = $name;の部分はかぶっている。プロパティが少ないときはいいかもしれないが、これがおそらくもっと多く記述しなければならいときのため親クラスのコンストラクターを呼び出して。コードを省略できる。↓の構文だとあまり恩恵はないけどひとつのやり方として。

parent:: キーワードを使用することで親のメソッドとかコンストラクターが呼び出せたりする
parent::getName();
parent::__construct();

<?php
class MyClass{
protected $name = "tanaka";
public function __construct($name){
$this->name = $name;
}
public function getName(){return $this->name;}
}

class MyClass2 extends MyClass{
private $age = 30;
public function __construct($name, $age){
parent::__construct($name);
$this->age = $age;
}
public function getAge(){return $this->age;}
}

$person = new MyClass2("suzuki", 50);
echo $person->getName()."さんの年齢は".$person.getAge()."です";
?>

endキーワード if elseの場合

ifelseの条件分岐で : コロンを使うがifだけでなくelseの部分にもコロンが必要

以下はかなり情報がぬけているが簡単な例だと↓のような感じ

<?php if ($menu instanceof Drink): ?>
<p class="menu-item-type"><?php echo $menu->getType() ?></p>
<?php else:?>
<p>辛さ:<?php echo $menu->getSpiciness();?></p>
<?php endif ?>

for文にメソッドを用いる例

数を取得するメソッドなどをfor文に用いることができるようです

<?php for($i = 0; $i < $menu->getSpiciness(); $i++):?>
<img src="https://s3-ap-northeast-1.amazonaws.com/progate/shared/images/lesson/php/chilli.png" class="icon-spiciness">
<?php endfor?>

Progate PHPコース3まとめ

ProgateのPHPコース3は途中から有料になってしまうけど、ここでやる内容は3000円とかで売られている本に書かれている内容と同じような内容です。

でもスライド表示があるのと、ちょっとだけ自分で動かすことができるので結構やりやすい。

次の記事はProgateでPHPを学んでみた【コース4】 | 初心者のプログラミング