20210418のPHPに関する記事は9件です。

【初心者】PHP abstract宣言

はじめに オブジェクト指向プログラミングを学習している中で、abstract宣言について学んだため備忘録。 抽象クラス(abstract) 抽象クラスの中でabstract宣言されたメソッドは、継承された子クラス内で必ずそのメソッドを使わなければならない。 クラスで使うときは普通の継承のようにextendsを使う。 抽象クラスはクラスではあるが、直接インスタンスを生成することができないため、クラスの継承をして使う。 コードを書いてみる。 categoryAbstract.php abstract class CategoryAbstract { public function echoAnimal() { echo '動物です'; } abstract function echoPlant(); } //CategoryAbstractを継承 class Category extends CategoryAbstract{ public function echoAnimal() { echo '動物です'; } public function echoPlant() { echo '植物です'; } } $category = new Category(); $category->echoAnimal(); //動物です $category->echoPlant(); //植物です $categoryAbstract = new CategoryAbstract(); $categoryAbstract->echoAnimal(); //抽象クラスはインスタンス化できないためエラー この例だとCategoryクラスはCategoryAbstractというクラス(抽象クラス)を継承している。 書き方の基本ルール ①抽象クラスのabstractと宣言されているメソッド内に処理を書くことはできない。 下記のように親クラスであるabstract宣言されたメソッド内に処理を書くとエラーとなる。 abstract class CategoryAbstract { public function echoAnimal() { echo '動物です'; } abstract function echoPlant() { echo '植物です'; //処理を書いているためエラー } ②抽象クラスを継承した子クラスでは、親クラスでabstract宣言されたメソッドは必ず使われなければならない。 下記のように子クラスのメソッドをコメントアウトするとエラーとなる。 class Category extends CategoryAbstract{ public function echoAnimal() { echo '動物です'; } //public function echoPlant() { // echo '植物です'; //親クラスでabstract宣言されているため、子クラスで書かれていないとエラー //} }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【初学者】PHP static修飾子

はじめに PHPのオブジェクト思考について学習している際に、static修飾子の挙動がわかりづらかったので調べました。(自分メモ) アクセス修飾子 アクセス修飾子としてよく使われるものは3つ。 public・・・どこからでもアクセス可能 private・・・同じクラス内からアクセス可能 protected・・・クラス内とクラスを継承した子クラスからアクセス可能 static修飾子とは ・あるクラスの全てのオブジェクトが一つの変数を共有したい時にグローバル変数を使わずに共有可能。 ・クラスのインスタンスを生成することなく(つまりnewせずに)、staticで定義されたプロパティやメソッドを利用できる。 animal.php //動物クラスを定義 class Animal { public $name; public static $category = "動物"; } $cat = new Animal(); $cat->name = "ネコさん"; $dog = new Animal(); $dog->name = "イヌさん"; echo $cat->name; //ネコさん echo $cat::$category; //動物① echo $dog->name; //イヌさん echo $dog::$category; //動物② //newしなくても使える echo Animal::$category; //動物③ 上記の動物①や動物②はインスタンスとして静的プロパティを用いているが、動物③はインスタンスを生成せずにプロパティを用いることができている。このようにオブジェクトのインスタンスを生成せずに呼び出すことができる。 このため、擬似変数$thisは、staticとして宣言されたメソッドの中から呼び出すことはできない。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【初心者】PHP static修飾子

