20190127のPHPに関する記事は12件です。

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')};

うーん、後で忘れそうな気もしますが、すごくスッキリ書けるので採用。

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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/centos76

Vagrantfile を生成する

vagrant init で Vagrantfile を生成します。

VM のもととなる BOX ファイルは bento/centos-7.6検索結果)を使います。

vagrant init bento/centos-7.6   --box-version 201812.27.0

Vagrantfile を編集する

今回は VM を2つ作ります。

  • controller

    • Ansible を実行する VM
    • IPアドレス: 192.168.33.10
  • target

    • Ansible の実行対象で、PHP をビルドする VM
    • IPアドレス: 192.168.33.20

~/vagrant/centos76 の下に生成された Vagrantfile を以下のように書き換えます。

~/vagrant/centos76/Vagrantfile
Vagrant.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
end

VM を起動する

vagrant up で VM を起動します。

vagrant status を実行して、controllertarget 両方とも起動していれば問題ありません。

$ 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 controller

root ユーザーに切り替えて、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/hoststarget を追加して、名前解決できるようにしておきます。

# vi /etc/hosts
/etc/hosts
127.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   target

inventory ファイルを作る

Ansible 用のディレクトリを作ります。今回は以下のようなディレクトリ構成にします。

/ansible/
   |- invengtory/
   |   |- hosts    : 対象ホストを記述した設定ファイル
   |
   |- target/
       |- test.yml : Playbook ファイル

まずは /ansible/inventory/hosts ファイルを準備します。

# mkdir -p /ansible/inventory
# cd /ansible
# vi inventory/hosts

targets というグループのメンバーに target192.168.33.20)を追加します。

/ansible/inventory/hosts
[targets]
192.168.33.20

Playbook ファイルを作る

Ansible は、Playbook に理想的な状態を定義して対象ホストがそれを満たす状態を作る という考え方のツールです。なので、Playbook ファイルが一番重要になります。

# mkdir target
# vi target/test.yml

Playbook ファイルに設定する内容は後回しにして、先に 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 target

PHP をビルドする

前提

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.utf8

Playbook ファイルを作ったあとは、ansible-playbooktarget に反映します。

# ansible-playbook -i inventory/hosts target/test.yml

ソースコードを入手する

PHP のソースコードは GitHub にあるので、git clone で入手します。

# ssh target
# git clone https://github.com/php/php-src.git

configure する

今回はデバッグ目的なので --enable-debug オプションを付けて ./configure を実行します。

# cd php-src
# ./buildconf
# ./configure --enable-debug

make する

./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 --version
PHP 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 を実行した際に、libxml2sqlite がインストールされていないと表示されました。

しかし、yum で確認するとインストール済みとなっています。

いろいろ調べたところ、libxml2-develsqlite-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 の使い方から勉強しないと・・・)

参考


  1. Ansible 使う必然性はないのですが、なんとなく使ってみたかったので。 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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ファイルの場所も確認することができます。

スクリーンショット 2019-01-27 20.40.01.png

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を使って確認しましょう。

下図のような表示があれば、有効化は完了です。

スクリーンショット 2019-01-27 20.45.52.png

PhpStormの設定

ここからはPhpStormでXdebugを利用するための設定を行っていきます。

PHPのバージョンとPHP実行ファイルの設定

まずはPHPのバージョンをご自身が利用しているPHPのバージョンで設定します。

1.PhpStormの「環境設定」から「言語&フレームワーク」>>「PHP」と進みます。
2.「PHP言語レベル」にphpinfoで確認したバージョンを入力します。
スクリーンショット 2019-01-27 20.07.28.png

3.「CLIインタープリター」は右のボタンをクリックし、下図のように設定します。
スクリーンショット 2019-01-27 19.58.40.png

サーバー設定

デバッグ用でサーバの設定を行います。

1.PhpStormの「環境設定」から「言語&フレームワーク」>>「PHP」>>「サーバー」と進みます
2.左上の「+」ボタンをクリックします。
3.名前は任意ですが、「localhost」の入力で問題ありません
4.ホストにはローカル環境でやるのであれば、「localhost」で入力します。
5.ポート「80」、デバッガー「Xdebug」を設定します。
6.「OK」ボタンをクリックします。

Xdebug の受信ポート番号を確認

