参照—この記号はPHPで何を意味しますか?


4478

これは何ですか?

これは、PHPの構文について時々出てくる質問のコレクションです。これはコミュニティWikiでもあるので、このリストの維持に参加するよう誰もが招待されています。

どうしてこれなの?

以前は、演算子やその他の構文トークンに関する質問を見つけるのが困難でした。¹
主なアイデアは、Stack Overflowの既存の質問へのリンクを用意することです。これにより、PHPマニュアルからコンテンツをコピーするのではなく、それらを参照しやすくなります。

注:2013年1月以降、スタックオーバーフローは特殊文字をサポートしています。検索用語を引用符で囲むだけです。例:[php] "==" vs "==="

ここで何をすればいいですか?

そのような質問をしたために誰かによってここで指摘された場合は、以下の特定の構文を見つけてください。PHPマニュアルへのリンクされたページとリンクされた質問は、おそらくあなたの質問に答えるでしょう。もしそうなら、あなたは答えを賛成することをお勧めします。このリストは、他のユーザーが提供するヘルプの代わりとなるものではありません。

リスト

特定のトークンが以下にリストされていない場合は、パーサートークンのリストで見つけることができます。


& ビット演算子または参照


=& 参考文献


&= ビット演算子


&& 論理演算子


% 算術演算子


!! 論理演算子


@ エラー制御演算子


?: 三項演算子


?? Null Coalesceオペレーター(PHP 7以降)


?string ?int ?array ?bool ?float null可能な戻り型宣言(PHP 7.1以降)


: 制御構造の代替構文三項演算子


:: スコープ解決演算子


\ 名前空間


-> クラスとオブジェクト


=> 配列


^ ビット演算子


>> ビット演算子


<< ビット演算子


<<< ヒアドキュメントまたはナウドキュメント


= 代入演算子


== 比較演算子


=== 比較演算子


!== 比較演算子


!= 比較演算子


<> 比較演算子


<=> 比較演算子(PHP 7.0以降)


| ビット演算子


|| 論理演算子


~ ビット演算子


+ 算術演算子配列演算子


+=および-= 代入演算子


++および-- 増分/減分演算子


.= 代入演算子


. 文字列演算子


, 関数の引数

, 変数宣言


$$ 変数変数