はじめに PHPのオブジェクト思考について学習している際に、static修飾子の挙動がわかりづらかったので調べました。(自分メモ) アクセス修飾子 アクセス修飾子としてよく使われるものは3つ。 public・・・どこからでもアクセス可能 private・・・同じクラス内からアクセス可能 protected・・・クラス内とクラスを継承した子クラスからアクセス可能 static修飾子とは ・あるクラスの全てのオブジェクトが一つの変数を共有したい時にグローバル変数を使わずに共有可能。 ・クラスのインスタンスを生成することなく(つまりnewせずに)、staticで定義されたプロパティやメソッドを利用できる。 animal.php //動物クラスを定義 class Animal { public $name; public static $category = "動物"; } $cat = new Animal(); $cat->name = "ネコさん"; $dog = new Animal(); $dog->name = "イヌさん"; echo $cat->name; //ネコさん echo $cat::$category; //動物① echo $dog->name; //イヌさん echo $dog::$category; //動物② //newしなくても使える echo Animal::$category; //動物③ 上記の動物①や動物②はインスタンスとして静的プロパティを用いているが、動物③はインスタンスを生成せずにプロパティを用いることができている。このようにオブジェクトのインスタンスを生成せずに呼び出すことができる。 このため、擬似変数$thisは、staticとして宣言されたメソッドの中から呼び出すことはできない。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】アクセサを使う