Xdebugで待ち受けをするポート番号を設定・確認します。

「環境設定」>>「言語&フレームワーク」>>「PHP」>>「デバッグ」をクリックします。
PhpStorm から Xdebug を利用する場合のポート番号を確認し xdebug.ini の remote_port と同じ値に設定します。既定は「9000」ですが、その設定のままで問題ないです。

スクリーンショット 2019-01-27 22.24.25.png

リモートデバッグ設定

1.メニューバーの「実行」>>「構成の編集」をクリックします。
2.左上の「+」ボタンをクリックし、「PHP Remote Debug」を選択します。
3.名前を「Xdebug」と入力します。
4.サーバーを「localhost」、ideキーは「PHPSTORM」と入力します。
5.「OK」ボタンをクリックします。

スクリーンショット 2019-01-27 20.27.46.png

デバッグ

ここからデバッグを動かすまでの手順を紹介していきます。

PhpStorm画面の右上にあるツールバーから、赤四角枠の部分を「Xdebug」に設定します。

次に赤丸枠の受話器のようなボタンを押します。ここを有効化することで、デバッガがトリガーの受信待ちとなり準備完了となります。

スクリーンショット 2019-01-27 20.59.59.png

あとはブラウザ上で、デバッグしたいページのURLを指定します。
この時にURLの後ろに「?XDEBUG_SESSION_START=xdebug」を付与してください。
(本来はphp.iniでxdebug.remote_autostart=1を設定していれば、不要な操作なんですがキャッシュか何かの影響でパラメータを入力しないと動かないこともありますので念の為)

スクリーンショット 2019-01-27 21.00.31.png

これで事前に処理を止めたいところにブレークポイントを張ってデバッグを開始すると、初回は下図のような画面が表示されることがあります。

「受諾」ボタンをクリックしてください。

スクリーンショット 2019-01-27 20.19.28.png

ここまでの操作で問題がなければ、ブレークポイントで処理が止まってくれるはずです。変数の中身などができるようになります。

スクリーンショット 2019-01-27 20.20.07.png

参考記事

参考にさせてもらった記事です。

ここまでの手順を実施すれば、目的は達成できると思いますが、もし上手くいかない、他にも方法が知りたいなどがあればこちらも参照してください。

https://www.karakaram.com/phpstorm-xdebug
https://qiita.com/y-ta/items/fc54af35026550eb5bc6

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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>


  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

laravelで簡単な一言掲示板を作ってみた

はじめに

え~皆さんはじめまして、未来に絶望している学生です。
5日ほど前からlaravelの勉強を始めました。
アウトプットも兼ねて簡単な一言掲示板を作ってみました。

完成したのはこのようなものです。
bandicam 2019-01-27 17-01-44-710.jpg
①新規投稿
名前とコメントとパスワードを入力して送信を押す。パスワードは削除や編集で必要になる。(会員登録とかそういうものではない。)

②削除
投稿の一番左の番号と、投稿した際に入力したパスワードを入れて削除ボタンを押せば削除される。

③編集
同じように番号とパスワードを入力して編集ボタンを押すと、その名前とコメントとパスワードが、新規投稿部分のフォームに表示されるので、それを変えたいように変えて送信を押せば編集される。

ちなみに一画面ですべてのアクションを行っている。

テーブル作成

php artisan make:migration create_posts_table

migartionファイルはこのように書き換える。

database/migrations/2019_01_26_215655_create_posts_table.php
public 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.php
class 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.php
Route::get('post', 'PostController@index');
Route::post('post', 'PostController@selectAction');

複数のフォームによるPOSTの送り先が同じ場所になってしまうので、
フォームごとに名前を付け、それによってコントローラーで追加、削除、編集メソッドへとふりわける必要があった。
参照↓
LaravelのFormで複数Submitボタンを設置したいときのハンドリング方法

最後に

おとなしくページは分けたほうが良いですね。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ReflectionException : Class ClassName does not exist

Seederとmigrationのクラスをいじってて名前が気に入らなくて、コマンド使わずに、手でリネームしたらクラスがないと怒られた。

ReflectionException  : Class NameSeeder does not exist

// classがないと言われたらこれを打つ。
composer dump-autoload

