PHP – undefined, nullのisset()評価

概要

PHPは変数の宣言のみに関する構文はなく、値の定義によって変数が宣言される。

宣言・初期定義なしに変数を用いるとエラーとなるが、Javascriptのように自動的にドキュメントグローバルの変数になってしまって副作用が出かねないのとどちらがいいのか、悪いのか、不勉強のためすぐには結論が出せない。

未定義変数

未定義変数を直接評価するとUndefinedエラー

未定義の変数を評価しようとするとUndefinedエラーになる。

var_dump()で無理やり評価するとNULLになるが、if文の評価には使えない。

未定義変数をisset()で評価するとfalse

未定義の変数をisset()で評価するとbool型のfalse

if文の条件式にisset()の評価結果をそのまま使うと定義/未定義に対する処理が書ける。

null

nullisset()で評価するとfalse

すなわち、isset()で変数の有効性を評価する場合には、その変数が未定義である場合と、nullによって初期化した場合の区別なくfalseの結果に相当する。

定義済み変数

定義済み変数で内容がnullでなければtrue

したがってisset()で変数を評価した時の結果はtrue/falseのいずれか。

 

 

PHP – 様々な値の論理値

概要

PHPの値の論理値は以下の通り。

false true
予約語 false, FALSE, null, NULL true, TRUE
int 0 0以外
float 0.0 0.0以外
string '', '0' 左記以外
isset(val) undefined, null 左記以外

予約語~true, false, null

true, TRUEtruefalse, FALSEfalsenull, NULLfalse

整数~int

int型の整数は0だけがfalse、その他はtrue

実数~float

float型の実数は正確に0.0のときだけfalse、その他はtrue

文字列~string

string型は空文字列('')及び'0'false。その他の文字列はtrue'0.0‘もtrue)。

issetによる未定義変数とnullの評価

未定義の変数をそのまま評価すると、Undefinedエラーとなった上でfalseと評価される。

未定義の変数をisset()関数を通して評価するとfalse

変数の内容がnullの時もisset()関数の評価はfalse

 

PHP – 配列と連想配列

概要

PHPの配列は連想配列と同じで、連想配列のキーが整数で連続しているものが配列として扱われる。

配列

リテラル定義と追加

リテラル定義

配列をリテラルで定義すると、各要素に対して0から順番にインデックスが与えられる。

要素の追加

一度定義された配列に、未設定のインデックスで値を与えると、要素が付け加わえられる。

追加の不連続性

インデックスを飛ばして要素を加えた場合、抜かされたインデックスの要素は飛ばされて新たな要素が付け加えられる(以下の例では3番要素の後に5番要素が加えられ、4番要素は存在していない)。

再定義による上書き

定義済みの配列変数にリテラルで再定義すると、前の内容は破棄されて上書きされる。

インデックスによる定義・追加

未定義の変数へのインデックスによる定義

未定義の変数にインデックスで値を与えると配列として定義される。

インデックスによる追加

インデックスが飛んでいてもそのまま追加される。飛ばされた要素が埋められることはない。

追加の不連続性

中抜けになっているインデックスで要素を定義した場合、インデックスは整列せず後ろに付け加えられる。

値の型の混在

値にintやstringなど異なる方が混在してもよい。

空の配列への順次追加

空の配列を準備し、順次要素を追加する手順。

  1. 変数に空の配列[]を定義する
  2. キーを指定せず変数名[]=値で順次代入

 

連想配列

リテラル定義と追加

リテラル定義

キーと配列を=>で結んだリテラルで連想配列を定義。値に異なる方が混在してもよい。

キー指定による追加

キーを指定して末尾に要素を追加。

キーによる定義・追加

未定義の変数にキーを指定して値を与えると連想配列として定義される。

定義済みの連想配列にキーと値を指定して要素を追加。キーの型も混在してよい。

配列・連想配列のサイズ

count()関数の引数に配列や連想配列を指定して、サイズを取得する。

count(配列・連想配列)

配列・連想配列の存在確認

配列の要素を削除する

配列や連想配列の要素を削除する方法はこちら

配列の先頭・末尾・部分配列

破壊的な抜き取り・追加

配列要素の抜き取り・追加にはshift()/unshift()push()/pop()を使う。それらの方法はここちら

非破壊的な取出し

非破壊的に配列や連想配列の先頭・末尾・部分配列を取り出す方法はこちらを参照

配列の代入はディープコピー

1次元配列を代入すると、参照ではなく新たな配列としてコピーされる。

多次元配列の子要素の内容までコピーされる。

配列と連想配列

