これは、PHPの構文について時々出てくる質問の集まりです。これはコミュニティWikiでもあるため、誰もがこのリストの管理に参加するよう招待されています。
以前は、演算子やその他の構文トークンに関する質問を見つけるのは困難でした。¹
主なアイデアは、Stack Overflowの既存の質問へのリンクを作成することです。したがって、PHPマニュアルの内容をコピーするのではなく、それらを参照する方が簡単です。
注:2013年1月以降、スタックオーバーフロー は特殊文字 をサポートしています。検索語句を引用符で囲むだけです。 [php] "==" vs "==="
あなたがそのような質問をしたために誰かからここに指摘されたなら、以下の特定の構文を見つけてください。 PHPマニュアル へのリンクされたページとリンクされた質問は、おそらくあなたの質問に答えます。もしそうなら、あなたは答えに賛成票を投じることをお勧めします。このリストは、他の人が提供するヘルプの代わりになるものではありません。
特定のトークンが以下にリストされていない場合、 パーサートークンのリスト で見つけることができます。
&
Bitwise Operators または References
=&
参照
&&
論理演算子
!!
論理演算子
?:
三項演算子
??
Null Coalesce Operator (PHP 7以降)
?string
?int
?array
?bool
?float
Nullable戻り値の型宣言 (PHP 7.1以降)
\
名前空間
=>
配列
==
比較演算子
===
比較演算子
!==
比較演算子
!=
比較演算子
<>
比較演算子
<=>
比較演算子 (PHP 7.0以降)
||
論理演算子
+=
および-=
割り当て演算子
++
および--
インクリメント/デクリメント演算子
.=
割り当て演算子
,
変数宣言
$$
変数
<?=
ショートオープンタグ
[]
Arrays (PHP 5.4以降の短い構文)
$var = []
空の配列...
引数のアンパック (PHP 5.6以降)
**
べき乗 (PHP 5.6以降)
++
インクリメント演算子
--
デクリメント演算子
Example Name Effect
---------------------------------------------------------------------
++$a Pre-increment Increments $a by one, then returns $a.
$a++ Post-increment Returns $a, then increments $a by one.
--$a Pre-decrement Decrements $a by one, then returns $a.
$a-- Post-decrement Returns $a, then decrements $a by one.
これらは変数の前でも後でも構いません。
変数の前に置くと、変数 first に対して増減演算が行われ、結果が返されます。変数の後に置くと、変数は first が返された後、増分/減分操作が行われます。
例えば:
$apples = 10;
for ($i = 0; $i < 10; ++$i) {
echo 'I have ' . $apples-- . " apples. I just ate one.\n";
}
上の場合は++$i
が使われています。 $i++
も同じ結果になります。
事前インクリメントは、変数を実際にインクリメントし、その後結果を「返す」ので、少し速くなります。ポストインクリメントは特別な変数を作成し、そこに最初の変数の値をコピーし、最初の変数が使用された後にのみ、その値を秒の値に置き換えます。
ただし、最初に現在のりんごの数を表示したい場合は$apples--
を使用し、それから1を引いた場合は 次に を使用する必要があります。
PHPでは文字を増やすこともできます。
$i = "a";
while ($i < "c") {
echo $i++;
}
z
に到達すると、aa
が次に続きます。
文字変数はインクリメントすることはできますがデクリメントすることはできず、そのためプレーンのASCII文字(a-zとA-Z)のみがサポートされます。
スタックオーバーフローポスト:
少しは何ですか?ビットは1または0を表します。基本的にはOFF(0)およびON(1)
バイトとは1バイトは8ビットで構成され、バイトの最大値は255です。これは、すべてのビットが設定されることを意味します。バイトの最大値が255なのはなぜでしょうか。
-------------------------------------------
| 1 Byte ( 8 bits ) |
-------------------------------------------
|Place Value | 128| 64| 32| 16| 8| 4| 2| 1|
-------------------------------------------
1バイトのこの表現
1 + 2 + 4 + 8 + 16 + 32 + 64 + 128 = 255(1バイト)
&
$a = 9;
$b = 10;
echo $a & $b;
これは数字8を出力します。なぜでしょうか。テーブルの例を使ってみましょう。
-------------------------------------------
| 1 Byte ( 8 bits ) |
-------------------------------------------
|Place Value | 128| 64| 32| 16| 8| 4| 2| 1|
-------------------------------------------
| $a | 0| 0| 0| 0| 1| 0| 0| 1|
-------------------------------------------
| $b | 0| 0| 0| 0| 1| 0| 1| 0|
-------------------------------------------
| & | 0| 0| 0| 0| 1| 0| 0| 0|
-------------------------------------------
だからあなたはテーブルからそれらが一緒に共有する唯一のビットは8ビットであることがわかります。
2番目の例
$a = 36;
$b = 103;
echo $a & $b; // This would output the number 36.
$a = 00100100
$b = 01100111
2つの共有ビットは32と4です。これらを合計すると36が返されます。
|
$a = 9;
$b = 10;
echo $a | $b;
これは数字11を出力します。なぜでしょうか。
-------------------------------------------
| 1 Byte ( 8 bits ) |
-------------------------------------------
|Place Value | 128| 64| 32| 16| 8| 4| 2| 1|
-------------------------------------------
| $a | 0| 0| 0| 0| 1| 0| 0| 1|
-------------------------------------------
| $b | 0| 0| 0| 0| 1| 0| 1| 0|
-------------------------------------------
| | | 0| 0| 0| 0| 1| 0| 1| 1|
-------------------------------------------
8、2、および1列に3ビットが設定されていることがわかります。それらを合計してください:8 + 2 + 1 = 11。
_()
のように下線文字「_」は gettext()
関数の別名です。
Syntax Name Description
x == y Equality True if x and y have the same key/value pairs
x != y Inequality True if x is not equal to y
x === y Identity True if x and y have the same key/value pairs
in the same order and of the same types
x !== y Non-identity True if x is not identical to y
++ x Pre-increment Increments x by one, then returns x
x ++ Post-increment Returns x, then increments x by one
-- x Pre-decrement Decrements x by one, then returns x
x -- Post-decrement Returns x, then decrements x by one
x and y And True if both x and y are true x=6 y=3
(x < 10 and y > 1) returns true
x && y And True if both x and y are true x=6 y=3
(x < 10 && y > 1) returns true
a . b Concatenation Concatenate two strings: "Hi" . "Ha"
<=>
宇宙船オペレータースペースシップ演算子<=>
は、PHP 7.で追加された最新の比較演算子です。non-associative等号演算子(==
、!=
、===
、!==
)と同じ優先順位を持つ二項演算子。この演算子を使用すると、左オペランドと右オペランドの3者間比較が簡単になります。
演算子の結果は次の整数式になります。
0
両方のオペランドが等しい場合0
より小さい0
より大きい例えば.
1 <=> 1; // 0
1 <=> 2; // -1
2 <=> 1; // 1
この演算子を使用する良い実用的なアプリケーションは、2つの値の3者間比較に基づいてゼロ、負、または正の整数を返すことが期待される比較型コールバックです。 usort
に渡される比較関数はその一例です。
$arr = array(4,2,1,3);
usort($arr, function ($a, $b) {
if ($a < $b) {
return -1;
} elseif ($a > $b) {
return 1;
} else {
return 0;
}
});
$arr = [4,2,1,3];
usort($arr, function ($a, $b) {
return $a <=> $b;
});
魔法の定数 :これらは単なる記号ではなく、このトークンファミリの重要な部分です。使われている場所によって変わる8つの魔法の定数があります。
__LINE__
:ファイルの現在の行番号.
__FILE__
:ファイルのフルパスとファイル名インクルード内で使用されている場合は、インクルードファイルの名前が返されます。 PHP 4.0.2以降、__FILE__
にはシンボリックリンクが解決された絶対パスが常に含まれますが、旧バージョンでは状況によっては相対パスが含まれていました。
__DIR__
:ファイルのディレクトリインクルード内で使用されている場合は、インクルードファイルのディレクトリが返されます。これはdirname(__FILE__)
と同等です。このディレクトリ名は、ルートディレクトリでない限り末尾にスラッシュを付けません。 (PHP 5.3.0で追加されました。)
__FUNCTION__
:関数名(PHP 4.3.0で追加)PHP 5以降、この定数は宣言されたときの関数名を返します(大文字と小文字を区別します)。 PHP 4では、その値は常に小文字です。
__CLASS__
:クラス名(PHP 4.3.0で追加)PHP 5以降、この定数は宣言されたとおりにクラス名を返します(大文字と小文字は区別されます)。 PHP 4では、その値は常に小文字です。クラス名は、それが宣言された名前空間を含みます(例:Foo\Bar
)。 PHP 5.4 __CLASS__
はトレイトでも機能することに注意してください。特性メソッドで使用される場合、__CLASS__
は特性が使用されるクラスの名前です。
__TRAIT__
:特性の名前(PHP 5.4.0で追加)PHP 5.4以降、この定数は宣言されたとおりにトレイトを返します(大文字と小文字を区別します)。特性名には、宣言された名前空間が含まれます(例:Foo\Bar
)。
__METHOD__
:クラスメソッド名(PHP 5.0.0で追加)メソッド名は宣言されたとおりに返されます(大文字と小文字を区別)。
__NAMESPACE__
:現在のネームスペースの名前(大文字と小文字を区別)この定数はコンパイル時に定義されます(PHP 5.3.0で追加)。
instanceof
は、PHP変数が特定のクラスのインスタンス化されたオブジェクトかどうかを判断するために使用されます。
<?php
class mclass { }
class sclass { }
$a = new mclass;
var_dump($a instanceof mclass);
var_dump($a instanceof sclass);
上記の例は出力されます:
bool(true)
bool(false)
理由: 上記の例$a
はmclass
のオブジェクトなので、mclass
のインスタンスではなくsclass
データのみを使用してください
<?php
class pclass { }
class childclass extends pclass { }
$a = new childclass;
var_dump($a instanceof childclass);
var_dump($a instanceof pclass);
上記の例は出力されます:
bool(true)
bool(true)
<?php
class cloneable { }
$a = new cloneable;
$b = clone $a;
var_dump($a instanceof cloneable);
var_dump($b instanceof cloneable);
上記の例は出力されます:
bool(true)
bool(true)
and
演算子とor
演算子は、代入演算子=
よりも優先順位が低くなります。
これは$a = true and false;
が($a = true) and false
と同等であることを意味します。
たいていの場合、あなたはおそらく&&
と||
)を使いたいでしょう。これらはC、JavaあるいはJavaScriptのような言語から知られている方法で振る舞います。
<=>
(PHP 7に追加)<=>
宇宙船オペレーターの例(PHP 7、ソース:PHP Manual):
変数の3者間比較のための整数、浮動小数点数、文字列、配列、オブジェクト。
// Integers
echo 10 <=> 10; // 0
echo 10 <=> 20; // -1
echo 20 <=> 10; // 1
// Floats
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1
// Strings
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1
// Comparison is case-sensitive
echo "B" <=> "a"; // -1
echo "a" <=> "aa"; // -1
echo "zz" <=> "aa"; // 1
// Arrays
echo [] <=> []; // 0
echo [1, 2, 3] <=> [1, 2, 3]; // 0
echo [1, 2, 3] <=> []; // 1
echo [1, 2, 3] <=> [1, 2, 1]; // 1
echo [1, 2, 3] <=> [1, 2, 4]; // -1
// Objects
$a = (object) ["a" => "b"];
$b = (object) ["a" => "b"];
echo $a <=> $b; // 0
$a = (object) ["a" => "b"];
$b = (object) ["a" => "c"];
echo $a <=> $b; // -1
$a = (object) ["a" => "c"];
$b = (object) ["a" => "b"];
echo $a <=> $b; // 1
// only values are compared
$a = (object) ["a" => "b"];
$b = (object) ["b" => "b"];
echo $a <=> $b; // 1
{}
中括弧
そして最後の投稿についてのいくつかの言葉
$x[4] = 'd'; // it works
$x{4} = 'd'; // it works
$echo $x[4]; // it works
$echo $x{4}; // it works
$x[] = 'e'; // it works
$x{} = 'e'; // does not work
$x = [1, 2]; // it works
$x = {1, 2}; // does not work
echo "${x[4]}"; // it works
echo "${x{4}}"; // does not work
echo "{$x[4]}"; // it works
echo "{$x{4}}"; // it works
PHP文字列: PHP文字列は、2つの方法だけでなく4つの方法で指定できます。
1)一重引用符ストリング:
$string = 'This is my string'; // print This is my string
2)二重引用符ストリング:
$str = 'string';
$string = "This is my $str"; // print This is my string
3)Heredoc:
$string = <<<EOD
This is my string
EOD; // print This is my string
4)Nowdoc(PHP 5.3.0以降):
$string = <<<'END_OF_STRING'
This is my string
END_OF_STRING; // print This is my string
NULL合体演算子(??)
isset()
と組み合わせて3項演算子を使用する必要があるという一般的なケースのために、この演算子はPHP 7.0に追加されました。最初のオペランドが存在し、それがNULL
でなければそれを返します。それ以外の場合は2番目のオペランドを返します。
<?php
// Fetches the value of $_GET['user'] and returns 'nobody'
// if it does not exist.
$username = $_GET['user'] ?? 'nobody';
// This is equivalent to:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
// Coalescing can be chained: this will return the first
// defined value out of $_GET['user'], $_POST['user'], and
// 'nobody'.
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';
?>
質問:
=>
はどういう意味ですか?
ANSWER:
=>
は、人間が連想配列の"Key" => "Value"
ペアを分離するために使用することにしたシンボルです。
ELABORATING:
これを理解するには、連想配列とは何かを知る必要があります。従来のプログラマーが配列(PHP)を考えるときに最初に現れるのは、次のようなものです。
$myArray1 = array(2016, "hello", 33);//option 1
$myArray2 = [2016, "hello", 33];//option 2
$myArray3 = [];//option 3
$myArray3[] = 2016;
$myArray3[] = "hello";
$myArray3[] = 33;
コードの後半部分で配列を呼び出したい場合は、次のようにします。
echo $myArray1[1];// output: hello
echo $myArray2[1];// output: hello
echo $myArray3[1];// output: hello
ここまでは順調ですね。ただし、人間としては、配列のインデックス[0]
がyear 2016の値であり、配列のインデックス[1]
がaであることを覚えにくい場合があります。 greetings、および配列のインデックス[2]
は単純な整数値です。その場合の代替案は、連想配列と呼ばれるものを使用することです。連想配列には、Sequential Array(とはいくつかの違いがあります。これは、事前に決められたシーケンスで使用されるインデックスを1ずつインクリメントするため、前のケースと同じです。次の各値に対して)。
違い(順次配列と連想配列の間):
連想配列の宣言中に、配列に入れたいもののvalue
だけでなく、必要なインデックス値(key
と呼ばれる)も入れます。コードの後の部分で配列を呼び出すときに使用します。次の構文が宣言中に使用されます:"key" => "value"
。
連想配列を使用する場合、key
値は配列のインデックス内に配置され、目的のvalue
を取得します。
例えば:
$myArray1 = array(
"Year" => 2016,
"Greetings" => "hello",
"Integer_value" => 33);//option 1
$myArray2 = [
"Year" => 2016,
"Greetings" => "hello",
"Integer_value" => 33];//option 2
$myArray3 = [];//option 3
$myArray3["Year"] = 2016;
$myArray3["Greetings"] = "hello";
$myArray3["Integer_value"] = 33;
そして今、以前と同じ出力を受け取るために、配列インデックスでkey
値が使用されます。
echo $myArray1["Greetings"];// output: hello
echo $myArray2["Greetings"];// output: hello
echo $myArray3["Greetings"];// output: hello
最終ポイント:
したがって、上記の例から、配列のkey
とvalue
の各ペアの間の連想配列の関係を表すために=>
シンボルが使用されていることが簡単にわかります- DURING配列内の値の開始。
質問 :
PHPで「&」とはどういう意味ですか?
慣れればもっと楽になります。(下の例をよく確認してください)
& は通常、$ aと$ bの両方に設定されているビットが設定されていることを確認します。
あなたはこれらの呼び出しがどのように機能するのか気づいたことさえありますか?
error_reporting(E_ERROR | E_WARNING | E_PARSE);
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
error_reporting(E_ALL & ~E_NOTICE);
error_reporting(E_ALL);
だから上記のすべての背後にあるビット演算子とビットのゲームです。
これらの便利なケースの1つは、以下のような簡単な設定です。そのため、1つの整数フィールドに何千ものコンボを格納できます。
ほとんどの人はすでにドキュメントを読んでいますが、これらのビット演算子の実際のユースケースには依存しませんでした。
<?php
class Config {
// our constants must be 1,2,4,8,16,32,64 ....so on
const TYPE_CAT=1;
const TYPE_DOG=2;
const TYPE_LION=4;
const TYPE_RAT=8;
const TYPE_BIRD=16;
const TYPE_ALL=31;
private $config;
public function __construct($config){
$this->config=$config;
if($this->is(Config::TYPE_CAT)){
echo 'cat ';
}
if($this->is(Config::TYPE_DOG)){
echo 'dog ';
}
if($this->is(Config::TYPE_RAT)){
echo 'rat ';
}
if($this->is(Config::TYPE_LION)){
echo 'lion ';
}
if($this->is(Config::TYPE_BIRD)){
echo 'bird ';
}
echo "\n";
}
private function is($value){
return $this->config & $value;
}
}
new Config(Config::TYPE_ALL);
// cat dog rat lion bird
new Config(Config::TYPE_BIRD);
//bird
new Config(Config::TYPE_BIRD | Config::TYPE_DOG);
//dog bird
new Config(Config::TYPE_ALL & ~Config::TYPE_DOG & ~Config::TYPE_CAT);
//rat lion bird
==
は、変数data-typeを考慮して、等価検査なしに使用されます。
===
は、both変数value *と** data-typeの等価性をチェックするために使用されます。
$a = 5
if ($a == 5)
- 真と評価されます
if ($a == '5')
- この両方の値を比較している間phpは内部的にその文字列値を整数に変換してから両方の値を比較するのでtrueに評価されます
if ($a === 5)
- 真と評価されます
if ($a === '5')
- valueは5なのでfalseと評価されますが、この5は整数ではありません。
Null Coalesce Operator php
Isset()と組み合わせて3項を使用する必要があるという一般的な場合のために、null合体演算子(??)がPHP 7に追加されました。最初のオペランドが存在する場合はそれを返し、NULLでない場合は次の例のように2番目のオペランドを返します。
$username = $_GET['user'] ?? 'nobody';
// This is equivalent to:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
演算子の最もわかりにくい名前ではありませんが、PHP 7はかなり便利なnull合体をもたらすので、例を共有したいと思いました。
PHP 5には、値をテストし、それがtrueを返す場合は2番目の要素を返し、そうでない場合は3番目の要素を返す三項演算子が既にあります。
echo $count ? $count : 10; // outputs 10
それが最初のものと同じであるなら、あなたが2番目の要素を飛ばすことを可能にするそれのための速記もあります:echo $ count?:10; // 10も出力
PHP 7では、さらに??を取得します。 2つの疑問符を通常一緒に使用する方法である極端な混乱を示すのではなく、一連の値を連鎖させることができます。左から右へ読んで、存在していてnullではない最初の値が返される値です。
// $a is not set
$b = 16;
echo $a ?? 2; // outputs 2
echo $a ?? $b ?? 7; // outputs 16
この構成は、おそらくユーザー入力または既存の構成から来る1つ以上の値を優先し、その構成が欠落している場合は指定されたデフォルトに安全に戻るために役立ちます。これはちょっとした機能ですが、アプリケーションがPHP 7にアップグレードされたらすぐに使用する予定です。
PHP 7では、戻り型の宣言のサポートが追加されました。引数型宣言と同様に、戻り型宣言は関数から返される値の型を指定します。引数の型宣言に使用できるものと同じ型が、戻り型の宣言に使用できます。
厳密な型指定は、戻り型の宣言にも影響します。デフォルトのweakモードでは、戻り値がまだその型でない場合、戻り値は正しい型に変換されます。ストロングモードでは、戻り値は正しい型でなければなりません、そうでなければ、TypeErrorが投げられます。
PHP 7.1.0以降では、型名の前に疑問符(?)を付けることで、戻り値をNULL可能にすることができます。これは、関数が指定された型またはNULLを返すことを意味します。
<?php
function get_item(): ?string {
if (isset($_GET['item'])) {
return $_GET['item'];
} else {
return null;
}
}
?>