PHP復習まとめ

はじめに

PHPを仕事で使うので復習しました。

参考にProgateを使いました。4章はHTMLへの応用でPHPの知識的には3章から新しいものがなかったので割愛。

検証はPaizaにて!

基礎

Progate PHP Ⅰ

・PHPは<?php ?>で囲むことでHTMLに埋め込んで利用可能。※拡張子は.php

<?php  echo"<h2>初級</h2>"; ?>

・セミコロンを必ず書く。※JSやRubyとは違う点

<?php
  // コメント
  echo "こんにちは";

  $name = "Sato";
  echo $name."です"; // Satoです 文字列は.で連結

  $name .= "!!";
  echo $name; // Sato!! .=で文字列連結を簡略化

  echo "はじめまして、{$name}です"; // はじめまして、Sato!!です 
  // 👆変数展開、シングルクォーテーションだと展開しないので注意

  $num = 3;
  echo $num++; // 3 出力後に+1する
  echo --$num; // 4 出力前に+1する

?>

🙄変数定義が$で統一。Rubyに似てますね!JSのようにletなどの前置詞がない。地味に$の記述が手間

・条件分岐

<?php
  $x = 20;
  if ($x > 30) {
    echo '$xは30より大きい';
  } elseif($x >= 20) {
    echo '$xは30以下20以上です';// $xは30以下20以上です
  } else {
    echo '$xは10以下です';
  }
?>

※&&でかつ、||でまたは

・配列/連想配列

<?php
  $names = array("Sato", "Saito");
  echo $names[0]; // Sato
  $user = array(
    "name" => "Sato",
    "age" => 27
  );
  echo $user["age"]; // 27
?>

配列の作り方[]使わないんですね。独特だ。。。

・for文/while文 break仕様

<?php
  for($i = 1; $i <= 10; $i++) {
    echo $i;
  }
?> // 1~10まで出力

<?php
  $i = 1;
  while ($i <= 10) {
    if ($i > 5){
      break;
    }
    echo $i;
    $i++;
  }
?> // 1~5まで出力

continue trueの場合、現在のループをスキップ

<?php
  for($i = 1; $i <= 10; $i++) {
    if ($i % 3 == 0){
      continue;
    }
    echo $i;
  }
?> // 12457810

foreach文

<?php
  $names = array("Sato", "Saito", "Suzuki");
  foreach ($names as $name){
    echo $name." ";
  }
?> // Sato Saito Suzuki

<?php
  $user = array(
    "name" => "Sato",
    "age" => 27
  );
  foreach ($user as $key => $value){
    echo $key.":".$value." ";
  }
?> name:Sato age:27

関数

<?php
  echo strlen("Progate"); // 7 文字数出力
?>

<?php
  function multiple($num){
    echo $num * $num;
  }
  multiple(3); // 9
?>

<?php
  function sum($num1, $num2){
    return $num1 + $num2;
  }
  echo sum(1, 3); // 4
?>

オブジェクト指向 クラス

Progate2章

カプセル化でクラスの外部からアクセスできるようにするには「public」を、アクセスできないようにするには「private」を用いて定義します。
※「protected」は継承先のクラスでもアクセス可能。
プロパティは基本的にアクセス権をprivateに。それに伴いゲッター/セッターを定義する。

<?php
  class Product {
    private $name; // プロパティ
    private $orderCount = 0;
    public function __construct($name) {
      echo "{$name}が作成されました";//インスタンス生成時に自動で処理
      $this->name = $name;//インスタンス生成時にnameプロパティに値をセット
    }
    public function hello(){
      echo "これは".$this->name."です";
    }
    public function getName(){// ゲッターの定義
      return $this->name;//privateでもクラス内なのでアクセスできる
    }
    public function getOrderCount(){
      return $this->orderCount;
    }
    public function setOrderCount($orderCount){// セッターの定義
      $this->orderCount = $orderCount;
    }
  }
  $computer = new Product("Computer");
  // echo $computer->name;
  $computer->getName();
  $computer->setOrderCount(3);
  echo $computer->getOrderCount();//3
  $computer->hello(); // これはcomputerです
  $names = array("Sato","Saito","Suzuki")