はじめに 例えば、ユーザーの投稿数を取得したい時がある。 その場合、Laravelのアクセサを使えば、テーブルのカラムのように簡単に取得することができる。 アクセサを使う 先程の例でいくと、アクセサを使わない場合はこんな感じで記述する。 view {{ $user->posts()->count() }} このままだと少し冗長でわかりにくいので、アクセサを使い、シンプルにする。 アクセサを使うときは、モデルにget~Attributeというメソッドを作成する。 User.php namespace App\Models; use Illuminate\Database\Eloquent\Model; class User extends Model { // 省略 /** * 記事の投稿数を取得 * * @return integer */ public function getCountPostsAttribute() { return this->posts->count(); } } このアクセサをControllerやviewで呼び出す場合は、getとAttributeを取り除いたスネークケースで記述する。 view {{ $user->count_posts }} モデルのプロパティ(テーブルのカラム)のように使えるので、シンプルでわかりやすい。 おまけ JSONレスポンスの場合は、$appendsを定義する必要がある。 /** * モデルの配列形態に追加するアクセサ * * @var array */ protected $appends = ['count_posts']; // 追加 /** * 記事の投稿数を取得 * * @return integer */ public function getCountPostsAttribute() { return this->posts->count(); } 参考 https://readouble.com/laravel/7.x/ja/eloquent-mutators.html https://qiita.com/shonansurvivors/items/cd7ee1c038f9543eab8f
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

演算子 PHP

演算子の学習用メモ 演算子とは 演算子とは、ひとつ以上の値 (または「式」) から別の値 (や「式」) を生み出すものです。 https://www.php.net/manual/ja/language.operators.php 2 + 5 ; 1++ ; $num = 14 ; 20 < 25 ; '私の名前は' . ' 鈴木太郎' ; これらの+=<.は全て1つ以上の値を操活用し別の値を生み出すと言う点においてそれぞれ+は代数演算子、=は代入演算子、<は比較演算子、.は結合演算子と呼ばれ、演算子という同じくくりになります。 また、++のように1つの値を活用する演算子を単項演算、 2 + 5のように2つの値を活用する演算子を二項演算と呼びます。 代数演算子 基本的には学校で習った感覚で記述できます。 echo 3 + 7; //10 演算子の優先順位 代数演算子は二項演算に部類されます。つまり以下のような式でも実際には1+2を計算し、その結果に+3のように左から評価されています。 echo 1 + 2 + 3; // 実際は (1 + 2) + 3 //6 詳しくはリファレンス参照 https://www.php.net/manual/ja/language.operators.precedence.php 代入演算子 左オペランドに右オペランドの式の値を設定する("得て代入する") ことを意味します。 echo $num = 7 ; //7 「$num = 7」の演算後、$num変数から7を取得しなくても、「$num = 7」の演算結果として7という値は取得できる // 変数から取得もできるが、、 $num = 7; echo $num . "<br>"; // 演算結果で7が取得できるのでそのまま値として扱えます。 echo $num = 7 . "<br>"; 実行結果の値は7で同じです。 冒頭で演算子とは1つ以上の値を活用して別の値を生み出すと記述しましたが、変数から取得しなくても「$num = 7」という式そのものの演算結果として7が取得できています。 サンプル $a = ($num = 7) + 3 ; echo $a ; //10 複合演算子 代入演算子は、同じ演算子というカテゴリに属する、代数演算子や結合演算子と組み合わせて使うことができます。これを「複合演算子」と呼びます。 //【A】 $int = 10; $int += 5; //① + (代数演算子) ② = (代入演算子) の順番で実行 echo $int . "<br>"; //15 //【B】 $string = 'おこさま'; $string .= 'メニュー'; //① . (結合演算子) ② = (代入演算子) の順番で実行 echo $string . "<br>" //おこさまメニュー 【A】の場合 \$int = \$int + 5; (【B】の場合 \$string = \$string + 'メニュー';)でも最終的に変数に代入される値は同じですが、 +や+や.が○○演算子という同類であることを意識していると複合演算子での記述が理解しやすくなります。 続き https://www.php.net/manual/ja/language.operators.comparison.php https://www.php.net/manual/ja/language.operators.increment.php https://www.php.net/manual/ja/language.operators.logical.php https://www.php.net/manual/ja/language.operators.string.php https://www.php.net/manual/ja/language.operators.array.php
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

for文,if文,論理演算子 の組み合わせの計算

今回、for文,if文,論理演算子 の組み合わせの計算で悩み特に計算は分かるけど論理演算子が組み合わさると途端に手の動きが遅くなったのでメモします。 実際動かして、試したり数値を変えたりすることの大切さがわかりました。頭の中で考えて分からない場合、動かしてみるものありかもしれません。 簡易的なコードを作成いたしました! 例題1 ポイント 両方の倍数で0になるもの全部出力 for ($x = 1; $x <= 30; $x++) { if ($x % 3 === 0 || $x % 5 === 0) { echo $x . PHP_EOL; } } //3の倍数と5の倍数が0の時true。つまり両方の倍数で0になるもの全部出力 //出力結果 // 3 // 5 // 6 // 9 // 10 // 12 // 15 // 18 // 20 // 21 // 24 // 25 // 27 // 30 例題2 ポイント ここでは3でも割れて5でも割れる数を出力。 for ($i = 1; $i <= 30; $i++) { if ($i % 3 === 0 && $i % 5 === 0) { echo $i . PHP_EOL; } } //3の倍数かつ5の倍数が0の時true.ここでは3でも割れて5でも割れる数を出力。 //出力結果 //15 //30 お気づきのことがありましたらコメントください!! おすすめの問題集など! 参考 論理演算子 ushiroyubi1's blog
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

jqueryの$.postを使用して非同期通信を行う(フレームワーク:codeigniter)

ページ遷移をせずにテキスト内の数字を足し算して計算結果を表示させます htmlの部分 messages_test.php <p>$.postで足し算の結果を表示させる</p> <p>計算</p> <input type="text" name="textname1" id="textname1" size="20"> <p>+</p> <input type="text" name="textname2" id="textname2" size="20" > <button id="btn-a" type="button">計算</button> //以下のコードに計算結果を表示させます <p id="sum"></p> ・ テキストを2つ用意させ、それぞれにidを付けます。 ・buttonのtypeは今回非同期通信の為、submitではなくbuttonを使用。(submitだと画面遷移してしまう為) <p id="sum"></p>のコードが計算結果を表示させるコードです。idを付けてあげると分かりやすいです。 jqueryの部分 messages_test.php //$.postで足し算の結果を表示させる。 $(function sum(){ $("#btn-a").click(function() { $.post("/messages/test1",{textname1:$("#textname1").val(),textname2:$("#textname2").val()},function(data){ $("#sum").html(data); }); }); }); ・ jqueryのpostの基本文法は「$.post(送信先URL,{送信データ},function(data){                //何らかの処理 }); ・"/messages/test1"   が送信先URL。  {textname1:$("#textname1").val(),textname2:$("#textname2").val()}が送信データとなります。 ・$("#sum").html(data); はhtml部分に記述した<p id="sum"></p>に計算結果を表示させる処理を行います。 controllerの部分 controllers/messages.php function test1(){ $textname1 = $this->input->post("textname1"); $textname2 = $this->input->post("textname2"); $data = $textname1 + $textname2; print $data; } ・controllersには受け取った値を足し算して合計値を表示させる処理を行います。 ・$this->input->post("textname1");、$this->input->post("textname2");にはテキストに入力した値が入っており、その値を変数に代入しております。 ・変数に代入した値を足し算して変数($data)に入れ、printで表示させております。 画像 ・画像の通り、4+5と記述して、「計算」ボタンを押すと合計値の「9」が表示されます。 以上が基本的なjqueryの$.postで非同期通信を行う方法です。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

平日または休日に自働でズレて通知されるリマインダー、ホリデーリマインダー

ホリデーリマインダーは、リマインダーの繰り返し設定で、通知日が土日祝日になった時だけ前営業日(もしくは翌営業日)の平日に自働でズレてリマインダーメールが送られるというサービスです。 また、その逆の、設定日が土日祝日になった時だけ通知するということもできます。具体的には下記のようなシーンでライフハックを発揮します。 ・毎月の25日にATMからお金を引き出しているのに、今月の25日は土曜だったせいで手数料がかかってしまった。←ホリデーリマインダーで前日の金曜日に通知できる。 ・毎週火曜日がゴミの日で火曜にリマインドをセットしてるのに、たまたま今週は火曜が祝日だったから収集日は前日だった←ホリデーリマインダーで前日の月曜日に通知できる。 ・いつも通り電車に乗ろうとして駅のホームで待ってたら、祝日ダイヤだった←ホリデーリマインダーで祝日の通知ができる。 ・最終営業日から数えて10営業日前といった繰り返し処理がしたい←ホリデーリマインダーを使えば可能。 曜日感覚がいつのまにか無くなり、気がつくと休日や祝日を忘れてしまって、ついいつも通りの日課をこなしてしまうという事はよくあります。そんな凡ミスを防ぐために是非ホリデーリマインダーをお役立て下さい! ホリデーリマインダーは2016年に制作したwebサービスです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【PHP】ページネーション

PHPでページネーションを実装しました。 配列でデータを管理して、クリックされたボタンによって表示を条件分岐する処理になっています。 全体像 はじめに、実装する際の大まかな処理の流れについて説明していきます。 このように7つ投稿データをもっている配列、$postsがあるとします。 こちらを3投稿ずつに分けてページネーション機能で表示したいときに、 上記のように配列$blockに、3投稿ずつ入れます。 配列$blockの引数を変数にして、クリックされたボタンによって変数に値を渡します。 では、実際に実装していきます。 ブロックごとにデータを配分する 先ほど説明した、配列$blockをつくります。 まずは、ページネーションでデータを表示させる一覧画面から確認していきます。 post_list.php <?php $block=pagination_block($posts); global $i; if(empty($_POST['block'])){ $_SESSION[$i]=0; } if(isset($_POST['block'])){ switch($_POST['block']){ case '«': $_SESSION[$i]--; break; case '»': $_SESSION[$i]++; break; default: $_SESSION[$i] = $_POST['block']-1; break; } } if(isset($block[0])): foreach($block[$_SESSION[$i]] as $post): ?> <div class="post">  <p><?= $post['text'] ?></p> <img src="/post/image/<?= $post['image'] ?>"> </div> <?php endforeach ?> <?php endif?> foreach関数で$blockのデータを順に表示しています。 $_POST['block']で$_SESSION[$i]の値を更新しているのですが、こちらは後ほど説明します。 $postsには、下記のような投稿データが7つ入っています。 $posts Array ( [0] => Array ( [id] => 7 [text] => 投稿01 [image] => [user_id] => 38 [created_at] => 2021-04-17 10:20:46 : : [6] => Array ( [id] => 1 [text] => 投稿07 [image] => [user_id] => 38 [created_at] => 2021-04-17 10:20:22 ) ) それでは、最初に定義されているpagination_block関数から見ていきます。 function pagination_block($data){ global $block; $data_count=count($data); $block_count=ceil($data_count/3); $k=0; for($i=0;$i<$block_count;$i++){ for($j=0;$j<3;$j++){ if($data_count==$k){ break; } $block[$i][$j]=$data[$k]; $k++; } } return $block; } $data_countで投稿数を取得し、$block_countでは$blockの要素数を取得しています。 for文でデータを1つずつ$blockに渡していき、値を渡す回数$kが$data_countと同じ値になったときにbreakするような処理になっています。 ちなみに$jはページネーション機能で表示するデータ数を決めており、今回は3投稿ずつ表示するようにしています。 これで、$blockに3投稿ずつデータを渡すことができました。 それではページネーションを実現するためのボタンを作成していきます。 ページネーションのボタン作成 pagination.php <?php if(isset($block[1])): $block_count=count($block); ?> <form method="post" action="#"> <nav aria-label="Page navigation"> <ul class="pagination justify-content-center pagination-lg"> <li class="page-item"> <?php if($_SESSION[$i]==0):?> <input class="page-link first" name="block" type="submit" value="&laquo;" disabled> <?php else:?> <input class="page-link" name="block" type="submit" value="&laquo;"> <?php endif;?> </li> <?php for($l=1;$l<$block_count+1;$l++){ print'<li class="page-item"><input class="page-link" name="block" type="submit" value="'.$l.'"></li>'; }?> <li class="page-item"> <li class="page-item"> <?php if($_SESSION[$i]==$block_count-1):?> <input class="page-link last" name="block" type="submit" value="&raquo;" disabled> <?php else:?> <input class="page-link" name="block" type="submit" value="&raquo;"> <?php endif;?> </li> </li> </ul> </nav> </form> <?php endif; ?> レイアウトはBootstrap4を使用しています。 pagination.php if(isset($block[1])): : <?php endif; ?> $block[0]しかデータがない場合は、ボタンを表示しないようにしており、 pagination.php : <?php for($l=1;$l<$block_count+1;$l++){ print'<li class="page-item"><input class="page-link" name="block" type="submit" value="'.$l.'"></li>'; }?> : こちらで$blockの要素数だけボタンを表示するようにし、value="'.$l.'"でボタンに表示する値を指定しています。 pagination.php : <?php if($_SESSION[$i]==0):?> <input class="page-link first" name="block" type="submit" value="&laquo;" disabled> <?php else:?> : <?php if($_SESSION[$i]==$block_count-1):?> <input class="page-link last" name="block" type="submit" value="&raquo;" disabled> <?php else:?> : $blockの引数が0のときは、<<(次ページ)ボタンを無効にし、引数が$blockの要素数より1少ない場合は>>(前ページ)ボタンを無効にしています。 これらのボタンがクリックされたときに、$_SESSION[$i]の値が変わるような処理を$_POST['block']で実装します。 先ほどのpost_list.phpのページに戻りまして、 post_list.php if(isset($_POST['block'])){ switch($_POST['block']){ case '«': $_SESSION[$i]--; break; case '»': $_SESSION[$i]++; break; default: $_SESSION[$i] = $_POST['block']-1; break; } } クリックされたボタンによって、下記表のように$_SESSION[$i]の値が更新されるようになっています。 $_POST['block'] $_SESSION[$i] <<(次ページ) インクリメント >>(前ページ) デクリメント ページ指定ボタン ボタンの値 - 1 これでクリックされたボタンによって$_POST['block']の引数が更新されるようになり、表示されるデータが変更されるようになりました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む