【PHP】条件分岐「?(疑問符):(コロン)」

三項演算子でも条件分岐

条件?真の場合:偽の場合

(使用例)

$foo = 100;
$res = $foo >= 100 ? "100以上" : "100未満";
echo $res;
Code language: PHP (php)
★上記の実行結果
100以上
★変数($foo)値(99)での実行結果
100未満

if文で記述した場合

$foo = 100;
if($foo >= 100){
 echo "100以上";
} else {
 echo "100未満";
}
Code language: PHP (php)

もしくは…

$foo = 100;
if($foo >= 100):
 echo "100以上";
else:
 echo "100未満";
endif;
Code language: PHP (php)

単純な条件分岐ならコードがスッキリ。
個人的にはコードの見やすさで、if文のほうが好きです。
なるべくコードはスリムにしたほうが良いのですけどね。


(応用例)現在のページURL取得>フルパス表示

$url = $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$url = (empty($_SERVER['HTTPS']) ? "http://" : "https://").$url;
echo "<p>".$url."</p>";
Code language: PHP (php)
★実行結果

https://de-sign.work/category/all/web/php/%E5%9F%BA%E7%A4%8E/

printf()やsprintf()と指示子

プログラミングで何かを出力するには、
print()関数や(PHPでは)echoを使ったりするけれど、
printf()やsprintf() を使うこともよくあって、これがまた便利。
しかし、その扱い方をよく忘れてしまうのでメモっときます。

printf() : フォーマット済みの文字列を出力する関数
sprintf() : フォーマットされた文字列に値を返す関数

【参考サイト】
●printf() 
 http://php.net/manual/ja/function.printf.php
●sprintf()
 http://php.net/manual/ja/function.sprintf.php

この printf関数や sprintf関数を説明するときに、まず耳にするのが
「フォーマット済み(フォーマットされた)の文字列って何?」という質問。

まずはこの「フォーマット・・・」ってヤツから。
例えば、問い合わせフォームを利用すると、自動で問い合わせ内容の確認メールが届くことがよくありますよね。

(例)●●様 いつも▲▲をご利用いただき有難うございます。

これは予め決まった返信文を用意しておいて、その文中の特定位置(●●や▲▲のとこ)に自動で文字を差込んで送るプログラムになってます。
このような特定の位置に自動で文字を差し込むようになっている文書のことを「フォーマットされた文字列」と言います。

上記(例)のように、特定の位置へ文字を差し込む場合は、

(PHP記述例)
 $format = “%s様 いつも%sをご利用いただき有難うございます。”;

という風に「フォーマットされた文字列」を用意します。
この時、差込位置を指定している「%s」をディレクティブ(指示子)と言い、PHPでは指示子の始めに必ず「%」をつけて、差込む値の型式によって「d」とか「s」とかを指定します。

※指示子の種類は下記の表を参照

%d 10進数(数値)
%u 符号無し10進数
%o 符号無し8進数
%x 符号無し16進数
%X 符号無し16進数(大文字表記)
%e 指数形式の浮動小数点
%E %eと同じ(大文字表記)
%f 固定小数点形式の浮動小数点
%g %eまたは%fと同じ
%G %eまたは%fと同じ(大文字表記)
%b 符号無し2進数
%c 指定した文字コードに対応した文字
%s 文字列
%p 値のポインタ
%n 文字数を指定した変数に格納
%% %の文字そのもの、「\(エスケープシーケンス)」と同じ扱い)

そして、出力指定でprintf()やsprintf()を使う。

(printfを使ったPHP記述例)
 printf($format, “鈴木”, “仮想ショップ”);

(sprintfを使ったPHP記述例)
 echo sprintf($format, “鈴木”, “仮想ショップ”);

(実行結果)
 鈴木様 いつも仮想ショップをご利用いただき有難うございます。

上記例の出力結果はどちらも同じ。

printf()だとそのまま出力されるけど、
sprintf()では差込みしか行われないので、出力するにはechoなどの出力指定を付け加える。
sprintf()はデータベース等への書き出しを行う場合に使うのが基本なので、出力するならprintf()を使うのが一般的。

$format = "%s様 いつも%sをご利用いただき有難うございます。";
printf($format, "鈴木", "仮想ショップ");

実行サンプルはこちら

私の中では、いつまで経っても憶えられない関数の代表格ですね・・・これが。

ファイルの準備と基本の書き方

ファイル拡張子は『.php』
<?PHP〜?>(PHPタグ)の中に記述

PHPのソースを記述して実行するためにはファイルの拡張子が『.php』でなければ動きません。

HTMLページ(.html)を作成して、後から拡張子を『.php』に変えても大丈夫。


PHPタグで記述

PHPのソースコードは、まず<?PHP 〜 ?>タグを書いてその中に。

<?php
 // ここはコメントです(1行コメント)
 print("Hello World !");
 /* ここもコメントです(複数行コメント)
    複数行のコメントを書きたい場合は/* 〜 */で挟みます */
?>
Code language: PHP (php)

各命令文(ステートメント)の最後に『;(セミコロン)』を付ける。
これを忘れるとエラーになります。(上例4行目)

行頭に『//』を付けてコメントを書くこともできます。コメント文はPHP実行時に無視されます。(上例3行目)

文章の最初と最後に『/* */』を付けて挟めば、複数行のコメントを書くことができます。(上例5〜6行目)

ファイル内容がすべてPHPコードの場合は、最後の終了タグ『?>』は省略可。

実行結果

Hello World!


HTMLタグの前(外)にも記述できます。

<?php
 $msg = "Hello World !";
?>
<html>
 <head>
 <meta charset="UTF-8">
        ・・・
 </head>
 <body>
  <p>
<?php echo $msg; ?>
  </p>
 </body>
</html>
Code language: HTML, XML (xml)