?>

<!--HTMLの記述はPHPの記述と分ける-->
<!--foreachのHTML記述 {}の代わりに:endforeach-->
<?php $CD = new Product("CD") ?>
<form method="post" action="confirm.php">
  <!-- inputタグ内で個数を入力できる -->
  <input name="<?php echo $CD->getName() ?>">個
  <input type="submit" value="注文する">
</form>

<!--confirm.phpであると想定-->
<?php require_once("data.php") ?>
<!--送信された値を受け取り-->
<p><?php echo $_POST[$CD->getName()] ?></p>

<?php ?>

<?php foreach ($names as $name): ?>
  <p><?php echo $name ?></p>
<?php endforeach ?>

クラスプロパティや継承

Progate3章

クラスプロパティはクラスが持つデータ。「static」を用いて定義し、「クラス名::$クラスプロパティ名」でアクセス。
クラス内でクラスプロパティにアクセスするにはself変数を用い、「self::$クラスプロパティ名」で定義。
オーバーロードや継承についても以下記載。

<?php
  class Product {
    protected $name; // プロパティ protectedにすることで継承後のクラスでも呼び出せる
    protected static $count = 0; // クラスプロパティ インスタンス生成数
    private $orderCount = 0;//インスタンスごとに注文個数管理
    public function __construct($name) {
      self::$count++; // クラスプロパティにアクセスするにはself変数を用いる。
      echo "{$name}が作成されました";//インスタンス生成時に自動で処理
      $this->name = $name;//インスタンス生成時にnameプロパティに値をセット
    }
    public function hello(){
      echo "これは".$this->name."です";
    }
    public function getCount(){// ゲッターの定義
      return self::$count;//selfはクラス自身
    }
    public function getOrderCount(){
      return $this->name."の注文個数は".$this->orderCount."個";//$thisはインスタンス自身
    }
    public function setOrderCount($orderCount){// セッターの定義
      $this->orderCount = $orderCount;
    }
  }
  $computer = new Product("Computer");
  echo "注文".Product::getCount()."個"; // 注文1個
  $computer->setOrderCount(3);
  echo $computer->getOrderCount();//Computerの注文個数は3個
  
  class CD extends Product {
    private $price;
    public function __construct($name){
      parent::__construct($name);
      echo self::$count++."個";//2個
    }
    public function getPrice(){
      return $this->price;
    }
    public function setPrice($price){// セッターの定義
      $this->price = $price;
    }
  }
  $cd = new CD("世界に一つだけの花/SMAP");//世界に一つだけの花/SMAPが作成されました
  if($cd instanceof CD){//インスタンスが特定のインスタンスか判別
    $cd->setPrice(1000);
    echo $cd->getPrice()."円です";// 1000円です
  }
?>

HTMLとの併用

ダブルクォーテーションの中にechoで埋め込まないとHTMLに反映されないので注意。

index.html

<form action="sent.php" method="post">
  <p>名前</p>
  <input type="text" name="name">
  <p>内容</p>
  <textarea name="content"></textarea>
  <input type="submit" value="送信">
</form>

sent.php

echo $_POST["name"];
echo $_POST["email"];

$_POSTの中身は連想配列

array(
  "name" => "Sato",
  "content" => "PHP勉強中"
)

foreachはHTMLだと:endforeachが使える ※同じようにifにもendif、forにもendforがある。

<?php $names = array("Sato","Saito","Suzuki") ?>

<?php foreach ($names as $name): ?>
  <p><?php echo $name ?></p>
<?php endforeach ?>

他のファイルから読み込み require_onceで読み込んだファイルで定義されているクラスや変数の利用可能。

<?php require_once("menu.php") ?>

コメントを残す