質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.64%

phpが解読できない箇所があります

解決済

回答 5

投稿

  • 評価
  • クリップ 1
  • VIEW 452

banianizm

score 89

phpでカレンダー作成しています。
完成したのですが、ソースコードで解読できない箇所があります。
恐縮ですが解説か参考サイト教えていただければと思います。

<html>
<head>
</head>
<body>
<center>
  <table border="1">
<?php
  // 年月を取得する。グローバル変数。
  $y = $_REQUEST['y'] ?? date("Y");
  $m = $_REQUEST['m'] ?? date("m");

  // 1日の曜日を取得。mktimeは時・分・秒・月・日・年の順に表記
  $wd1 = date("w", mktime(0, 0, 0, $m, 1, $y));

  // 年とりあえず同じ年
  $prevY = $nextY = $y;

  // 一ヶ月前。1より小さければ12にして1年下げる。
  $prevM = $m - 1;
  if($prevM < 1) {
    $prevM = 12;
    $prevY--;
  }
  // 一ヶ月後。12より大きければ1にして1年上げる。
  $nextM = $m + 1;
  if($nextM > 12) {
    $nextM = 1;
    $nextY++;
  }


  $next = $m < 12 ? $m + 1 : 1;

//EOMはechoを非表示にする  
  print <<< EOM
    {$y}年{$m}月のカレンダー
    <a href="?y={$prevY}&m={$prevM}" />&laquo;</a>
    <a href="?y={$nextY}&m={$nextM}" />&raquo;</a>
EOM;
?>
    <tr>
      <th>日</th>
      <th>月</th>
      <th>火</th>
      <th>水</th>
      <th>木</th>
      <th>金</th>
      <th>土</th>
    </tr>
    <tr>
<?php

  // その数だけ空白を表示
  for ($i = 1; $i <= $wd1; $i++) {
    echo "<td> </td>";
  }

  $d = 1;
  while (checkdate($m, $d, $y)) {
    echo "<td>$d</td>";

    // 今日が土曜日の場合は…
    if (date("w", mktime(0, 0, 0, $m, $d, $y)) == 6) {
      // 週を終了
      echo "</tr>";

      // 次の週がある場合は新たな行を準備
      if (checkdate($m, $d + 1, $y)) {
        echo "<tr>";
      }
    }

    $d++;
  }

  // 最後の週の土曜日まで移動
  $wdx = date("w", mktime(0, 0, 0, $m + 1, 0, $y));
  for ($i = 1; $i < 7 - $wdx; $i++) {
    echo "<td> </td>";
  }
?>
    </tr>
  </table>
</center>
</body>
</html>

①上のほうにある 

// 年月を取得する。グローバル変数。
$y = $_REQUEST['y'] ?? date("Y");
$m = $_REQUEST['m'] ?? date("m");

グローバル変数REQUESTまでは理解できるのですがそのあとの ?? date("Y")が読み解けません。お恥ずかしい話ですがこのような書き方を初めてみました。

②上のほうにある

$next = $m < 12 ? $m + 1 : 1;

やはりこの書き方を知りませんでした。

以上2点になります。

解説は大変だと思いますので参考サイトなどでもいただければありがたいです」。
よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2018/09/19 11:52

    タイトルには要件を書いて下さい。 https://teratail.com/help/question-tips#questionTips3-1 タイトルから質問内容が想像できないもの、タイトルと質問内容が食い違っているものはスムーズな回答を得られなくなります。

    キャンセル

  • m.ts10806

    2018/09/19 11:53

    ご自身で書かれたのに「解読できない」というところに矛盾を感じます。どこからどうやって引っ張ってきたコードなのでしょうか。(自分が書いたコードの解説をさせるのはちょっとどうかと思いますので、それなりの理由を書く必要があると思います)

    キャンセル

  • m.ts10806

    2018/09/19 11:55

    ひとまずキーワードのみで回答しますのであとは調べて理解してみてください。

    キャンセル

回答 5

+9

??は、PHP 7で加わったnull合体演算子です。??の前が未定義やNULLでなければ前半を、未定義やNULLなら??の後を返します(リファレンス)。

?:は2つで1セットとなる三項演算子で、条件 ? TRUEのときの値 : FALSEのときの値、というように使います(リファレンス)。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+3

①は「null合体演算子」というものです。
A ?? Bを例に取ると、AがnullもしくはundefinedのときにBを使うというものです。
AがnullでもundefinedでもなければAが使われます。

②は「三項演算子」です。
条件A ? B : Cを例に取ると、条件Aが真のときBを使い、条件Aが偽のときはCを使うというものです。 

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+3

「三項演算子」で調べてみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

???:ともに三項演算子の式となります。
??についてはPHP7から使えるようになりました。

詳しくは下記URLを参照してください。
https://qiita.com/hnw/items/dff62cd02c780b613d03

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

三項演算子とNull合体演算子です。
解説はこちらをどうぞ。

→ PHP マニュアル

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.64%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る