composer dump-autoloadが面倒くさい Laravel
https://qiita.com/ytake/items/98c438d6a006f61df54a

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.conf
User 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.conf
AllowOverride 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=1

3. ターミナルで下記のコマンドを実行.

ターミナル
$ 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]> exit

6. 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開発環境編)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

.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]
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel 5.7の認証機能でユーザー登録・パスワードリセット・メールアドレス確認のルーティングON/OFFを切り替える方法

はじめに

Laravelでは、認証機能を以下のコマンドで導入することができます。

php artisan make:auth

この際、ログインの機能に加え、ユーザー登録機能、メールアドレス確認も追加されますが、
状況により機能を取りやめたい場合があります。
そのための方法をメモとして残します。

ルーティングの切り替え

認証機能のルーティングは以下の一文で、一括して機能しています。

routes\web.php
Auth::routes();

これに対して、連想配列の引数を渡してあげることで、
認証の各機能に対して、ON・OFFの切り替えを行うことができます。
(正確には、ルーティングを取りやめるということ)

routes\web.php
Auth::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.php
    public 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();
        }
    }

この箇所にて、ルーティングの可否が切り替えられています。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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で古いパッケージをまとめて削除などしないように気をつけること。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPで最低限覚えておきたい基礎文法(言語リファレンス)

はじめに

久しぶりにPHPの基礎文法についておさらいしたので、その内容を簡単にまとめた記事です。
結構なボリュームになりましたが、これからPHPを始める人の参考になれば嬉しいです。

もし間違っている点あれば、ご指摘いただけると幸いです。

基本編

PHPでプログラムを動かす為の基本です。サクッと覚えちゃいましょう。

Hello World

<?php
echo "Hello World";
?>

まずは、おなじみのこれ。
PHPは、<?php?>の間に書かれたものが、プログラムとして実行されます。プログラムの終わりには;を付けます。

コメント

#1行コメント
//1行コメント
/*複数行コメント
複数行コメント */

全部で3種類あります。/*複数行コメント*/を使う場合、同じ形でコメントアウトをネストするとエラーになるので注意です。

文字列の出力

echo "こんにちは"; //こんにちは
print "こんにちは"; //こんにちは

echoもしくはprintでブラウザに文字列を出力できます。
この2つの違いは、次の3つです。基本はechoで問題ないかと思います。

1. echoはカンマ「,」区切りで複数の文字列を指定できるのに対し、printは出来ない

echo "Hello", "World"; //この構文はエラーが出ません
print "Hello", "World"; //この構文はエラーが出ます

2.printは結果を返すのに対し、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; //1

PHPが$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の内容は偽です。"; //条件に一致しなかった場合に実行する処理
}

上記のように、TRUEFALSEを判定することもできます。

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 ); 
//1

while文は、条件式が初めから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;
} 
///tarohanakosaburosiro

foreach文は配列用のループ処理です。要素数が多い配列や、データベースにある大量の情報を順に取り出したい時に使えます。

continue文

$family = ['dad', 'mom', 'son', 'daughter']; // $familyは配列

foreach ($family as $value){
    if($value == "mom"){
        continue;
    }else{
        echo $value;
    }
    }
//dadsondaughter

continue文を使うと、ループ構造の中で現在のループ処理をスキップし、次のループから処理を続けることができます。

これらのループ処理はイメージで理解すると分かり易いかと思います。こちらが参考になりました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPのスカラー型

こんばんは。

未来電子テクノロジーでインターンをしている者です。

今回、私がPHPを学ぶ中で、注意しておいた方が良いと思ったことについて紹介します。

PHPでの注意点

PHPで注意しないといけないことがスカラー型についてです。スカラー型とはプログラミング言語におけるデータ型の一つであり、PHPにおけるスカラー型には論理値(boolean)、整数(integer)、浮動小数点数 (float, double)、文字列 (string)の4種類があります。C言語の場合、スカラー型は変数を宣言する時点で型を決めますが、PHPでは変数の文脈に応じて型が決まります。下記ではC言語とPHPの場合の例を紹介します。

practice.c
int 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になる

このことを理解しておかないと、エラーにつながります。
実際、プログラミング初心者の私はこの部分でエラーが起こり、何時間も苦しみました。

参考資料

http://php.net/manual/ja/language.types.php

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む