サーチ…
整数
PHPの整数は、ベース2(バイナリ)、ベース8(8進)、ベース10(10進)、またはベース16(16進)でネイティブに指定できます。
$my_decimal = 42;
$my_binary = 0b101010;
$my_octal = 052;
$my_hexadecimal = 0x2a;
echo ($my_binary + $my_octal) / 2;
// Output is always in decimal: 42
整数はプラットフォームに応じて32ビットまたは64ビットです。定数PHP_INT_SIZE
は整数のバイト数を保持します。 PHP_INT_MAX
と(PHP 7.0以降) PHP_INT_MIN
も利用できます。
printf("Integers are %d bits long" . PHP_EOL, PHP_INT_SIZE * 8);
printf("They go up to %d" . PHP_EOL, PHP_INT_MAX);
整数値は、浮動小数点数、ブール値、および文字列から必要に応じて自動的に作成されます。明示的な型キャストが必要な場合は、 (int)
または(integer)
キャストを使用して行うことができます。
$my_numeric_string = "123";
var_dump($my_numeric_string);
// Output: string(3) "123"
$my_integer = (int)$my_numeric_string;
var_dump($my_integer);
// Output: int(123)
整数オーバーフローはfloatへの変換によって処理されます:
$too_big_integer = PHP_INT_MAX + 7;
var_dump($too_big_integer);
// Output: float(9.2233720368548E+18)
PHPには整数除算演算子はありませんが、浮動小数点数を破棄するだけで常に '丸め'する暗黙的なキャストを使ってシミュレートすることができます。 PHPバージョン7では、整数除算関数が追加されました。
$not_an_integer = 25 / 4;
var_dump($not_an_integer);
// Output: float(6.25)
var_dump((int) (25 / 4)); // (see note below)
// Output: int(6)
var_dump(intdiv(25 / 4)); // as of PHP7
// Output: int(6)
(周りの余分な括弧ことに注意してください(25 / 4)
ために必要とされる(int)
キャストが分裂よりも優先順位が高いです)
文字列
PHPの文字列は、次の4つの方法で指定できる一連のシングルバイト文字です(つまり、ネイティブUnicodeサポートはありません)。
シングルクォート
物事を「そのまま」ほぼ完全に表示します。変数とほとんどのエスケープシーケンスは解釈されません。例外として、リテラルの一重引用符を表示するには、バックスラッシュ 'でエスケープし、バックスラッシュを表示するには別のバックスラッシュでエスケープすることができます\
$my_string = 'Nothing is parsed, except an escap\'d apostrophe or backslash. $foo\n';
var_dump($my_string);
/*
string(68) "Nothing is parsed, except an escap'd apostrophe or backslash. $foo\n"
*/
二重引用符
一重引用符で囲まれた文字列とは異なり、文字列の単純な変数名とエスケープシーケンスが評価されます。複雑な変数名を分離するには、中括弧(最後の例のように)を使用できます。
$variable1 = "Testing!";
$variable2 = [ "Testing?", [ "Failure", "Success" ] ];
$my_string = "Variables and escape characters are parsed:\n\n";
$my_string .= "$variable1\n\n$variable2[0]\n\n";
$my_string .= "There are limits: $variable2[1][0]";
$my_string .= "But we can get around them by wrapping the whole variable in braces: {$variable2[1][1]}";
var_dump($my_string);
/*
string(98) "Variables and escape characters are parsed:
Testing!
Testing?
There are limits: Array[0]"
But we can get around them by wrapping the whole variable in braces: Success
*/
Heredoc
heredoc文字列では、変数名とエスケープシーケンスは、二重引用符で囲まれた文字列と同様に解析されますが、複雑な変数名では中括弧は使用できません。文字列の先頭がで区切られ<<<
identifier
、およびによって終了identifier
、 identifier
有効な任意のPHP名です。終了識別子は、単独で行に表示する必要があります。空白は識別子の前後には許されませんが、PHPの行と同様にセミコロンで終わらなければなりません。
$variable1 = "Including text blocks is easier";
$my_string = <<< EOF
Everything is parsed in the same fashion as a double-quoted string,
but there are advantages. $variable1; database queries and HTML output
can benefit from this formatting.
Once we hit a line containing nothing but the identifier, the string ends.
EOF;
var_dump($my_string);
/*
string(268) "Everything is parsed in the same fashion as a double-quoted string,
but there are advantages. Including text blocks is easier; database queries and HTML output
can benefit from this formatting.
Once we hit a line containing nothing but the identifier, the string ends."
*/
Nowdoc
nowdoc文字列はheredocの一重引用符と似ていますが、最も基本的なエスケープシーケンスでさえ評価されません。文字列の先頭の識別子は、一重引用符で囲まれています。
$my_string = <<< 'EOF'
A similar syntax to heredoc but, similar to single quoted strings,
nothing is parsed (not even escaped apostrophes \' and backslashes \\.)
EOF;
var_dump($my_string);
/*
string(116) "A similar syntax to heredoc but, similar to single quoted strings,
nothing is parsed (not even escaped apostrophes \' and backslashes \\.)"
*/
ブール
ブール値は、 true
またはfalse
として示される2つの値を持つ型です。
このコードは、 $foo
の値をtrue
、 $bar
をfalse
。
$foo = true;
$bar = false;
true
とfalse
は大文字と小文字が区別されないため、 TRUE
とFALSE
も使用できますFaLsE
でも可能です。小文字を使用するのが最も一般的であり、 PSR-2などのほとんどのコードスタイルガイドで推奨されています。
ブーリアンは次のようなif文で使用できます。
if ($foo) { //same as evaluating if($foo == true)
echo "true";
}
PHPが弱く型付けされているため、上記の$foo
がtrue
またはfalse
以外のtrue
、自動的にブール値に強制変換されます。
次の値はfalse
。
- ゼロ値:
0
(整数)、0.0
(浮動小数点数)、または'0'
(文字列) - 空の文字列
''
または配列[]
-
null
(未設定変数の内容、または変数に割り当てられた内容)
他の値を指定するとtrue
。
この緩やかな比較を避けるために、値と型を比較する===
を使用して強い比較を実行できます。詳細は、 タイプの比較を参照してください。
型をboolean型に変換するには、型の前に(bool)
または(boolean)
型を使用できます。
var_dump((bool) "1"); //evaluates to true
またはboolval
関数を呼び出します。
var_dump( boolval("1") ); //evaluates to true
文字列へのブール変換( false
は空文字列になります)。
var_dump( (string) true ); // string(1) "1"
var_dump( (string) false ); // string(0) ""
整数へのブール変換:
var_dump( (int) true ); // int(1)
var_dump( (int) false ); // int(0)
逆も可能です:
var_dump((bool) ""); // bool(false)
var_dump((bool) 1); // bool(true)
また、ゼロ以外の場合はすべてtrueを返します。
var_dump((bool) -2); // bool(true)
var_dump((bool) "foo"); // bool(true)
var_dump((bool) 2.3e5); // bool(true)
var_dump((bool) array(12)); // bool(true)
var_dump((bool) array()); // bool(false)
var_dump((bool) "false"); // bool(true)
浮く
$float = 0.123;
歴史的な理由から、floatの場合は
gettype()
によって "double"が返され、単純に "float"ではなく、
浮動小数点数は浮動小数点数であり、平易な整数よりも出力精度が向上します。
浮動小数点数と整数は、PHPの変数型のキャストが緩慢であるため、一緒に使用できます。
$sum = 3 + 0.14;
echo $sum; // 3.14
phpは浮動小数点数を他の言語と同様に浮動小数点数として表示しません。例:
$var = 1;
echo ((float) $var); //returns 1 not 1.0
警告
浮動小数点精度
( PHPのマニュアルページから )
浮動小数点数の精度は限られています。それはシステムに依存しますが、PHPは通常、1.11e-16のオーダーの丸めによる最大相対誤差を与えます。非基本的な算術演算は、より大きな誤差を与える可能性があり、いくつかの演算が複合されるとき、誤差の伝播を考慮する必要があります。
さらに、基数10の浮動小数点数として正確に表現できる有理数は、0.1または0.7のように、基数2(2進数)の浮動小数点数として正確には表現されません。これは、仮数のサイズにかかわらず、内部的に使用されます。したがって、それらは内部精度のわずかな損失なしに内部バイナリの対応物に変換することはできません。たとえば、floor((0.1 + 0.7)* 10)は、内部表現が7.99999999999991118 ...のようになるため、通常は予想される8の代わりに7を返します。
したがって、浮動小数点数の結果を最後の桁には信用せず、浮動小数点数を直接比較しないでください。より高い精度が必要な場合は、任意精度の数学関数とgmp関数を使用できます。
呼び出し可能
呼び出し可能オブジェクトは、コールバックとして呼び出すことができるものです。 「コールバック」と呼ばれることができるものは次のとおりです。
匿名関数
標準のPHP関数(注: 言語構造ではありません )
静的クラス
非静的クラス( 別の構文を使用 )
特定のオブジェクト/クラスメソッド
オブジェクト自体が配列のキー
0
にある限り配列要素としてオブジェクトを参照する例:
$obj = new MyClass();
call_user_func([$obj, 'myCallbackMethod']);
コールバックは、PHP 5.4以降でcallable
型のヒントで表すことができます。
$callable = function () {
return 'value';
};
function call_something(callable $fn) {
call_user_func($fn);
}
call_something($callable);
ヌル
PHPはnull
キーワードで「値なし」を表しnull
。これは、C言語のNULLポインタとSQLのNULL値に多少似ています。
変数をnullに設定する:
$nullvar = null; // directly
function doSomething() {} // this function does not return anything
$nullvar = doSomething(); // so the null is assigned to $nullvar
変数がnullに設定されているかどうかを確認する:
if (is_null($nullvar)) { /* variable is null */ }
if ($nullvar === null) { /* variable is null */ }
Nullと未定義変数
変数が定義されていないか未設定の場合、nullに対するテストは成功しますが、 Notice: Undefined variable: nullvar
も生成されNotice: Undefined variable: nullvar
:
$nullvar = null;
unset($nullvar);
if ($nullvar === null) { /* true but also a Notice is printed */ }
if (is_null($nullvar)) { /* true but also a Notice is printed */ }
したがって、未定義の値はisset
でチェックする必要があります:
if (!isset($nullvar)) { /* variable is null or is not even defined */ }
タイプの比較
2つのタイプがあります比較して緩やかな比較 : ==
ととの厳密な比較 ===
。厳密な比較は、演算子の両側の型と値が同じであることを保証します。
// Loose comparisons
var_dump(1 == 1); // true
var_dump(1 == "1"); // true
var_dump(1 == true); // true
var_dump(0 == false); // true
// Strict comparisons
var_dump(1 === 1); // true
var_dump(1 === "1"); // false
var_dump(1 === true); // false
var_dump(0 === false); // false
// Notable exception: NAN — it never is equal to anything
var_dump(NAN == NAN); // false
var_dump(NAN === NAN); // false
また、強い比較を使用して、タイプと値が !==
を使用して一致しないかどうかを確認することもできます。
典型的な例==
オペレータが十分ではない、のように、異なるタイプを返すことができる機能であるstrpos
返し、 false
場合searchword
見つからない場合、マッチ位置( int
そうでない)は:
if(strpos('text', 'searchword') == false)
// strpos returns false, so == comparison works as expected here, BUT:
if(strpos('text bla', 'text') == false)
// strpos returns 0 (found match at position 0) and 0==false is true.
// This is probably not what you expect!
if(strpos('text','text') === false)
// strpos returns 0, and 0===false is false, so this works as expected.
タイプキャスティング
PHPは一般に、使用しようとするコンテキストから使用するデータ型を正しく推定しますが、手動で型を強制するのが便利な場合もあります。これは、宣言の先頭に、必要な型の名前をかっこで囲むことで実現できます。
$bool = true;
var_dump($bool); // bool(true)
$int = (int) true;
var_dump($int); // int(1)
$string = (string) true;
var_dump($string); // string(1) "1"
$string = (string) false;
var_dump($string); // string(0) ""
$float = (float) true;
var_dump($float); // float(1)
$array = ['x' => 'y'];
var_dump((object) $array); // object(stdClass)#1 (1) { ["x"]=> string(1) "y" }
$object = new stdClass();
$object->x = 'y';
var_dump((array) $object); // array(1) { ["x"]=> string(1) "y" }
$string = "asdf";
var_dump((unset)$string); // NULL
しかし注意してください:すべての型キャストが期待どおりに動作するわけではありません:
// below 3 statements hold for 32-bits systems (PHP_INT_MAX=2147483647)
// an integer value bigger than PHP_INT_MAX is automatically converted to float:
var_dump( 999888777666 ); // float(999888777666)
// forcing to (int) gives overflow:
var_dump((int) 999888777666 ); // int(-838602302)
// but in a string it just returns PHP_INT_MAX
var_dump((int) "999888777666"); // int(2147483647)
var_dump((bool) []); // bool(false) (empty array)
var_dump((bool) [false]); // bool(true) (non-empty array)
リソース
リソースとは、外部リソース(ファイル、ソケット、ストリーム、ドキュメント、接続など)を参照する特別なタイプの変数です。
$file = fopen('/etc/passwd', 'r');
echo gettype($file);
# Out: resource
echo $file;
# Out: Resource id #2
異なる(サブ)タイプのリソースがあります。 get_resource_type()
を使用してリソースタイプを確認できます。
$file = fopen('/etc/passwd', 'r');
echo get_resource_type($file);
#Out: stream
$sock = fsockopen('www.google.com', 80);
echo get_resource_type($sock);
#Out: stream
組み込みのリソースタイプの完全なリストは、 ここで見つけることができます。
タイプジャグリング
PHPは弱い型の言語です。データ型の明示的な宣言は必要ありません。変数が使用されるコンテキストによって、データ型が決まります。自動的に変換が行われます。
$a = "2"; // string
$a = $a + 2; // integer (4)
$a = $a + 0.5; // float (4.5)
$a = 1 + "2 oranges"; // integer (3)