配列と連想配列の関係

  • PHPの配列と連想配列は同じもの
  • 連想配列のキーが整数のみで連続しているものが配列
  • 連想配列も配列も値の型は混在可能
  • 連想配列のキーも型の混在が可能

2つの配列から連想配列をつくる

array_combine()関数は2つの配列を引数にとり、第1引数をキー、第2引数を値とした連想配列を返す。

第2引数に連想配列を指定すると、その値が取り出されて使われる。配列を要素とする連想配列にはならない。

2次元の連想配列から列を取り出す

array_column()関数は2つの引数をとり、第1引数に指定した2次元の連想配列から第2引数で指定したキーの列を取り出す。

配列の操作

 

PHP – 演算

代数演算

+, -, *, **
加算/減算/乗算/べき乗。2つの項ともintの場合は結果もint。少なくとも1つの項がfloatの場合は結果もfloat。
/
除算。2つの項がintで割り切れる場合のみ結果もint。その他の場合結果はfloat。
intdiv(a, b)
a/bの整数商。結果の正負に関わらず、小数部分が切り捨てられる。
%
剰余。結果の符号は被除数の符号と同じになる。

文字列演算

.
文字列の結合。
.=
文字列の結合代入。左辺の引数に右辺の引数を追加する。

三項演算子

cond ? true_value : false_value
三項演算子は条件式condが真の時にtrue_valueを、偽の時にfalse_valueを返す。

null合体演算子

eval ?? null_value
null合体演算子は、条件式evalの評価結果nullでないときはその評価結果を、nullの場合はnull_valueを返す。

 

PHP – 導入

Windowsの場合

ダウンロード&インストール

PHP公式サイトのDonloadsから必要なファイルをダウンロード(Windowsの場合は”Windows downloadsから)。

パスの設定

設定から環境変数PATHにPHPフォルダーへのパスを追加。

php.ini

php.iniファイルの準備

PHPフォルダーにあるphp.ini-developmentかphp.ini-productionのどちらかをphp.iniにコピー。

必要なモジュールの有効化

マルチバイト文字列操作mbstring、SQL用のmysqliなどのコアモジュールでも、インストール直後には有効化されていない。

コアモジュールはPHPフォルダー下のextフォルダーにdllファイルとして納められている。

有効化するにはphp.iniファイルで以下の作業が必要。

  1. ;extension=mbstringなどとコメントアウトされているモジュールの行のコメントを外す
  2. ;extension_dir = “ext”とコメントアウトされている行のコメントを外す

参考:PHP 拡張モジュールの Windows へのインストール

サーバーの起動

php -S localhost:8000 -t [PHPのhtdocsのパス]

その他

参考:Windowsでのおすすめの構成

 

PHP – 主な内部関数

出力・書式

変数の内容確認

var_dump

var_dump ( mixed $expression , mixed ...$expressions ) : void

式・変数の型・サイズなどの情報を表示する。(PHP-manual)

print_r

print_r (mixed $value , bool $return = false ): string|bool

指定した変数に関する情報を解りやすく出力する、または文字列として返す。(PHP-manual)

テキスト出力

printf

printf ( string $format , mixed ...$values ) : int

$values$format文字列で書式整形して出力する。ブラウザへの出力の場合、連続する空白は圧縮されるので注意。(PHP-manual)

書式設定

number_format

number_format ( float $num , int $decimals = 0 , string|null $decimal_separator = "." , string|null $thousands_separator = "," ) : string

数値の小数点・小数桁数と3桁ごとの区切り方を指定する。(PHP-manual)

数値

端数処理

以下の端数処理のうち、floor, ceil, roundは、小数点以下をなくしても結果の型はfloatである点に注意

floor

floor ( float $value ) : float

$valueの小数点以下を切り下げる。戻り値は正負を問わず$valueを越えない最も大きな整数だが型はfloat。(PHP-manual)

ceil

ceil ( float $value ) : float

$valueの小数点以下を切り上げる。戻り値は正負を問わず$valueより大きい最も小さな整数だが型はfloat。(PHP-manual)

round

round ( float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]] ) : float

$valを四捨五入する。$precisionによって小数点以下/以上の丸め位置を指定する。(PHP-manual)

intdiv

intdiv ( int $num1 , int $num2 ) : int

$num1$num2で割った整数商を返す。結果はint

文字列

文字列操作

mbstrlen

mb_strlen ( string $string [, string|null $encoding = null ] ) : int

文字列の長さを返す。半角も全角も文字単位。(PHP-manual)

explode

explode ( string $separator , string $string [, int $limit = PHP_INT_MAX ] ) : array

文字列を区切り文字列で分解する(区切り文字列は1文字でなくてもよい)。(実行例)

