ProgateでPHPを学んでみた【コース4】

ProgateのPHPコース4

Progate PHPコース4

ProgateのPHPコース4は途中から有料になると思います。あとPHPはコース4で最後になります。

やりたい人は980円はらってやる必要があります。

今回はPHPコース4を学びますがのPHPのコース3はオブジェクト指向にちょっと足を踏み入れた、オーバーライドとか継承とかを学ぶ内容でした。たぶんそのへんのPHPの書籍にもかかれてる内容だったかと思います。でも図のスライドとかがあってわかりやすいのでおすすめといえばおすすめですけど、やっぱり本もあったほうがいいような気もします。

それかもしくは今までの記事をみてもよいかもしれないです

とりあえず備忘録的に書いていこうと思います。

aタグのhref属性にphpを指定する

なんてことはないですが、aタグのhref属性の値にphpを指定できるようです。

<a href="show.php"><?php echo $menu->getName();?></a>

クエリ情報と$_GET[]

htmlのaタグのhref属性にクエリ情報をかいてやり送り先のphpがなにを表示すべきか決定する。送られたクエリ情報は$_GET[]で取得する

クエリ情報を渡す

クエリ情報を渡すaタグのサンプルコードは↓

<a href="show.php?name=<?php echo getName();?>"><?php echo $menu->getName();?></a>

クエリ情報は keyと値で構成されていて 例えば href=”show.php”?name=tanakaだったらnameがkeyでtanakaが値になるようです。ちょっと難しいのはクエリ情報が違うとリンク先のページが違うものになるし、クエリ情報を受け取る際の$_GET[]の値も違うものになります。あたりまえといえばあたりまえかもしれませんが、ここを理解しておこないと先に進めない気がしています。たとえば下記のコードは本当にかなりコードはぶいていますが、foreachを使ってクエリ情報を送る構文です。keyはnameで同じですが値はゲッターの$menu->getName()としていますから、それぞれ表示されるページも違うし、$_GET[“”]で受け取る値も違います。

<?php foreach ($menus as $menu): ?>
<a href="show.php?name=<?php echo $menu->getName() ?>">
<?php echo $menu->getName() ?>
</a>
<?php endfor ?>

クエリ情報を受け取る $_GET[]

クエリ情報は連想配列になっていて、$_GET[“name”] このようにい、うけっとたkeyを指定してやることによって値を取り出せるようです。これを変数にいれたりすることが可能のようです。クエリ情報を受け取るときも意識したいのは受け取るクエリごとに値も違うし表示されるページも変わってくるということですね。

<?php
//クエリ情報をうけとるページ(show.php)
$menuName = $_GET["name"];
echo $menuName;
?>

とにもかくにもaタグで指定されたクエリ情報が違う分それぞれ違うページが表示されるというのを意識する必要があると思います。またさきほども書いたとおりクエリ情報ごとに$_GET[“”]でうけとれる値も変わります。

プロパティの値からインスタンスを取得する

プロパティの値を比較してインスタンスを返すメソッドを作成する。一見なにをいっているかわからないのような感じですが、受け取ったクエリ情報(プロパティ)とプロパティの配列とを比較してインスタンスを返すというものです。

<?php
//メンバーを定義したファイル(myclass.php)
class MyClass{
private $name;
public function __construct($name){
$this->name = $name;
}
public function getName(){
return $this->name;
}
public static function findByName($menus, $name){
    foreach($persons as $person){
      if($person->getName() == $name){
        return $name;
      }
    }
  }
?>
<?php
//インスタンスを定義するファイル(data.php)
require_once("myclass.php");
$person1 = new MyClass("tanaka");
$person2 = new MyClass("suzuki");
$preson3 = new MyClass("hemaguti");
$person4 = new MyClass("higuti");
$persons = array($person1, $person2, $person3, $person4);
?>
<?php
//クエリ情報を送るファイル(index.php)
require_once('data.php');
require_once('menu.php');
?>
<?php foreach($persons as $person):>
<a href="show.php?name=<?php echo $person->getName()>"><?php echo $person->getName()></a>
<?php endforeach?>
<?php
//クエリ情報を受け取るphp(show.php)
require_once('data.php');
require_once('menu.php');

$personname = $_GET["name"];//クエリ情報をうけとる$_GET[""]
$showperson = findByName($persons, $personname);
?>

findByNameメソッドでプロパティ同士を比較して最終的にはプロパティではなくインスタンスを返す。というメソッドです。このメソッドも重要ですが、まずはクエリ情報を送る→受け取るの仕組みをしっかり理解したいところです。

$_GET[“”]でクエリ情報をうけとり、インスタンスだけ取り出すというのはよくやるらしい上の例では$showpersonがクエリ情報に一致したインスタンスとなる。そしてクエリ情報に一致したインスタンスを使って、ページを記述していったりするので、結構理解するのが難しい。

クエリ情報に一致したインスタンスの名前とレビューの名前を一致させる

↑見出しのタイトルにあまり意味はないのでサンプルコードだけ

<?php
public function getReviews($reviews){
    $reviewsForMenu = array();
    foreach($reviews as $review){
      if($review->getMenuName() == $this->name){
        $reviewsForMenu[] = $review;
      }
    }
    return $reviewsForMenu;
  }
?>

いろいろなレビュー情報があるときに、インスタンスの名前($this->name)に一致したものだけを選出して配列にしている。構文自体はとくに難しくないのだが先ほどのfindByName()メソッドのようにクエリ情報に一致したインスタンスを取得している$showpersonのような例で$showperson.getReviews($reviews)とするのだけど、$this->nameが一体どこからきたのかわからなくなるときがある。

先ほどの例だと$showpersonはインスタンスなわけだから、$thisは$showpersonを指していることになるのだけど、クエリとかメソッドとかがからんで混乱する可能性がある。とにかくこのクエリのやりとりはスムーズに理解できるようになるまで時間がかかりそうだ。


複数のクラス同士でプロパティを比較して一致していたらインスタンスを返すというやり方は結構な頻度で使うかもしれない。結構難しいけど、こんなかんじのがよくでてきます。

<?php
 // getUserメソッドを定義してください
  public function getUser($users){
    foreach($users as $user){
      if($user->getName() == $this->userName){
        return $user;
      }
    }
  }
?>

ユーザーの名前がかぶったときにIdで識別する

なにかのサービスでユーザーの名前がかぶったときにそれを識別する方法としてIdで管理するというものがあるようです。idのプロパティを追加して、インスタン生成時にidの値を増やしていくことで管理できるようです。カウンターは静的プロパティで宣言しコンストラクターでそれをidに代入

ほんの一例ですが↓のような感じになるようです。

<?php
class User {
  private $id;
  private $name;
  private $gender;
  private static $count = 0;
  
  public function __construct($name, $gender) {
    $this->name = $name;
    $this->gender = $gender;
    self::$count++;
    $this->id = self::$count;
  }
?>

プロパティがかぶってきたりするとIdで管理する方法があることをおぼえておくとよいのかもしれません。

Progate PHP コース4まとめ

PHPのコース4は難しかったですが、スライドありでなんとかいけました。実際に自分でコードを書いたりすることは少ないけどPHPとはこういうふうに動いているのかというのがすこしわかってきたのでよかったと思います。

コース4のまとめとしては以下のようなものでしょうか

  • クエリ情報の受けわたし$_GET[“”]
  • 他クラス同士のプロパティの比較
  • staticプロパティの使いどころ
  • userをidで管理する方法

ProgateのPHP学習は4で終わりになります。なにかもの足りないかんじもしますが、よかったとは思います。