- 投稿日:2019-01-27T23:47:47+09:00
PHPの定数を条件分岐で出力させる
※PHPの定数を条件分岐で出力させる – Ewig Leere(Lab2)と同一内容です。
例えば、下記のような定数を宣言していたとします。
<?php const PRE_HOGE = 'hogehoge'; const HOGE = 'piyopiyo';これを、フラグを基に
trueだったらPRE_HOGEを、falseだったらHOGEを出力させたい、という感じのことをやろうとしました。まず、愚直に考えると以下のようになるかと思います。
<?php $flag = ture; //or false $str = ''; if($flag) { $str = PRE_HOGE; } else { $str = HOGE; } echo $str;……長い。1つだけであればこれでもまあ良いか、と妥協するところですが、今回はこのパターンが5個くらい(しかも全て同じプレフィックス)続いたので、もうちょっと行数を削減できないかと工夫したくなりました。
そこで、最終的に下記のようにしました。
<?php $prefix = $flag ? 'PRE_' : ''; //三項演算子でtrueならば`PRE_`、falseならば空文字列を変数にセット echo constant($prefix.'HOGE'); //'HOGE'という文字列の前に上でセットしたプレフィックスを繋ぎ、その文字列で宣言された定数の値をconstantで返すすごくスッキリしました!
ちなみに変数の場合は下記のような感じになるようです。
<?php $prefix = $flag ? 'PRE_' : ''; //上と同じ echo ${($prefix.'HOGE')};うーん、後で忘れそうな気もしますが、すごくスッキリ書けるので採用。
参考
- 投稿日:2019-01-27T22:35:49+09:00
Vagrant+AnsibleでPHPのビルド環境を作る
「PHP のソースコードをデバッグしてみたら?」と悪魔の囁きが聞こえてきたので、まずはビルド環境作りから。
やること
- Vagrant + VirtualBox で VM(CentOS 7.6)を作る
- Ansible を使って必要なパッケージのインストールや設定を行う1
- PHP のソースコードを入手してビルドする
前提
この記事を書いた人のレベルは、以下のとおりです。
- 基本的な Linux コマンドの操作は知っている
- 設定ファイルを編集するのに
viを使います- Vagrant は仕事で少し触った程度
- Ansible は「なにそれ?おいしいの?」状態
- Git も仕事で少し触った程度
VM を作る
Ansibleをはじめる人に。 に書いてある手順と、ほぼ同じです。(分かりやすい記事に感謝です)
Vagrant と VirtualBox をインストールする
Vagrant と VirtualBox をインストールします。
ディレクトリを作る
VM 用のディレクトリを作ります。
mkdir -p ~/vagrant/centos76Vagrantfile を生成する
vagrant initで Vagrantfile を生成します。VM のもととなる BOX ファイルは
bento/centos-7.6(検索結果)を使います。vagrant init bento/centos-7.6 --box-version 201812.27.0Vagrantfile を編集する
今回は VM を2つ作ります。
controller
- Ansible を実行する VM
- IPアドレス:
192.168.33.10
target
- Ansible の実行対象で、PHP をビルドする VM
- IPアドレス:
192.168.33.20
~/vagrant/centos76の下に生成されたVagrantfileを以下のように書き換えます。~/vagrant/centos76/VagrantfileVagrant.configure("2") do |config| config.vm.define "controller" do |node| node.vm.box = "bento/centos-7.6" node.vm.box_version = "201812.27.0" node.vm.hostname = "controller" node.vm.network "private_network", ip: "192.168.33.10" node.vm.network "forwarded_port", id: "ssh", guest: 22, host: 2210 end config.vm.define "target" do |node| node.vm.box = "bento/centos-7.6" node.vm.box_version = "201812.27.0" node.vm.hostname = "target" node.vm.network "private_network", ip: "192.168.33.20" node.vm.network "forwarded_port", id: "ssh", guest: 22, host: 2220 end endVM を起動する
vagrant upで VM を起動します。
vagrant statusを実行して、controllerとtarget両方とも起動していれば問題ありません。$ vagrant status Current machine states: controller running (virtualbox) target running (virtualbox) This environment represents multiple VMs. The VMs are all listed above with their current state. For more information about a specific VM, run `vagrant status NAME`.Ansible を設定する
Ansible をインストールする
controllerに SSH でログインします。$ vagrant ssh controllerroot ユーザーに切り替えて、
yumで Ansible をインストールします。$ su Password: (vagrant) # yum install ansible
ansible --versionを実行すると、以下のように表示されます。# ansible --version ansible 2.4.2.0 config file = /etc/ansible/ansible.cfg configured module search path = [u'/home/vagrant/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python2.7/site-packages/ansible executable location = /usr/bin/ansible python version = 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]SSH 接続を設定する
controllerからさらにtargetへ SSH 接続できたほうが便利なので、いろいろ設定しておきます。まずは、SSH の公開鍵を作って、
targetに登録しておきます。# ssh-keygen -t rsa # ssh-copy-id root@192.168.33.20また、毎回 IP アドレスを入力するのは面倒なので、
/etc/hostsにtargetを追加して、名前解決できるようにしておきます。# vi /etc/hosts/etc/hosts127.0.0.1 controller controller 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.33.20 targetinventory ファイルを作る
Ansible 用のディレクトリを作ります。今回は以下のようなディレクトリ構成にします。
/ansible/ |- invengtory/ | |- hosts : 対象ホストを記述した設定ファイル | |- target/ |- test.yml : Playbook ファイルまずは
/ansible/inventory/hostsファイルを準備します。# mkdir -p /ansible/inventory # cd /ansible # vi inventory/hosts
targetsというグループのメンバーにtarget(192.168.33.20)を追加します。/ansible/inventory/hosts[targets] 192.168.33.20Playbook ファイルを作る
Ansible は、Playbook に理想的な状態を定義して対象ホストがそれを満たす状態を作る という考え方のツールです。なので、Playbook ファイルが一番重要になります。
# mkdir target # vi target/test.ymlPlaybook ファイルに設定する内容は後回しにして、先に Playbook ファイルを準備したあとの手順を書いておきます。
書いた Playbook ファイルは
ansible-playbookコマンドを使って、対象ホスト(今回はtarget)へ反映します。まずは、反映する前に、書いた Playbook ファイルが問題ないかを
--checkオプションを付けて確認します。# ansible-playbook --check -i inventory/hosts target/test.ymlエラーが出ないことを確認したら、以下のようにして反映します。
# ansible-playbook -i inventory/hosts target/test.yml対象ホストへSSH接続する
今は
controllerに SSH 接続している状態ですが、ここからさらにtargetへ SSH 接続します。Playbook を作る際は、その内容で問題ないかを確かめるために、頻繁に対象ホストへ接続することになります。
一旦、
controllerを抜けるよりも、controllerに入ったままtargetへ接続できたほうが便利ですね。図にすると、こんな感じです。
Mac -- (SSH) --> controller -- (SSH) --> target
/etc/hostsに設定しておいたので、実行するコマンドはとてもシンプルです。# ssh targetPHP をビルドする
前提
PHP をビルドするために必要なパッケージについては マニュアル に記載があるので、確認しておきましょう。
Playbook ファイルを作る
target/test.ymlに以下のように定義します。/ansible/target/test.yml- hosts: targets user: root tasks: - name: Set Timezone timezone: name: Asia/Tokyo - name: Install gcc yum: name=gcc - name: Install autoconf yum: name=autoconf - name: Install automake yum: name=automake - name: Install ctags yum: name=ctags - name: Install gdb yum: name=gdb - name: Install git yum: name=git - name: Install bison yum: name=bison - name: Install libxml2-devel yum: name=libxml2-devel - name: Install sqlite-devel yum: name=sqlite-devel - name: Install epel-release yum: name=epel-release - name: Install re2c yum: name=re2c - name: Reinstall glibc-common shell: yum -y reinstall glibc-common - name: Set Locale shell: localectl set-locale LANG=ja_JP.utf8Playbook ファイルを作ったあとは、
ansible-playbookでtargetに反映します。# ansible-playbook -i inventory/hosts target/test.ymlソースコードを入手する
PHP のソースコードは GitHub にあるので、
git cloneで入手します。# ssh target # git clone https://github.com/php/php-src.gitconfigure する
今回はデバッグ目的なので
--enable-debugオプションを付けて./configureを実行します。# cd php-src # ./buildconf # ./configure --enable-debugmake する
./configureが成功したら、makeを実行します。# make以下のように表示されたらビルド成功です。
Build complete. Don't forget to run 'make test'make test する
「
make testを実行するのを忘れないで!」と言われたので、make testもやっておきましょう。===================================================================== TEST RESULT SUMMARY --------------------------------------------------------------------- Exts skipped : 50 Exts tested : 26 --------------------------------------------------------------------- Number of tests : 16099 10784 Tests skipped : 5315 ( 33.0%) -------- Tests warned : 0 ( 0.0%) ( 0.0%) Tests failed : 1 ( 0.0%) ( 0.0%) Expected fail : 36 ( 0.2%) ( 0.3%) Tests passed : 10747 ( 66.8%) ( 99.7%) --------------------------------------------------------------------- Time taken : 602 seconds ===================================================================== ===================================================================== EXPECTED FAILED TEST SUMMARY --------------------------------------------------------------------- Test open_basedir configuration [tests/security/open_basedir_linkinfo.phpt] XFAIL REASON: BUG: open_basedir cannot delete symlink to prohibited file. See also bugs 48111 and 52176. (省略) ===================================================================== ===================================================================== FAILED TEST SUMMARY --------------------------------------------------------------------- Timeout again inside register_shutdown_function [tests/lang/045.phpt] ===================================================================== You may have found a problem in PHP. This report can be automatically sent to the PHP QA team at http://qa.php.net/reports and http://news.php.net/php.qa.reports This gives us a better understanding of PHP's behavior. If you don't want to send the report immediately you can choose option "s" to save it. You can then email it to qa-reports@lists.php.net later. Do you want to send this report now? [Yns]:なんか失敗したらしい
PHP を実行する
気を取り直して、
php-src/sapi/cliの中にphpコマンドが作成されているので実行してみましょう。# sapi/cli/php --versionPHP 7.4.0-dev (cli) (built: Jan 27 2019 11:14:55) ( NTS DEBUG ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.4.0-dev, Copyright (c) 1998-2018 Zend Technologiesとりあえず、ちゃんと動いているらしいです。
更新をローカルに取り込む
今回ビルドしたソースコードは開発版なので、頻繁に更新がされます。
まず、以下のコマンドで最新のソースコードを入手します。
# git fetch # git merge origin/masterあとは、
./configure --enable-debugから再度実行するだけです。躓きポイント
devel に要注意
./configureを実行した際に、libxml2やsqliteがインストールされていないと表示されました。しかし、
yumで確認するとインストール済みとなっています。いろいろ調べたところ、
libxml2-develとsqlite-develをインストールする必要がありました。re2cがyumにない
yum install re2cを実行しても存在しないと表示されました。PHP7をCentOS7にインストールする手順 によると、EPEL(Extra Packages for Enterprise Linux)をインストールすると、
yum install re2cが実行できるようになるとのことでした。ロケールが設定できない
これは PHP というよりは CentOS の問題ですが、
automakeを実行した際にロケール設定に失敗したと表示されます。日本語のロケールが入っていないことが原因らしく、
glibc-commonを再インストールしてからロケールを設定すると、うまくいきました。ただ、Playbook の yum モジュール には再インストールが見当たらなかったので、shell モジュール で行うようにしました。
(「冪等性」を考えると微妙な気もしますが、Ansible をまだよく理解できていないので、一旦、こうしておきます。)
まとめ
いろいろ苦戦しましたが、どうにか PHP のビルド環境を作ることができました。次は GDB を使ってデバッグしてみたいです。(GDB の使い方から勉強しないと・・・)
参考
Ansible
Vagrant
PHP のビルド
Ansible 使う必然性はないのですが、なんとなく使ってみたかったので。 ↩
- 投稿日:2019-01-27T22:30:10+09:00
MAMP+PHPStorm+Xdebugで画面操作からデバッグする方法
MAMP+PHPStormを利用していて、ブレークポイントを張っておき、画面操作からデバッグが開始できるようにする方法を紹介します。
PHPをやろうと思って使い始めたPHPStormですが、ブラウザの画面上から操作をトリガーにして、ブレークポイントで止める方法がわからず、調べるのに少し苦労しました。また何回も調べ直すのは面倒なので、備忘録的に書いておきます。
動作確認環境
・macOS Mojave(ver 10.14)
・MAMP ver 5.2
・PHP5.6.23
・PhpStorm 2018.3.3
・Google Chrome前提条件
MAMPを既にインストールされている方が対象です。
まだインストールされていない方はこちらを参照してください。
(https://pc-karuma.net/mamp-settings-mac/)PhpStormを既にインストールされている方が対象です。
まだインストールされていない方はこちらを参照してください。
(http://www.jetbrains.com/phpstorm/)PhpStormは日本語化されていることが前提です。
まだ日本語化をされていなくて、適用を検討の方はこちらを参照してください。
(https://pleiades.io/pages/pleiades_jetbrains_manual.html)PHP + MAMPの設定
PHPのバージョン確認
MAMPからphpinfoを選択すると、PHPのバージョンを確認することができます。
(図では、version 5.6.37)また「Loaded Configuration File」の項目で、今現在起動の際に読み込まれているphp.iniファイルの場所も確認することができます。
Xdebugの有効化
ここではphp.iniファイルを編集し、Xdebugを有効化するように変更します。
phpinfoで場所を確認したphp.iniを開いたら、「xdebug」で検索し、下記の一文を確認します。[xdebug] ;zend_extension="/Applications/MAMP/bin/php/php5.6.37/lib/php/extensions/no-debug-non-zts-20131226/まずは上記の文の先頭にあるコメントを外し、下記のような項目を加えます。
[xdebug] zend_extension="/Applications/MAMP/bin/php/php5.6.37/lib/php/extensions/no-debug-non-zts-20131226/ xdebug.remote_enable=on xdebug.remote_handler=dbgp xdebug.remote_mode=req xdebug.remote_host=localhost xdebug.remote_port=9000 xdebug.remote_autostart=1 xdebug.idekey=PHPSTORM xdebug.profiler_enable=1 xdebug.profiler_output_dir="/Applications/MAMP/tmp"上記の設定を追加したら、ファイルを保存してMAMPを再起動します。
Xdebugが有効化されているかを、phpinfoを使って確認しましょう。下図のような表示があれば、有効化は完了です。
PhpStormの設定
ここからはPhpStormでXdebugを利用するための設定を行っていきます。
PHPのバージョンとPHP実行ファイルの設定
まずはPHPのバージョンをご自身が利用しているPHPのバージョンで設定します。
1.PhpStormの「環境設定」から「言語&フレームワーク」>>「PHP」と進みます。
2.「PHP言語レベル」にphpinfoで確認したバージョンを入力します。
3.「CLIインタープリター」は右のボタンをクリックし、下図のように設定します。
サーバー設定
デバッグ用でサーバの設定を行います。
1.PhpStormの「環境設定」から「言語&フレームワーク」>>「PHP」>>「サーバー」と進みます
2.左上の「+」ボタンをクリックします。
3.名前は任意ですが、「localhost」の入力で問題ありません
4.ホストにはローカル環境でやるのであれば、「localhost」で入力します。
5.ポート「80」、デバッガー「Xdebug」を設定します。
6.「OK」ボタンをクリックします。Xdebug の受信ポート番号を確認
Xdebugで待ち受けをするポート番号を設定・確認します。
「環境設定」>>「言語&フレームワーク」>>「PHP」>>「デバッグ」をクリックします。
PhpStorm から Xdebug を利用する場合のポート番号を確認し xdebug.ini の remote_port と同じ値に設定します。既定は「9000」ですが、その設定のままで問題ないです。リモートデバッグ設定
1.メニューバーの「実行」>>「構成の編集」をクリックします。
2.左上の「+」ボタンをクリックし、「PHP Remote Debug」を選択します。
3.名前を「Xdebug」と入力します。
4.サーバーを「localhost」、ideキーは「PHPSTORM」と入力します。
5.「OK」ボタンをクリックします。デバッグ
ここからデバッグを動かすまでの手順を紹介していきます。
PhpStorm画面の右上にあるツールバーから、赤四角枠の部分を「Xdebug」に設定します。
次に赤丸枠の受話器のようなボタンを押します。ここを有効化することで、デバッガがトリガーの受信待ちとなり準備完了となります。
あとはブラウザ上で、デバッグしたいページのURLを指定します。
この時にURLの後ろに「?XDEBUG_SESSION_START=xdebug」を付与してください。
(本来はphp.iniでxdebug.remote_autostart=1を設定していれば、不要な操作なんですがキャッシュか何かの影響でパラメータを入力しないと動かないこともありますので念の為)これで事前に処理を止めたいところにブレークポイントを張ってデバッグを開始すると、初回は下図のような画面が表示されることがあります。
「受諾」ボタンをクリックしてください。
ここまでの操作で問題がなければ、ブレークポイントで処理が止まってくれるはずです。変数の中身などができるようになります。
参考記事
参考にさせてもらった記事です。
ここまでの手順を実施すれば、目的は達成できると思いますが、もし上手くいかない、他にも方法が知りたいなどがあればこちらも参照してください。
https://www.karakaram.com/phpstorm-xdebug
https://qiita.com/y-ta/items/fc54af35026550eb5bc6
- 投稿日:2019-01-27T22:11:40+09:00
PHPについて。Progate:PHP1を終えて
未来電子テクノロジーでインターンをしている<高見諒>です。
ProgateのPHP1を終えたので、その学びを備忘録を兼ねて投稿します。
口調は変わります。目次
- PHPとは
- PHPの書き方
- 計算の省略形
- 比較演算子
- 論理演算子
- 変数
- コード
- 条件文if/elseif/else
- 条件文switch
- 配列、連想配列
- 繰り返し処理for/while
- foreach文
- 関数
- フォームを作るPHPとは
PHPはサーバーを通してHTMLに書き換えられる言語で、
Webサービスを開発するのに使われる言語のひとつ。PHPの書き方
PHPは
<?php ここに処理を書く。 ?>
というように、<?phpと?>で挟んで書く。計算の省略
$num += 1;は$num = $num + 1;
同じく
+=,-=,*=,/=,%=がある。
++は「1足す」
--は「1引く」比較演算子
>>=<<===!=論理演算子
&&かつ
||または変数について
変数とはデータが入る箱のようなもの。
複数回使うデータを使いまわすために作る。
~作り方~
$変数名PHPのコード
.ドットは左右をつなげる。
echoで表示条件文if/elseif/else
$num = 10; if($num >= 20){ echo '$numは20以上です。'; }elseif($num>= 10){ echo '$numは10以上です。'; }else{ echo '$numは10未満です。' }条件文switch
$rank = 1; switch($rank){ case 1: echo '金'; break; case 2: echo '銀'; break; default: echo '3位に銅メダルは無い。もちろん3位未満なら論外'; break; }配列、連想配列
配列 $animals = array('パンダ', 'ウサギ', 'コアラ'); echo $animals[0]; →「パンダ」 echo $animals[1]; →「ウサギ」 $animals[] = 'たかし'; →最後尾に追加 連想配列 $foods = array( 'Japan' => 'sushi', 'China' => 'dumpling', 'Korea' => 'kimchi' ); echo $foods['Japan']; →sushiと出てくる $foods['India'] = 'curry' →追加繰り返し処理for/while
if($i; $i <= 100; $i++){ echo $i.'<br>'; } $i = 1; while($i <= 100){ echo $i.'<br>'; $i++; } どちらも結果は1~100が一行ごとに段落替えされて表示。 変形 for($i; $i <= 100; $i++){ for($i; $i <= 100; $i++){ if($i > 87){ if($i % 4 == 0){ break; もしくは continue; } } echo $i; echo $i; } }foreach文
$foods = array( 'Japan' => 'sushi', 'China' => 'dumpling', 'Korea' => 'kimchi' ); foreach($foods as $countries => $popularFoods){ echo $countries.'のおすすめの食べ物は'.$popularFoods.'です'; }関数
echo strlen('にほんごであそぼ'); 8がでる(8文字) echo count($foods); 3が出る(3つ要素がある) echo rand(1,100); 1~100が出る function GoodWeight($height){ $height - 110; } GoodWeight(180); →結果は「70」(70キロが理想。)HTMLとPHPでフォーム
<form action="送り先のURL" method="get(送信する値がurlで見える)かpost(見えない)"> </form> echo $_POST['HTMLタグのnameで決めた名前']; で表示する。 選択肢量産 <select> <?php for($i = 1901; $i <= 2019; $i++){ これで1901~2019までの選択肢ができるはず、 echo "<option value='{$i}'>{$i}</option>"; ?> </select>
- 投稿日:2019-01-27T17:52:06+09:00
laravelで簡単な一言掲示板を作ってみた
はじめに
え~皆さんはじめまして、未来に絶望している学生です。
5日ほど前からlaravelの勉強を始めました。
アウトプットも兼ねて簡単な一言掲示板を作ってみました。完成したのはこのようなものです。
①新規投稿
名前とコメントとパスワードを入力して送信を押す。パスワードは削除や編集で必要になる。(会員登録とかそういうものではない。)②削除
投稿の一番左の番号と、投稿した際に入力したパスワードを入れて削除ボタンを押せば削除される。③編集
同じように番号とパスワードを入力して編集ボタンを押すと、その名前とコメントとパスワードが、新規投稿部分のフォームに表示されるので、それを変えたいように変えて送信を押せば編集される。ちなみに一画面ですべてのアクションを行っている。
テーブル作成
php artisan make:migration create_posts_tablemigartionファイルはこのように書き換える。
database/migrations/2019_01_26_215655_create_posts_table.phppublic function up() { Schema::create('posts', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->string('comment'); $table->string('password'); $table->timestamps(); }); }php artisan migrateモデル作成
php artisan make:model Post$guardedでidを「値を用意しておかない項目」に指定する。仮に値がnullだとしてもエラー無く動く。
$rulesは、バリデーションのときに呼び出して使う。app\Post.phpclass Post extends Model { protected $guarded = array('id'); public static $rules = [ 'name' => 'required', 'comment' => 'required', 'password' => 'required', ]; }ビュー作成
views\post\index.blade.php<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>掲示板</title> </head> <body> <form action="post" method="post"> {{ csrf_field() }} <input type="hidden" name="id" value="{{ $data->id }}"> <tr><th>名前:</th><td><input type="text" name="name" value="{{ $data->name }}"></td></tr> <tr><th>コメント:</th><td><input type="text" name="comment" value="{{ $data->comment }}"></td></tr> <tr><th>パスワード:</th><td><input type="text" name="password" value="{{ $data->password }}"></td></tr> <tr><th></th><td><input type="submit" name="add" value="送信"></td></tr> </form> <form action="post" method="post"> {{ csrf_field() }} <tr><th>番号:</th><td><input type="text" name="id"></td></tr> <tr><th>パスワード:</th><td><input type="text" name="password"></td></tr> <tr><th></th><td><input type="submit" name="delete" value="削除"></td></tr> </form> <form action="post" method="post"> {{ csrf_field() }} <tr><th>番号:</th><td><input type="text" name="id"></td></tr> <tr><th>パスワード:</th><td><input type="text" name="password"></td></tr> <tr><th></th><td><input type="submit" name="edit" value="編集"></td></tr> </form> @if ($posts !== null) <table> @foreach ($posts as $post) <tr><td>{{ $post->id }}</td><td>{{ $post->name }}</td> <td>{{ $post->comment}}</td><td>{{ $post->created_at }}</td></tr> @endforeach </table> @endif </body> </html>ビューはこの一つのみ。
3つのフォームがあるが、上から新規投稿、削除、編集。
その下には、postsテーブルに保存されている全ての投稿を表示させるコードを書いている。コントローラーとルーティング
controllers\PostController.php<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Post; class PostController extends Controller { public function index(Request $request) { $posts = Post::all(); if (isset($request)) { return view('post.index', [ 'posts' => $posts, 'data' => $request, ]); } else { return view('post.index', [ 'posts' => $posts, ]); } } public function selectAction(Request $request) { if ($request->has('add') && $request->id !== null) { $this->update($request); } elseif ($request->has('add')) { $this->create($request); } elseif ($request->has('delete')) { $this->remove($request); } elseif ($request->has('edit')) { $data = $this->edit($request); if ($data !== null) { return redirect() ->action('PostController@index', [ 'id' => $data['id'], 'name' => $data['name'], 'comment' => $data['comment'], 'password' => $data['password'], ]); } } return redirect('post'); } public function create(Request $request) { $this->validate($request, Post::$rules); $post = new Post; $post->name = $request->name; $post->comment = $request->comment; $post->password = $request->password; $post->save(); } public function remove(Request $request) { $post = Post::find($request->id); if ($post['password'] === $request->password) { Post::find($request->id)->delete(); } } public function edit(Request $request) { $post = Post::find($request->id); if ($post['password'] === $request->password) { return [ 'id' => $post['id'], 'name' => $post['name'], 'comment' => $post['comment'], 'password' => $post['password'], ]; } else { return; } } public function update(Request $request) { $this->validate($request, Post::$rules); $post = Post::find($request->id); $form = $request->all(); unset($form['add']); unset($form['_token']); $post->fill($form)->save(); } }routes\web.phpRoute::get('post', 'PostController@index'); Route::post('post', 'PostController@selectAction');複数のフォームによるPOSTの送り先が同じ場所になってしまうので、
フォームごとに名前を付け、それによってコントローラーで追加、削除、編集メソッドへとふりわける必要があった。
参照↓
LaravelのFormで複数Submitボタンを設置したいときのハンドリング方法最後に
おとなしくページは分けたほうが良いですね。
- 投稿日:2019-01-27T17:15:25+09:00
ReflectionException : Class ClassName does not exist
Seederとmigrationのクラスをいじってて名前が気に入らなくて、コマンド使わずに、手でリネームしたらクラスがないと怒られた。
ReflectionException : Class NameSeeder does not exist // classがないと言われたらこれを打つ。 composer dump-autoloadcomposer dump-autoloadが面倒くさい Laravel
https://qiita.com/ytake/items/98c438d6a006f61df54a
- 投稿日:2019-01-27T16:12:39+09:00
Vagrantで開発環境を構築(3.PHP開発環境編)
目的
- 勉強の一貫で記事をまとめる.
- VirtualBox上にPHPの開発環境を構築する.
前回:Vagrantで開発環境を構築(2.仮想環境設定編)
今回:Vagrantで開発環境を構築(3.PHP開発環境編)
次回:Vagrantで開発環境を構築(4-1.Laravel開発環境編)Apacheのインストール
1. ターミナルで下記のコマンドを実行.
ターミナル$ sudo yum install httpd # Apacheをインストールする $ httpd -v # 確認2.
/etc/httpd/conf/httpd.confを編集する.httpd.confUser vagrant # 66行目 Group vagrant # 67行目3. ターミナルで下記のコマンドを実行.
ターミナル$ sudo systemctl start httpd # Apacheを起動 $ sudo systemctl enable httpd # Apacheの自動起動を有効化4. ApacheのWelcome画面にアクセスしてみる.
http://192.168.33.10/ もしくは http://localhost:8000 にブラウザでアクセス.
ここまでの手順が正常に済んでいればWelcome画面が表示されるはず.phpのインストール
phpをインストールするには,EPELリポジトリ,Remiリポジトリを追加する必要がある.
1. ターミナルで下記のコマンドを実行.
ターミナル$ sudo yum install epel-release # EPELリポジトリを追加 $ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm # RPMリポジトリを追加 $ yum install --enablerepo=remi,remi-php70 php php-devel php-mbstring php-pdo php-mysqlnd php-xml # PHP,他各種パッケージをインストール $ php -v # 確認参考:yumリポジトリ追加リスト 完全版
参考:【yum入門】epel, remiなどのレポジトリをyumに追加する方法2.
/etc/httpd/conf/httpd.confを編集する.httpd.confAllowOverride All # 103行目,125行目,151行目 DirectoryIndex index.php index.html # 164行目3. Apacheを再起動する.
ターミナル$ sudo systemctl restart httpd.service # Apacheを再起動4. サンプルページを作成する.
/var/www/html配下にindex.phpを作成する.index.php<?php echo 'Hello world.'; ?>再び http://192.168.33.10/ にアクセスすると
Hello world.が出力されていることが確認できる.composer のインストール
composerは,依存性管理ツールというもので,フレームワーク等を使って開発するときにもとても役に立つ代物.
1. ターミナルで下記のコマンドを実行.
ターミナル$ curl -sS https://getcomposer.org/installer | php # composerをインストール $ sudo mv composer.phar /usr/local/bin/composer $ composer -V # 確認参考:PHP開発でComposerを使わないなんてありえない!基礎編
mariaDBのインストール
参考:mariaDBとは
1. ターミナルで下記のコマンドを実行.
ターミナル$ sudo yum remove mariadb marinadb-libs # インストール済みのmariaDBを削除2.
/etc/yum.repos.d/MariaDB.repoにインストール元を追加する.MariaDB.repo[mariadb] name = MariaDB baseurl = http://yum.mariadb.org/10.1/centos7-amd64 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=13. ターミナルで下記のコマンドを実行.
ターミナル$ sudo yum install --enablerepo=mariadb MariaDB-common MariaDB-devel MariaDB-shared MariaDB-compat MariaDB-server MariaDB-client # mariaDBをインストール4. ターミナルで下記のコマンドを実行.
ターミナル$ sudo systemctl start mariadb.service # mariaDBを起動 $ sudo systemctl enable mariadb.service # mariaDBの自動起動を有効化5. テスト接続をする.
ターミナル$ mysql -u root MarinaDB [(none)]> SHOW DATABASES; MarinaDB [(none)]> USE test; MarinaDB [test]> SHOW TABLES; MariaDB [test]> CREATE TABLE sample (id int auto_increment, name varchar(30), index(id)); MariaDB [test]> insert into sample (name) values ('Yamada Taro'); MariaDB [test]> insert into sample (name) values ('Tanaka Hanako'); MariaDB [test]> exit6. PHPからも接続してみる.
index.php<?php $dsn = 'mysql:dbname=test'; $user = 'root'; $pass = ''; try { $db = new PDO($dsn,$user,$pass); $sql = "SELECT * FROM sample"; foreach ($db -> query($sql) as $row) { echo($row['id'] . ":" . $row['name'] . "<br>"); } } catch(PDOException $e) { die("die"); } $db=null; ?>再び http://192.168.33.10/ にアクセス
まとめ
以上で仮想環境の設定が完了.
次回からはPHPのフレームワークの開発環境を構築していく.前回:Vagrantで開発環境を構築(2.仮想環境設定編)
今回:Vagrantで開発環境を構築(3.PHP開発環境編)
次回:Vagrantで開発環境を構築(4-1.Laravel開発環境編)
- 投稿日:2019-01-27T12:34:35+09:00
.htaccessのmod_rewriteでのリダイレクトする
ノスタルジックなシステムにおいて下記のようなURLを
http://localhost/post.php?user=hoge&id=10下記のようにリダイレクトしたい場合
http://localhost/post/hoge/10.htaccessには下記のように記述します。
RewriteCond %{QUERY_STRING} user=([a-z]+)&id=([0-9]+) RewriteRule ^post\.php$ /post/%1/%2? [L,R=301]最後の
?をつけないとクエリがそのまま渡ります。クエリをそのまま渡したい場合は削除すると良い。リダイレクトしたあとのURLを下記のように書き換えてユーザーにアクセスさせる場合、このURLでも上記のリダイレクト対象となりますので
RewriteRule ^post/([a-z]+)/([0-9]+)$ /post.php?action=tag&id=$1 [QSA,L]別のファイルでURL書き換えをさせるのが良かった
RewriteRule ^post/([a-z]+)/([0-9]+)$ /post2.php?action=tag&id=$1 [QSA,L]
- 投稿日:2019-01-27T12:29:46+09:00
Laravel 5.7の認証機能でユーザー登録・パスワードリセット・メールアドレス確認のルーティングON/OFFを切り替える方法
はじめに
Laravelでは、認証機能を以下のコマンドで導入することができます。
php artisan make:authこの際、ログインの機能に加え、ユーザー登録機能、メールアドレス確認も追加されますが、
状況により機能を取りやめたい場合があります。
そのための方法をメモとして残します。ルーティングの切り替え
認証機能のルーティングは以下の一文で、一括して機能しています。
routes\web.phpAuth::routes();これに対して、連想配列の引数を渡してあげることで、
認証の各機能に対して、ON・OFFの切り替えを行うことができます。
(正確には、ルーティングを取りやめるということ)routes\web.phpAuth::routes(['register' => false, 'reset'=> false, 'verify'=> false]);各連想配列のインデックスは以下に対応します。
trueがON,falseがOFFです。
register: ユーザー登録へのルーティング
reset: アカウントリセットへのルーティング
verify: メールアドレス確認へのルーティングソースコードの挙動
Authクラスは
config\app.phpにて、エイリアスとして定義されています。config\app.php'Auth' => Illuminate\Support\Facades\Auth::class,
routes()の引数は最終的にvendor\laravel\framework\src\Illuminate\Routing\Rounter.php内の
auth関数に渡されます。vendor\laravel\framework\src\Illuminate\Routing\Rounter.phppublic function auth(array $options = []) { // Authentication Routes... $this->get('login', 'Auth\LoginController@showLoginForm')->name('login'); $this->post('login', 'Auth\LoginController@login'); $this->post('logout', 'Auth\LoginController@logout')->name('logout'); // Registration Routes... if ($options['register'] ?? true) { $this->get('register', 'Auth\RegisterController@showRegistrationForm')->name('register'); $this->post('register', 'Auth\RegisterController@register'); } // Password Reset Routes... if ($options['reset'] ?? true) { $this->resetPassword(); } // Email Verification Routes... if ($options['verify'] ?? false) { $this->emailVerification(); } }この箇所にて、ルーティングの可否が切り替えられています。
- 投稿日:2019-01-27T09:07:51+09:00
phpbrewでインストールしたphpがdyld: Library not loaded: ...で動かなくなった
はじめに
phpbrewでインストールしたphpが
dyld: Library not loaded: ...のエラーを出して動かなくなった。phpbrewコマンド自体も中でphp呼ぶ事が多くそれはswitchで選んでいたphpが使われるようでちょっと焦る。なにしろhelpも見られない。% phpbrew --help dyld: Library not loaded: /usr/local/opt/readline/lib/libreadline.7.dylib Referenced from: /Users/matsui/.phpbrew/php/php-7.3.0/bin/php Reason: image not foundめったにないけどいつかは次もありそうなので対処方法をメモしておく。
原因
homebrewのupdateをした影響で、phpbrew管理下のphpをビルドしたときにリンクしたライブラリがなくなっていた。今回はreadlineが7から8になったので、libreadline.7.dylibがなくなってかわりにlibreadline.8.dylibができていた。
対処
phpbrew switch-off
まずはこれでシステムのphpに切り替える。
(方法1)再インストール
だいたいインストールしたときのvariantとか忘れてるので
phpbrew list -vで確認する。% phpbrew list -v * (system) php-7.3.1 Variants: +bz2=/usr/local/opt/bzip2 +zlib=/usr/local/opt/zlib +xml +opcache \ +bcmath +calendar +cli +ctype +dom +fileinfo +filter +ipc +json +mbregex \ +mbstring +mhash +mcrypt +pcntl +pcre +pdo +pear +phar +posix +readline \ +sockets +tokenizer +curl +openssl +zip php-7.3.0 Variants: +bz2=/usr/local/Cellar/bzip2/1.0.6_1 +zlib=/usr/local/Cellar/zlib/1.2.11 \ +xml +opcache +bcmath +calendar +cli +ctype +dom +fileinfo +filter +ipc \ +json +mbregex +mbstring +mhash +mcrypt +pcntl +pcre +pdo +pear +phar \ +posix +readline +sockets +tokenizer +curl +openssl +zip php-7.2.13 Variants: +bz2=/usr/local/Cellar/bzip2/1.0.6_1 +zlib=/usr/local/Cellar/zlib/1.2.11 \ +xml +opcache +bcmath +calendar +cli +ctype +dom +fileinfo +filter +ipc \ +json +mbregex +mbstring +mhash +mcrypt +pcntl +pcre +pdo +pear +phar \ +posix +readline +sockets +tokenizer +curl +openssl +zipあとはこれを見ながら再インストール。いい機会なのでもう使いそうにないのは整理するのもいい。
(方法2)なくなったライブラリを戻す
homebrewは古いバージョンも/usr/local/Cellerの下に残っているので、そちらから足りなくなったファイルをみつけてsymbolic linkを張るなどする手もある。
たとえば今回の場合なら
% ln -s /usr/local/Cellar/readline/7.0.5/lib/libreadline.7.dylib /usr/local/opt/readline/libただしこちらの方法を使ったときはうっかり
brew cleanupで古いパッケージをまとめて削除などしないように気をつけること。
- 投稿日:2019-01-27T01:02:52+09:00
PHPで最低限覚えておきたい基礎文法(言語リファレンス)
はじめに
久しぶりにPHPの基礎文法についておさらいしたので、その内容を簡単にまとめた記事です。
結構なボリュームになりましたが、これからPHPを始める人の参考になれば嬉しいです。もし間違っている点あれば、ご指摘いただけると幸いです。
基本編
PHPでプログラムを動かす為の基本です。サクッと覚えちゃいましょう。
Hello World
<?php echo "Hello World"; ?>まずは、おなじみのこれ。
PHPは、<?phpと?>の間に書かれたものが、プログラムとして実行されます。プログラムの終わりには;を付けます。コメント
#1行コメント //1行コメント /*複数行コメント 複数行コメント */全部で3種類あります。
/*複数行コメント*/を使う場合、同じ形でコメントアウトをネストするとエラーになるので注意です。文字列の出力
echo "こんにちは"; //こんにちは print "こんにちは"; //こんにちは
echoもしくは
この2つの違いは、次の3つです。基本はechoで問題ないかと思います。1.
echoはカンマ「,」区切りで複数の文字列を指定できるのに対し、echo "Hello", "World"; //この構文はエラーが出ません print "Hello", "World"; //この構文はエラーが出ます2.
echoは返さない$str = echo "Hello World"; //この構文はエラーが出ます $str = print "Hello World"; //この構文はエラーが出ません※結果を返さない分、わずかにecho()の方が早いようです。
文字列
echo "文字列"; echo `文字列`;文字列は
"ダブルクォーテーション"か'シングルクォーテーション'で囲むことで、扱うことができます。
この2つの違いは、変数が展開できるか否かです。変数については、この後で触れてます。$str = "太郎"; echo "私の名前は、$str"; //私の名前は、太郎 $str = "太郎"; echo `私の名前は、$str`; //私の名前は、$strヒアドキュメント
echo <<<EOD ヒアドキュメントを使えば、長い文章を簡単に出力することができます。 連結文字やダブルクオーテーション使わずに済みます。 EOD; /* ヒアドキュメントを使えば、長い文章を簡単に出力することができます。 連結文字やダブルクオーテーション使わずに済みます。 */ヒアドキュメントは、
<<<開始ID 文字列 終端ID;で使うことができます。IDでよく使われるのが、「EOM」「EOF」「EOD」ですが、「ABC」でも何でも構いません。
ちなみに、「EOM」は End Of Message、「EOF」は End Of File、「EOD」は End Of Document の略です。改行
<html> <head> <title>PHPの基礎知識をまとめてみた</title> </head> <body> <?php echo "1行目:改行して出力<br />"; echo "2行目:改行後の文字列"; ?> </body> </html> <?php echo "1行目\n"; echo "2行目"; ?>ブラウザ上での改行は、
<br />とHTMLタグを入れます。ソース上での改行は、\nを入れます。文字列のエスケープ
非文字列エスケープの例echo "<a href="http://php.net/manual/ja/index.php">PHPマニュアル</a>"; //Parse error: parse error, expecting `','' or `';'' inこれたど、
echo "文字列"の括りの中にさらに"が入っている為、エラーが出ます。
これを回避するには、エスケープ文字\を使います。エスケープ文字は重複する"の前に付けます。文字列エスケープの例echo "<a href=\"http://php.net/manual/ja/index.php\">PHPマニュアル</a>"; //PHPマニュアル変数編
変数というのは値を保持しておく箱だと思って下さい。
値を保持しておいて後から計算に使ったり、取り出して表示したりすることができます。変数
$num = 1; echo $num; //1 $str = "Hello World"; echo $str; //Hello World変数は、
$変数名 = 値で宣言します。ポイントは、変数の前に$を付けること。
ちなみにPHPでは型の定義を勝手にしてくれます。つまり、Javaみたいに型の定義を宣言する必要が無いです。ただし、変数には命名規則があるので気を付けましょう。
文字列と変数の結合
$str = "文字列"; echo `私の名前は、`.$str; //私の名前は、太郎文字列結合演算子
.を使うことで、文字列と変数を結合できます。変数の参照渡し
非参照渡しの例$a = 1; $b = $a; $a = 2; echo $b; //1PHPが
$aと$bを違う変数として扱っているため、$aの値を変更しても$bの値は元の「1」を保持したままです。
これを参照渡しを使うことで、$aと$bを「違う名前を持つ同じ変数」として扱えるようにできます。
参照渡しを使うにはアンパサンド&を使います。&を代入する方の変数の$前に付けます。参照渡しの例$a = 1; $b = &$a; //アンパサンドを使う $a = 2; echo $b; //2変数のスコープ
※関数を理解していないと躓くと思うので、とりあえずこういうのがあるんだ程度で覚えといて下さい。
function outputInfo($name){ $pet = "猫"; //ローカルスコープ echo $name."さんは".$pet."を飼っています” } outputInfo("山田"); echo $pet."は可愛いですね";出力結果//山田さんは猫を飼っています //undefined~ は可愛いですね変数の使える範囲を
スコープと言います。
P関数内で作成した変数は、ローカルスコープと呼ばれ、その関数内でしか参照できません。ローカル変数をグローバルスコープでも使えるようにするためには、グローバル宣言をする必要があります。
グローバル宣言はglobal 変数名;で宣言することができます。function outputInfo($name){ global $pet; $pet = "猫"; echo $name."さんは".$pet."を飼っています” } outputInfo("山田"); echo $pet."は可愛いですね";出力結果// 山田さんは猫を飼っています // 猫は可愛いですね定数編
定数というのは、変数に対して変更してはいけない値を保持しておくものです。消費税とか円周率とか。
定数
define(`PI`, 3.14); echo PI; //3.14定数は、
defineで宣言します。変数と違って$を付ける必要はありません。
慣習的に、定数は常に大文字で表記されます。ちなみに、定数のスコープはグローバルなので、PHPスクリプト中どこでも定数にアクセスできます。
演算子編
演算子というのは、プログラミングで計算や判定をしたりするのに使われる記号のことです。
算術演算子
$a + $b // 加算 $a - $b // 減算 $a * $b // 乗算 $a / $b // 除算 $a % $b // $a を $b で割った余り小学校で習った算数と同じですね。数値を足したり引いたりするための演算子です。
加算子(インクリメント)/減算子(デクリメント)
$a++ // $a の値をひとつ加算する(変数を返し、変数に+1を加えます。) $a-- // $a の値をひとつ減算する(変数を返し、変数から-1を引きます。) ++$a // $a の値をひとつ加算する(変数に+1を加え、変数を返します) --$a // $a の値をひとつ減算する(変数から-1を引き、変数を返します)数の値を「+1」「-1」にする演算子です。インクリメント演算子とデクリメント演算子と言います。
インクリメント/デクリメント演算子を変数の前/後に付けた場合で挙動が異なるので、注意しましょう。文字列演算子
$a . $b // 文字列 $a と文字列 $b を連結文字列を結合する演算子です。連結したい文字列や変数の間にドット「.」を挟みます。
代入演算子
$a = $b // 代入 $a += $b // $a = $a + $b に同じ $a -= $b // $a = $a - $b に同じ $a *= $b // $a = $a * $b に同じ $a /= $b // $a = $a / $b に同じ $a %= $b // $a = $a % $b に同じ $a &= $b // $a = $a & $b に同じ $a |= $b // $a = $a | $b に同じ $a ^= $b // $a = $a ^ $b に同じ $a <<= $b // $a = $a << $b に同じ $a >>= $b // $a = $a >> $b に同じ $a .= $b // $a = $a . $b に同じ変数に値を代入する演算子です。
比較演算子
$a == $b // $a と $b が等しい $a === $b // $a と $b が等しい(型を厳密に比較する) $a != $b // $a と $b が等しくない $a <> $b // $a と $b が等しくない $a !== $b // $a と $b が等しくない(型を厳密に比較する) $a < $b // $a が $b よりも小さい $a > $b // $a が $b よりも大きい $a <= $b // $a が $b 以下である $a >= $b // $a が $b 以上である後で出てきますが、if、for、while の条件分岐に利用する演算子です。
論理演算子
$a and $b // $a かつ $b が TRUE であれば $a && $b // $a かつ $b が TRUE であれば $a or $b // $a または $b が TRUE であれば $a || $b // $a または $b が TRUE であれば !$a // $a が FALSE であれば $a xor $b // $a まはた $b どちらか片方のみが TRUE であれば論理演算を行うための演算子です。
配列編
配列というのは、複数の値を入れられる箱だと思って下さい。
変数は1度に1つの値しか保持できませんが、配列を使えば1つの変数に複数の異なる値を保持する事ができます。配列
$family = ['dad', 'mom', 'son', 'daughter']; // $familyは配列 echo $family[0]; //dad echo $family[1]; //mom echo $family[2]; //son echo $family[3]; //daughter変数では1つの変数に1つの値しか保持(代入)する事ができませんが、配列を使えば1つの変数に複数の値を保持する事ができます。
配列は、array[値1,値2,...]で使うことが出来ます。連想配列
$family_name = [ 'dad' => 'taro', 'mom' => 'hanako', 'son' => 'saburo', 'daughter' => 'siro' ]; echo $family_name['dad']; // 'taro'配列では、[ ]の中は、0,1,2...の数字の順番でしたが、数字ではなく文字のキーをもとにして値を設定した配列を連想配列と呼びます。
連想配列は、配列名 = array[キー1 => 値1, キー2 => 値2, ... ];で使うことができます。制御構造編
上から順番に処理していく単純なプログラムではなく、条件によって処理内容を変更したり、同じ文を何回も実行したりする事、つまりプログラムの流れを制御するものを制御構造と言います。
条件分岐(if文)
条件分岐$num = 5; if ($num > 3) { echo "変数numの内容は3より大きいです"; //条件に一致した場合に実行する処理 } else { echo "変数numの内容は3より小さいです"; //条件に一致しなかった場合に実行する処理 } // 変数numの内容は3より大きいです条件式の部分がTRUEであれば処理を実行し、FALSEであれば実行せずに無視します。
条件の複数指定$num = 5; if (num == 10) { echo "変数numの内容は5です。"; } elseif ($num > 2) { echo "変数numの内容は2より大きいです。"; } else { echo "変数numの内容は2より小さいです。"; }条件を複数指定したい場合は、
elseifを使います。真偽値の判定$num = TRUE; if ($num == TRUE) { echo "変数numの内容は真です。"; //条件に一致した場合に実行する処理 } if ($num == FALSE) { echo "変数numの内容は偽です。"; //条件に一致しなかった場合に実行する処理 }上記のように、
TRUEとFALSEを判定することもできます。AND条件とOR条件$num_a = 2; $num_b = 4; if ($num_a == 2 and $num_b == 4) { echo " 変数num_aは2、変数num_bは4です。"; //条件に一致した場合に実行する処理 } else { echo " 条件に一致しません。"; //条件に一致しなかった場合に実行する処理 }数の条件を組み合わせて1つの条件にすることもできます。
Switch文
$i = 1; switch ($i) { //{}は繰り返し行う処理 case 0: echo "iは0に等しい"; //実行する処理1 break; case 1: echo "iは1に等しい"; //実行する処理2 break; case 2: echo "iは2に等しい"; //実行する処理3 break; }
break;で処理から抜けることができます。もしbreak;が無い場合、case 0:つまり、$iが0に等しい場合は、全てのecho文を出力してしまいます。$iが1の場合、最後の2つのecho文を出力してしまうので注意です。ループ処理(while文)
通常のwhile文$i = 1; while( $i <= 10 ){ //iが10を超えると処理を終了する echo $i++."<br />\n"; } //1から10まで改行されて出力されるwhile文は、条件式の値がTRUEの間ループ処理を実行しつづけます。条件式が初めからFALSEの時はループ処理は一回も実行されません。
do-while文$i = 1; do{ echo $i++."<br />\n"; //繰り返し判定を行う前に一度処理が実行される } while( $i >= 10 ); //1while文は、条件式が初めからFALSEの時はループ処理は一回も実行されませんが、必ず1回は処理を行う場合にはdo..while文を使うことができます。
ループ処理(for文)
for( $i = 1; $i<= 10; $i++ ){ echo $i."<br />\n"; //改行しながら値を表示 } //1から10まで改行されて出力されるfor分は、「条件式」の値がTRUEの場合、ループ処理を実行しつづけます。「条件式」がFALSEの時はループ処理の実行を終了します。
While文とfor文で同じような処理が行えますが、使い分けるポイントはこちらの記事が参考になりました。
繰り返す回数があらかじめわかっている ⇒ for繰り返す回数があらかじめわからない ⇒ whileループ処理(foreach文)
$family_name = [ 'dad' => 'taro', 'mom' => 'hanako', 'son' => 'saburo', 'daughter' => 'siro' ]; foreach($family_name as $value){ //$family_nameを$valueに代入 echo $value; } ///tarohanakosaburosiroforeach文は配列用のループ処理です。要素数が多い配列や、データベースにある大量の情報を順に取り出したい時に使えます。
continue文
$family = ['dad', 'mom', 'son', 'daughter']; // $familyは配列 foreach ($family as $value){ if($value == "mom"){ continue; }else{ echo $value; } } //dadsondaughtercontinue文を使うと、ループ構造の中で現在のループ処理をスキップし、次のループから処理を続けることができます。
これらのループ処理はイメージで理解すると分かり易いかと思います。こちらが参考になりました。
- 投稿日:2019-01-27T00:48:47+09:00
PHPのスカラー型
こんばんは。
未来電子テクノロジーでインターンをしている者です。
今回、私がPHPを学ぶ中で、注意しておいた方が良いと思ったことについて紹介します。
PHPでの注意点
PHPで注意しないといけないことがスカラー型についてです。スカラー型とはプログラミング言語におけるデータ型の一つであり、PHPにおけるスカラー型には論理値(boolean)、整数(integer)、浮動小数点数 (float, double)、文字列 (string)の4種類があります。C言語の場合、スカラー型は変数を宣言する時点で型を決めますが、PHPでは変数の文脈に応じて型が決まります。下記ではC言語とPHPの場合の例を紹介します。
practice.cint x; x=9/2; //a=4になるpractice1.php$x = 9/2; //x=4.5になるこの時、注意しないといけないことがあります。それはPHPで割り算を行う場合、整数値を求めても勝手に浮動小数点
数になってしまうことです。PHPで割り算をして整数値を求める場合、intval()を使用します。これは指定した変数を整数型に変換して値を取得する関数です。practice2.php$x = intval(9/2); //x=4になるこのことを理解しておかないと、エラーにつながります。
実際、プログラミング初心者の私はこの部分でエラーが起こり、何時間も苦しみました。参考資料