implode

implode( string $separator, array $array) : sltring;

配列要素を文字列($separator)で連結する。配列のみを渡すと各要素が連続した文字列になる。

substr

substr ( string $string , int $offset , int|null $length = null ) : string

文字列中の位置と長さを指定して部分文字列を切り出す。

trim/ltrim/rtrim

trim ( string $string [, string $characters = " \n\r\t\v\0" ] ) : string

文字列の先頭・末尾の半角スペースやエスケープ区切り文字を削除する。全角スペースは削除されず、全角文字列ではうまく機能しない。(実行例)

str_replace

str_replace($search, $replace, $string) : string

文字列中の対象文字列を指定した文字列に置換する。(実行例)

strtok

文字列をトークンで切り分ける。使い方はこちら

str_shuffle

str_shuffle($str) : string

HTML文字列操作

htmlspecialchars

htmlspecialchars ( string $string [, int $flags = ENT_COMPAT [, string|null $encoding = null [, bool $double_encode = true ]]] ) : string

$string中の特殊文字をHTMLエンティティ―に変換する。(PHP-manual)

頻出の使用例は以下のようなもの。

htmlspecialchars($str, ENT_QUOTES, 'UTF-8')

チェック

数値型のチェック

is_numeric

is_numeric ( mixed $value ) : bool

数値あるいは数値形式の文字列の場合にtrue、その他の場合にfalseを返す('123''1.23''1e3’true'123abc''abc123'false)。(PHP-manual)

is_int

is_int ( mixed $value ) : bool

数値型の整数値の場合のみtrueを返す。1.231e3'123''abc'は全てfalse

ctype_digit

ctype_digit ( mixed $text ) : bool

文字列型で0~9の数字のみを含む場合にtrue。数字以外の記号・文字が含まれていたり数値型の場合はfalse'-123''1.23'123はfalse)。(PHP-manual)

配列のチェック

in_array

in_array ( mixed $needle , array $haystack , bool $strict = false ) : bool

第1引数が配列の要素のどれかと等しいかどうかをチェックする。この関数を使うときは、必ず第3引数にtrueを指定すること。第3引数省略時のデフォルトはfalseで比較が'=='で行われる。これをtrueにして初めて'==='で型まで比較するようになる。(PHP-manual)

配列操作

検索・抽出

加工

array_unique

array_unique ( array $array [, int $flags = SORT_STRING ] ) : array

配列$arrayの要素の重複を除いた配列を返す。(PHP-mannual)

array_shuffle

shuffle ( array &$array ) : bool

引数の配列の要素をシャッフルする。この関数は引数の配列を変更する。

array_map

array_map ( callable|null $callback , array $array , array ...$arrays ) : array

引数で指定した配列の各要素にコールバック関数を適用した配列を返す。詳しくはこちら

日付と時刻

現在日時

date

date ( string $format [, int|null $timestamp = null ] ) : string

$timestampを$formatで書式化して文字列で返す。$timestampが省略された場合は現在時刻time()が使われる。$formatについてはDateTimeInterface::format()を参照。(PHP-manual)

yyyy-mm-dd HH:MM:SSの形式はdate('Y-m-d H:i:s')

システム時刻

time

time ( ) : int

現在時刻を、Unixエポック (1970 年 1 月 1 日 00:00:00 GMT) からの通算秒としてint型で返す。(PHP-manual)

microtime

microtime ([ bool $as_float = false ] ) : string|float

現在のUnixタイムスタンプをマイクロ秒精度で返す。デフォルトの$as_float=falseの場合は2つの秒数の文字列を返し、trueにするとUnixエポック からの経過秒数を float型で返す。

OSのシステムコールに依存しており、パフォーマンスの計測には、hrtime() を使うことが推奨されている(ただしPHP7.3.0以上)。(PHP-manual)

hrtime

hrtime ([ bool $as_number = false ] ) : array|int|float|false

PHP7.3.0以上で対応。

任意のタイミングから計測したシステムの高精度な時刻を取得する。デフォルトの$as_number=falseでは戻り値は[秒, ナノ秒]の形式。trueにすると、ナノ秒単位の時刻値(64bitシステムの場合はint、32bitシステムの場合はfloat)。(PHP-manual)

乱数

整数乱数

mt_rand

mt_rand ( int $min , int $max ) : int

$min ≤ r ≤ $maxで整数の乱数rを返す。メルセンヌツイスターにより乱数を生成。(PHP-manual)

random_int

random_int ( int $min , int $max ) : int

$min ≤ r ≤ $maxで整数の乱数rを返す。(PHP-manual)