` 実行オペレーター


<?= 短いオープンタグ


[] 配列(PHP 5.4以降の短い構文)


<? タグの開始と終了


... 引数の解凍(PHP 5.6以降)


** べき乗(PHP 5.6以降)


# 1行のシェル形式のコメント


:? null可能な戻り値の型


?-> NullSafeオペレーターコール



36
これは厳密にはPHPではないことを知っていますが、phpDocumentorコメント構文にphpdoc.orgへのリンクを含めるとどうなります/**か?これは一般的に使用されており、検索も不可能ですか?
マイク、

8
角括弧と中括弧を提案できますか?
ajreal 2011年

124
私はこの問題にも頻繁に遭遇しました(特殊文字を検索できない)。そのため、特殊文字を無視しない検索エンジンであるSymbolHoundを作成しましたStackAppsにも投稿しました。
dncrane

1
さて、見出しからなぜこれが?、それは「スタックオーバーフローに既存の質問へのリンクを含めることで、参照しやすくなるためです」という理由からだと思います。
ハーバート

3
今日(11/20/15)stackoverflow.com/questions/33833259/what-is-rscat-in-php「phpの$ rsCatとは」と質問されました(その質問はまだ表示されていて削除されていません) 。不思議なことに、$変数についてのリファレンスはなく、$$変数変数についてのみです。どこかで修正すべきだと思います。
Funk Forty Niner、

回答:


1172

演算子の増分/減分

++ インクリメント演算子

-- デクリメント演算子

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.

これらは変数の前または後に置くことができます。

変数の前に置くと、インクリメント/デクリメント操作が最初に変数に対して行われ、次に結果が返されます。変数の後に置くと、変数が最初に返され、次にインクリメント/デクリメント操作が行われます。

例えば:

$apples = 10;
for ($i = 0; $i < 10; ++$i) {
    echo 'I have ' . $apples-- . " apples. I just ate one.\n";
}

実例

上記の場合++$iは高速なので使用します。$i++同じ結果になります。

事前インクリメントは変数を実際にインクリメントし、その後結果を「返す」ため、少し高速です。ポストインクリメントは特別な変数を作成し、そこに最初の変数の値をコピーし、最初の変数が使用された後にのみ、その値を2番目の変数に置き換えます。

ただし、を使用する必要があります$apples--。最初に現在のリンゴの数を表示し、次にそこから1を引いたいからです。

PHPで文字をインクリメントすることもできます。

$i = "a";
while ($i < "c") {
    echo $i++;
}

一度z到達するaaと次のようになります。

文字変数はインクリメントできますが、デクリメントできません。プレーンASCII文字(azおよびAZ)のみがサポートされています。


スタックオーバーフローの投稿:


9
デクリメンタは文字ではなく数字でのみ機能するという注記の+1
Mark Ba​​ker

163
万が一のために、プリインクリメントが無限に速いという太字の情報を削除してください。これは時期尚早の最適化の絶対最悪の例であり、PHPの学習を始めたばかりであれば、この種の情報が頭に浮かぶはずはありません。
Lotus Notes

14
@ロータス-私はそれを楽しい事実だと思っています。PHPやC ++などの初心者の場合、++ iとi ++が異なる速度で動作するのに十分異なることはかなり奇妙に思われます。魅力的でした。
Peter Ajtai

12
@Peter Ajtaiはい、興味深いですが、投稿を構成した方法から、PHPの主要な事実の1つであるように見せることができます。
Lotus Notes

4
それが私だけかどうかはわかりませんが、アップルの例は少し誤解を招くようです。「私は10個のリンゴを持っています。私はちょうど1つを食べたので、11個のリンゴがあったと思いますが、10個だと言った後、1個を食べるのではなく、1個だけを食べたので、10個を得ました。
さりげない告白

440

ビットごとの演算子

少しは何ですか?ビットは1または0の表現です。基本的にはOFF(0)およびON(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バイト)

理解を深めるためのいくつかの例

「AND」演算子: &

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


6
$ aが255より大きい値を取る場合はどうなりますか?
AycanYaşıt2013

@AycanYaşıtほとんどのオペレーティングシステムは32ビットおよび64ビットシステムを使用しています。つまり、制限は255(8ビット)をはるかに超えています。
AlbertSamuel、2016年

@AycanYaşıt実際には、最新の64ビットプラットフォームのメモリでは最小の整数でも64ビット(8バイト)であるため、ここでの1バイト長の表現は正確ではありません。
魁夷

なぜand &ある 0 0 0 0 1 0 0 0or |ありますか 0 0 0 0 1 0 1 1
Vir

285

<=> 宇宙船オペレーター

PHP 7で追加

宇宙船操作者が <=>それであるPHP 7に加え、最新の比較演算子である非結合等価演算子と同じ優先順位を持つバイナリ演算子(==!====!==)。この演算子を使用すると、左側のオペランドと右側のオペランドを簡単に3者間で比較できます。

演算子は、次の整数式になります。

  • 0 両方のオペランドが等しい場合
  • 未満の0時に左オペランドレス右辺のオペランドより
  • より大きく0左オペランド右オペランドよりも大きいです

例えば

1 <=> 1; // 0
1 <=> 2; // -1
2 <=> 1; // 1

この演算子を使用する実用的なアプリケーションは、2つの値の3者間比較に基づいてゼロ、負、または正の整数を返すことが期待される比較タイプのコールバックです。渡される比較関数usortは、そのような例の1つです。

PHP 7以前は、次のように記述します...

$arr = [4,2,1,3];

usort($arr, function ($a, $b) {
    if ($a < $b) {
        return -1;
    } elseif ($a > $b) {
        return 1;
    } else {
        return 0;
    }
});

PHP 7以降、次のように記述できます...

$arr = [4,2,1,3];

usort($arr, function ($a, $b) {
    return $a <=> $b;
});

21
$a <=> $b違いがわからない$a - $b
rev

38
@AcidShout $a - $bは数値では機能しますが、文字列、オブジェクト、配列では機能しません。
mcrumley

44
@mcrumleyいいえ、それよりも悪いです。一般に$a - $b、数値に対しては機能しません。整数に対してのみ機能しますusortコンパレーター関数の戻り値をintにキャストするため、整数以外の数値では機能しません。つまり、0.5は0にキャストされます。つまり、4や4.6など、1未満の差を持つ2つの数値は、比較関数の最初の引数として渡されると、誤って等しいと比較されます。
Mark Amery 2015年

5
@MarkAmery移行ガイドは、文書化されたオペレーターの動作ではありません。そのためには、そのphp.net/language.operators.comparisonのマニュアルの言語演算子セクションを確認する必要があります。これの背後にある実際の動作は、文字列に対してstrcmpを実行する場合など、APIのさまざまな比較関数に依存します。すべてのケースで実際の戻り値を保証することはできません。確かに、ほとんどの場合1、0、または-1ですが、libcのstrcmpをラップする場合など、保証できない場合は、基礎となる仕様と同じ定義済みの動作を提供して安全を確保します
Sherif

9
@MarkAmeryここでのポイントは、人々が未定義の動作に依存できるようにすることではありません。誰かが正確に1、0、または-1ではない値を取得する1つのケースでは、誰かが言語に問題があると考えてバグレポートを提出します。これは、我々は我々が保証することができ、すべてがその値がされるであることを文書化する理由であるより小さいより大きい、または等しく 0、必ずしも1、0、-1。
シェリフ2016年


273
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
x or y     Or              True if any of x or y are true x=6 y=3
                           (x < 10 or y > 10) returns true 
x || y     Or              True if any of x or y are true x=6 y=3
                           (x < 3 || y > 1) returns true
a . b     Concatenation    Concatenate two strings: "Hi" . "Ha"

239

マジック定数:これらは単なるシンボルではなく、このトークンファミリの重要な部分です。それらが使用される場所に応じて変化する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で追加)。

ソース


150

タイプ演算子

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)

7
上記は「インターフェース」でも機能します。これは、特定のインターフェースが使用可能であることを確認するのに役立ちます。
ライアンヴィンセント

133

PHP演算子の概要:


論理演算子:

  • $ a && $ b: $ aと$ bの両方がTRUEの場合はTRUE。
  • $ a || $ b:$ aまたは$ bのいずれかがTRUEの場合はTRUE。
  • $ a xor $ b: $ aまたは$ bのいずれかがTRUEの場合はTRUE、両方はTRUE。
  • !$ a: $ aがTRUEでない場合はTRUE。
  • $ aと$ b:$ aと$ bの両方がTRUEの場合はTRUE。
  • $ aまたは$ b:$ aまたは$ bのいずれかがTRUEの場合はTRUE。

比較演算子:

  • $ a == $ b:タイプジャグリング後の$ aが$ bと等しい場合はTRUE。
  • $ a === $ b:$ aが$ bと等しく、同じタイプである場合はTRUE。
  • $ a!= $ b:タイプジャグリング後に$ aが$ bと等しくない場合はTRUE。
  • $ a <> $ b:タイプジャグリング後に$ aが$ bと等しくない場合はTRUE。
  • $ a!== $ b:$ aが$ bと等しくない、または同じタイプでない場合はTRUE。
  • $ a <$ b:$ aが$ bより小さい場合はTRUE。
  • $ a> $ b:$ aが$ bより大きい場合はTRUE。
  • $ a <= $ b$ aが$ b以下の場合はTRUE。
  • $ a> = $ b$ aが$ b以上の場合はTRUE。
  • $ a <=> $ b$ aがそれぞれ$ bより小さい、等しい、または大きい場合、ゼロより小さい、等しい、または大きい整数。PHP 7以降で使用できます。
  • $ a?$ b:$ c:$ aが$ bを返す場合、それ以外は$ c(3項演算子)を返します
  • $ a ?? $ c$ aと同じですか?$ a:$ c(nullの合体演算子 -PHP> = 7が必要)

算術演算子:

  • -$ a$ 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乗した結果(PHP 5.6で導入)

増分/減分演算子:

  • ++ $ a:$ aを1つ増やし、$ aを返します。
  • $ a ++:$ aを返し、$ aを1つ増やします。
  • -$ a:$ aを1つ減らし、$ aを返します。
  • $ a --:$ aを返し、$ aを1つ減らします。

ビット演算子:

  • $ a&$ b:$ aと$ bの両方に設定されているビットが設定されます。
  • $ a | $ b$ aまたは$ bのいずれかに設定されているビットが設定されます。
  • $ a ^ $ b$ aまたは$ bで設定されているが両方では設定されていないビット。
  • 〜$ a$ aに設定されているビットは設定されず、その逆も同様です。
  • $ a << $ b$ a $ bステップのビットを左にシフトします(各ステップは「2で乗算」を意味します)
  • $ a >> $ b$ a $ bステップのビットを右にシフトします(各ステップは「2で除算」を意味します)

文字列演算子:

  • $ a。$ b$ aと$ bの連結。

配列演算子:

  • $ a + $ b:$ aと$ bの和。
  • $ a == $ b:$ aと$ bが同じキー/値ペアを持っている場合はTRUE。
  • $ a === $ b:$ aと$ bが同じキー/値のペアを同じ順序で同じ型で持つ場合はTRUE。
  • $ a!= $ b:$ aが$ bと等しくない場合はTRUE。
  • $ a <> $ b:$ aが$ bと等しくない場合はTRUE。
  • $ a!== $ b:$ aが$ bと同一でない場合はTRUE。

代入演算子:

  • $ a = $ b$ bの値が$ aに割り当てられます
  • $ 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 = $ a >> $ bと同じ

注意

and演算子とor演算子は、代入演算子よりも優先順位が低くなり=ます。

これは、$a = true and false;と同等($a = true) and falseです。

ほとんどの場合、おそらくCやJava、JavaScriptなどの言語で知られている方法で動作する&&and を使用することになり||ます。


1
にエラーがあります$a ?? $c。これはと同じですが$a ? $a : $c、3項演算子は値がtrueかどうかをチェックします。一方、nullの合体はnull値をチェックします。したがって、$ aが0の場合、0になります(0はnullではない)、例えばあなたが持っている場合:$a=0; $c=5;その後、$a?$a:$c5を返し、$a??$c0を返します。
stramin

104

宇宙船オペレーター<=>(PHP 7で追加)

<=>宇宙船オペレーターの例(PHP 7、出典:PHPマニュアル):

変数の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

1
php.net/manual/en/language.operators.comparison.phpのリファレンスを確認してください
rajangupta

74

{} 中括弧

そして最後の投稿について

$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

4
プロパティ名の{''}表記。echo $ movies-> movie-> {'great-lines'}-> line; SimpleXMLElementのデータにアクセスするために使用できます。多分それは他の場合にも使用することができます。php.net/manual/en/simplexml.examples-basic.php
Andrei

68

ヌル合体演算子(??)

この演算子は、PHPとともに三項演算子を使用する必要があるという一般的なケースのためにPHP 7.0で追加されましたisset()。存在していない場合は、最初のオペランドを返します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';
?>

64

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)ヒアドキュメント:

$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

@ Rizier123:「ヒアドキュメントはクラスプロパティの初期化には使用できません。PHP5.3以降、この制限は変数を含むヒアドキュメントに対してのみ有効です。」とはどういう意味ですか?
PHPFan 2017年

48

質問:

どういう=>意味ですか?


回答:

=>人間"Key" => "Value"が連想配列のペアを分離するために使用することを決めたシンボルです。

エラボレーション:

これを理解するには、連想配列とは何かを知る必要があります。従来のプログラマーが(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]配列のの値である年間 2016、インデックス[1]配列のはある挨拶、そしてインデックス[2]配列のは簡単である整数値。もう1つの方法は、連想配列と呼ばれるものを使用することです。連想配列は、順次配列とはいくつかの違いがあります (これは、前のケースでは、所定のシーケンスで使用されるインデックスを、後続の値ごとに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

最終ポイント:

したがって、上記の例から、配列内の値の開始中に、シンボルが配列内=>keyvalueペアのそれぞれの間の連想配列の関係を表すために使用されていることが簡単にわかります。


36

質問

PHPで「&」は何を意味していますか?

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つは、以下のような簡単な設定です。そのため、単一の整数フィールドに数千のコンボを格納できます。

ほとんどの人は既にドキュメントを読んでいますが、これらのビット単位演算子の実際の使用例に依存していません。

例あなたが好きになること

<?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

30

==変数のデータ型考慮せずに 等しいかどうかをチェックするために使用されます

===数値データ型の両方の等価性をチェックするために使用されます

$a = 5

  1. if ($a == 5) -trueと評価されます

  2. if ($a == '5') -これはtrueと評価されます。これは、この両方の値を比較するときに、PHPが内部的にその文字列値を整数に変換してから、両方の値を比較するためです。

  3. if ($a === 5) -trueと評価されます

  4. if ($a === '5') -値が5であるためfalseと評価されますが、この値5は整数ではありません。


27

ヌルコアレス演算子「??」(PHP 7で追加)

オペレーターにとって最もわかりやすい名前ではありませんが、PHP 7はかなり便利なnull合体を持っているので、例を挙げましょう。

PHP 5には、値をテストする3項演算子が既にあり、2番目の要素がtrueを返す場合は3番目の要素を返し、そうでない場合は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つ以上の値を優先し、その構成が欠落している場合に特定のデフォルトに安全にフォールバックするのに役立ちます。これはちょっとした機能の1つですが、アプリケーションがPHP 7にアップグレードされるとすぐに使用することがわかっています。


12

null可能な戻り型宣言

PHP 7では、戻り型宣言のサポートが追加されています。引数の型宣言と同様に、戻り値の型宣言は、関数から返される値の型を指定します。戻り値の型宣言には、引数の型宣言と同じ型を使用できます。

厳密な型指定は、戻り型の宣言にも影響します。デフォルトのウィークモードでは、戻り値はまだ正しい型になっていない場合、正しい型に強制変換されます。ストロングモードでは、戻り値は正しいタイプである必要があります。そうでない場合、TypeErrorがスローされます。

PHP 7.1.0以降では、型名の前に疑問符(?)を付けることで、戻り値をnull可能としてマークできます。これは、関数が指定されたタイプまたはNULLを返すことを意味します。

<?php
function get_item(): ?string {
    if (isset($_GET['item'])) {
        return $_GET['item'];
    } else {
        return null;
    }
}
?>

ソース


7

スプラット演算子としての3つのDOTS(...)(PHP 5.6以降)

PHPには、 "..."(3つのドット)という演算子があり、Splat演算子と呼ばれています。これは、関数内の任意の数のパラメーターを渡すために使用され、このタイプの関数はVariadic関数と呼ばれます。「...」(3つのドット)の使用例を見てみましょう。

例1:

<?php
function calculateNumbers(...$params){
    $total = 0;
    foreach($params as $v){
        $total = $total + $v;
    }
    return $total;
}

echo calculateNumbers(10, 20, 30, 40, 50);

//Output 150
?>

calculateNumbers()関数の各引数は、 "…"を使用するときに$ paramsを配列として渡します。

"…"演算子を使用するには、さまざまな方法があります。以下にいくつかの例を示します。

例2:

<?php
function calculateNumbers($no1, $no2, $no3, $no4, $no5){
    $total = $no1 + $no2 + $no3 + $no4 + $no5;
    return $total;
}

$numbers = array(10, 20, 30, 40, 50);
echo calculateNumbers(...$numbers);

//Output 150
?>

例3:

<?php
function calculateNumbers(...$params){
    $total = 0;
    foreach($params as $v){
        $total = $total + $v;
    }
    return $total;
}
$no1 = 70;
$numbers = array(10, 20, 30, 40, 50);
echo calculateNumbers($no1, ...$numbers);

//Output 220
?>

例4:

<?php
function calculateNumbers(...$params){
    $total = 0;
    foreach($params as $v){
        $total = $total + $v;
    }
    return $total;
}

$numbers1 = array(10, 20, 30, 40, 50);
$numbers2 = array(100, 200, 300, 400, 500);
echo calculateNumbers(...$numbers1, ...$numbers2);

//Output 1650

?>

0

?-> NullSafeオペレーター

現時点では、これは単なる提案であり、ここで見つけることができます。これはNullSafe Operatornull関数を呼び出したり、値を取得しようとした場合に返されますnull...例

$objDrive = null;
$drive = $objDrive?->func?->getDriver()?->value; //return null
$drive = $objDrive->func->getDriver()->value; // Error: Trying to get property 'func' of non-object

これを追加するのはかなり時期尚早だと感じ、誰もこのコードをライブコードで見ることはありません。詳細が確定するまで待って、適切に文書化することをお勧めします。
IMSoP

すでに質問を受けています。:/提案が失敗した場合、これが維持する価値があるかどうかを判断できます。
ジョンコンデ

@JohnCondeほら?これが私が言っていたことです...
Berto99

@JohnConde彼らは架空のプログラミング言語について尋ねているので、私はそれらをトピック外として閉じたくなります。または「この質問はタイムラインの別の部分に属しています。タイムマシンの設定を確認してください」;)
IMSoP

笑思考が私の心を越えました。これが将来の訪問者に価値を提供するかどうかを自問しましたが、今のところ、答えは「はい」です。しかし、
状況

0

NullSafeオペレーター "?->"(おそらく)php8以降

現時点では、これは単なる提案ですリンクの説明をここ入力してください?->これはNullSafe Operatornull関数を呼び出したり、値を取得しようとした場合に返されますnull...

例:

<?php
$obj = null;
$obj = $obj?->attr; //return null
$obj = ?->funct(); // return null
$obj = $objDrive->attr; // Error: Trying to get property 'attr' of non-object
?>

これを追加するのはかなり時期尚早だと感じ、誰もこのコードをライブコードで見ることはありません。詳細が確定するまで待って、適切に文書化することをお勧めします。
IMSoP

@IMSoP一緒にいますが、ここに招待されましたstackoverflow.com/questions/62178354/… ...
Berto99

これについて2つの答えが得られたようです。個人的には、答えようとするのではなく、他の質問を閉じるために投票しただけです。現在、そのようなオペレーターはいないからです。
IMSoP

@IMSoP StackOverflowには、C ++ Proposalに関する多くの質問があり、それらはクローズされていません。それにもかかわらず、今のところこの演算子をここに投稿しないことについて、私はあなたと一緒にいます
Berto99

私はC ++プロセスについてあまり知らないので、提案について話し合うのが妥当である場合、そして公平に言えば、これはワークアウトの変更を成功させる可能性がかなり高いようですが、一般的に、PHPに提案されていない機能がたくさんあります。言語、そしてユーザーが参照リストでそれらすべてに出くわすことはかなり混乱するでしょう。そうは言っても、私は部分的にはここで不機嫌そうな老人になっています:P
IMSoP
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.