プログラミング言語に共通すること(1)

変数(variable)

プログラムの中で、データを一時的に記憶しておくための場所を確保して名前(変数名)を付けたもの。
PHPでは変数名の前に『$(ドル記号)』をつけて設定します。

<?php
 $foo = 1000; // 変数「$foo」に数値「1000」を代入
 $hoge = "Hello World !"; // 変数「$hoge」に文字列「Hello World !」を代入
 echo $hoge . "
"; // 変数「$hoge」を出力(改行指定付き)

 $taxRate = 8; // 消費税率を変数で設定(%)
 $tax = $taxRate/100+1; // 税込計算するための数値を設定
 echo $foo. "(本体価格)"; // 変数「$foo」に文字を加えて出力
 echo $foo * $tax . "(税込価格)
"; // 変数「$foo」に税率を掛けて出力
?>

実行サンプルはこちら

定数

変数と同じく、データを記憶しておく場所に名前(定数名)を付けたもの。
くり返し使う値・文字などを入れて使います。
※すでに関数名などで使われている単語は定数名として使えません。

<?php
 // define(定数名, 値);
 define("FOO", 1000); // 定数「FOO」に数値「1000」を設定
 define("HOGE", "Hello World !"); // 定数「HOGE」に文字列「Hello World !」を設定
 echo FOO . "<br>";
 echo HOGE . " It's my life !";
 HOGE = HOGE . " It's my life !"; // ×定数値の変更は不可
?>

実行サンプルはこちら

変数とのちがいは、最初に設定した値を後で変更することはできません。
定数名には『$(ドル記号)』は付けません。
変数名と区別するためにアルファベット大文字で定数名を設定するのが一般的。
※すでに関数名などで使われている単語は定数名として使えません。

配列(array)

これも変数のようにデータを収納しておく場所を確保して名前(配列名)を付けたたものですが、配列の場合は一連のデータ収納場所(要素)ができ、複数のデータが収納できます。配列の各要素は添字(インデクス番号)で区別して利用することが可能です。

<?php
 $arr = array(1000, "Hello World !", "It's my life !");
 echo $arr[0]."
"; // 数値「1000」を出力
 echo $arr[1]."
"; // 文字列「Hello World !」を出力
 echo $arr[1]." ".$arr[2]."
"; // 文字列「Hello World ! It's my life !」を出力
 $arr[1] = $arr[2]; // 配列「$arr[1]」の値を「$arr[2]」で書き換え
 echo $arr[1]; // 文字列「It's my life !」を出力
?>

実行サンプルはこちら

連想配列(hash)

配列の各要素番号(0、1、2・・・)を数字ではなく文字(キー)で設定したもの。

<?php
 $hash = array("foo" => 1000, "bar" => "Hello World !", "hoge" => "It's my life !");
 echo $hash["foo"]; // 数値「1000」を出力
 echo $hash["bar"]; // 文字列「Hello World !」を出力
 echo $hash["hoge"]; // 文字列「It's my life !」を出力
?>

実行サンプルはこちら

関数(function)

よく使う処理作業をまとめておき、名前(関数名)をつけて定義したもの。必要にところで関数名を指定して(呼び出して)使います。

関数には、予めPHPが用意している『組み込み関数』と制作者が自分で定義する『ユーザー定義関数』の2種類があります。(呼び出し方は同じです)

PHP(組込)関数の利用方法

目的の関数を使いたい場合で、関数名に(かっこ)をつけて利用します。

関数名(引数);

関数に値を渡して処理させる場合は(引数)のところに値を書いて渡します。

例えば日時を取得する関数『date()』を使って、現在の年数(西暦)を取得したい場合は下記のようにして使います。

<?php
 echo date(Y); // 現在の年数を表示(西暦)
?>

実行サンプルはこちら

関数は、基本的に関数名の後に(かっこ)が付くようになっています。
上記でご紹介した、定数を作成する『define()』や配列を作成する『array()』などもPHPが予め用意している関数です。
『echo』のように(かっこ)を省略できる関数もあります。

PHPでよく使う関数については、こちらのサイトなどを参考にしてください。

ユーザー関数の定義と利用方法

制作者自身で関数を定義するには、まずページの中または読み込むページのどこかに下記のようにな形式で処理内容を記述します。

function 関数名(引数1, 引数2, …){
 実行される処理;
 …..
}

<?php
function hello(){
 echo "Hello World !"; // 文字列「Hello World !」を出力
}
hello(); // ユーザー関数『hello()』の呼び出し(この場所で「Hello World !」と表示)
echo "
";

// 数値に消費税を加えるユーザー関数
function tax_price($foo){
 $tax = 8; // 税率設定
 $zeigaku = $foo * $tax / 100; // 受け取った数値から消費税額を計算
 $price = $foo + $zeigaku; // 受け取った数値に消費税額を足す
 return $price; // 処理した値を呼び出された場所に返す
}
echo tax_price(1000)."
"; // ユーザー関数『tax_price()』を呼び出して1000を渡して結果を出力
// (数値「1080」表示)
echo tax_price(2000); // ユーザー関数『tax_price()』を呼び出して2000を渡して結果を出力
// (数値「2160」表示)
?>

実行サンプルはこちら

定義済の変数

PHPでは予めいくつかの変数が既に設定されており、プログラムのなかで使うことができます。
【参考サイト】PHP マニュアル – 定義済の変数

【おまけ】

メソッド(method)

C++やJAVA、Swiftなどのオブジェクト指向プログラミングで、よく使う処理方法を記述したもの。
記述方法は関数とほぼ同じだが、オブジェクト指向プログラミングの
クラスや構造体のなかで扱うものを関数と区別してこう呼ぶ。
PHPもVer.4からオブジェクト指向プログラミングに対応しています。