サーチ…


構文

  • $変数= '値'; //一般変数を代入する
  • $オブジェクト - >プロパティ= '値'; //オブジェクトプロパティを代入する
  • ClassName :: $プロパティ= '値'; //静的クラスプロパティを割り当てます。
  • $ array [0] = 'value'; //配列のインデックスに値を代入する
  • $ array [] = '値'; //配列の最後にアイテムをプッシュする
  • $ array ['key'] = '値'; //配列の値を代入する
  • echo $ variable; //可変値をエコー(印刷)する
  • some_function($変数); //変数を関数パラメータとして使用する
  • unset($ variable); //変数を設定解除する
  • $$変数= '値'; //変数変数に代入する
  • isset($ variable); //変数が設定されているかどうかを確認する
  • 空($変数); //変数が空であるかどうかをチェックする

備考

型チェック

変数や型に関するドキュメンテーションの中には、PHPが静的型付けを使用していないと述べているものがあります。これは正しいですが、PHPは、関数/メソッドのパラメータと戻り値(特にPHP 7の場合)に関しては、型チェックを行います。

次のように、PHP 7の型ヒントを使用して、パラメータと戻り値の型チェックを実行することができます。

<?php

/**
 * Juggle numbers and return true if juggling was
 * a great success.
 */
function numberJuggling(int $a, int $b) : bool
{
    $sum = $a + $b;

    return $sum % 2 === 0;
}

注意:整数とブール値に対するPHPのgettype()はそれぞれintegerbooleanです。しかし、このような変数の型ヒントの場合、 intboolを使う必要があります。さもなければ、PHPはあなたに構文エラーを与えませんが、 integerboolean クラスが渡されることを期待します。

上記の例は、数値以外の値が$aまたは$bいずれかのパラメータとして指定されている場合、および関数がtrueまたはfalse以外の何かを返す場合にエラーをスローします。あなたがfloat値を与えることができるのように上記の例では、「緩い」である$a$b 。厳密な型を強制する場合は、浮動小数点数ではなく整数のみを入力できるので、PHPファイルの先頭に次の行を追加します。

<?php
declare('strict_types=1');

PHP 7の関数とメソッドの前に、次の型の型ヒントが可能になりました。

  • callable (呼び出し可能な関数またはメソッド)
  • array (他の配列も含むことができる任意のタイプの配列)
  • インターフェイス(完全修飾されたクラス名またはFQDN)
  • クラス(FQDN)

参照: 変数の値の出力

名前で動的に変数にアクセスする(変数変数)

変数は、動的変数名を介してアクセスできます。変数の名前は別の変数に格納することができ、動的にアクセスすることができます。そのような変数は可変変数として知られている。

変数を変数変数に変換するには、変数の前に余分な$ putを入れます。

$variableName = 'foo';
$foo = 'bar';

// The following are all equivalent, and all output "bar":
echo $foo;
echo ${$variableName};
echo $$variableName;

//similarly,
$variableName  = 'foo';
$$variableName = 'bar';

// The following statements will also output 'bar'
echo $foo; 
echo $$variableName; 
echo ${$variableName};

変数変数は、関数/メソッド呼び出しをマッピングするのに便利です:

function add($a, $b) {
    return $a + $b;
}

$funcName = 'add';

echo $funcName(1, 2); // outputs 3

これはPHPクラスで特に役立ちます:

class myClass {
    public function __construct() {
        $functionName = 'doSomething';
        $this->$functionName('Hello World');
    }

    private function doSomething($string) {
        echo $string; // Outputs "Hello World"
    }
}

$variableName{}間に置くことは可能ですが必須ではありません:

${$variableName} = $value;

次の例は、同等で出力 "baz"です。

$fooBar = 'baz';
$varPrefix = 'foo';

echo $fooBar;               // Outputs "baz"
echo ${$varPrefix . 'Bar'}; // Also outputs "baz"

{}を使うことは、変数の名前そのものが式の場合にのみ必須です:

${$variableNamePart1 . $variableNamePart2} = $value;

それにもかかわらず、いつも{}使用することをお勧めします。

これは推奨されていませんが、この動作を連鎖させることは可能です:

$$$$$$$$DoNotTryThisAtHomeKids = $value;

変数変数の過剰使用は、多くの開発者にとって悪い習慣とみなされることに注意することが重要です。現代のIDEによる静的解析には適していないので、多くの変数変数(または動的メソッド呼び出し)を持つ大きなコードベースは、すぐに維持することが困難になります。


PHP5とPHP7の違い

{}()使うもう一つの理由は、PHP5とPHP7が動的変数を扱う方法が少し違うことです。その結果、結果が異なることがあります。

PHP5では、動的変数、プロパティ、およびメソッドが厳密に左から右の順序で評価されるようになりました。以下の例は、評価の順序がどのように変化したかを示しています。

ケース1: $$foo['bar']['baz']

  • PHP5の解釈: ${$foo['bar']['baz']}
  • PHP7の解釈: ($$foo)['bar']['baz']

ケース2: $foo->$bar['baz']

  • PHP5の解釈: $foo->{$bar['baz']}
  • PHP7の解釈: ($foo->$bar)['baz'] foo- ($foo->$bar)['baz']

ケース3: $foo->$bar['baz']()

  • PHP5の解釈: $foo->{$bar['baz']}()
  • PHP7の解釈: ($foo->$bar)['baz']() foo- ($foo->$bar)['baz']()

ケース4: Foo::$bar['baz']()

  • PHP5の解釈: Foo::{$bar['baz']}()
  • PHP7の解釈: (Foo::$bar)['baz']()

データ型

異なる目的のために異なるデータ型があります。 PHPには明示的な型定義はありませんが、変数の型は割り当てられた型の型によって、または型付けされる型によって決まります。これは型の簡単な概要です。詳細なドキュメントと例は、PHPの型のトピックを参照してください。

PHPには、null、ブール値、整数、浮動小数点数、文字列、オブジェクト、リソース、配列のデータ型があります。

ヌル

Nullは任意の変数に割り当てることができます。これは値のない変数を表します。

$foo = null;

これは変数を無効にし、呼び出されるとその値は未定義または無効になります。変数はメモリから消去され、ガベージコレクタによって削除されます。

ブール

これは、2つの可能な値しか持たない最も単純な型です。

$foo = true;
$bar = false;

ブール値を使ってコードの流れを制御することができます。

$foo = true;

if ($foo) {
    echo "true";
} else {
    echo "false";
}

整数

整数は正または負の整数です。それは任意の数のベースで使用することができます。整数のサイズは、プラットフォームに依存します。 PHPは符号なし整数をサポートしていません。

$foo = -3;  // negative
$foo = 0;   // zero (can also be null or false (as boolean)
$foo = 123; // positive decimal
$bar = 0123; // octal = 83 decimal
$bar = 0xAB; // hexadecimal = 171 decimal
$bar = 0b1010; // binary = 10 decimal
var_dump(0123, 0xAB, 0b1010); // output: int(83) int(171) int(10)

浮く

浮動小数点数、「倍精度」または単に「浮動小数点数」と呼ばれるものは10進数です。

$foo = 1.23;
$foo = 10.0;
$bar = -INF;
$bar = NAN;

アレイ

配列は値のリストに似ています。最も単純な形式の配列は整数でインデックスされ、インデックスによって順序付けられ、最初の要素はインデックス0に置かれます。

$foo = array(1, 2, 3); // An array of integers
$bar = ["A", true, 123 => 5]; // Short array syntax, PHP 5.4+

echo $bar[0];    // Returns "A"
echo $bar[1];    // Returns true
echo $bar[123];  // Returns 5
echo $bar[1234]; // Returns null

配列は、整数インデックス以外のキーを値に関連付けることもできます。 PHPでは、すべての配列は背後で連想配列ですが、 '連想配列'を明示的に参照するときは、通常、整数ではない1つ以上のキーを含むものを意味します。

$array = array();
$array["foo"] = "bar";
$array["baz"] = "quux";
$array[42] = "hello";
echo $array["foo"]; // Outputs "bar"
echo $array["bar"]; // Outputs "quux"
echo $array[42]; // Outputs "hello"

文字列

文字列は文字の配列のようなものです。

$foo = "bar";

配列のように、文字列をインデックス化して個々の文字を返すことができます:

$foo = "bar";
echo $foo[0]; // Prints 'b', the first character of the string in $foo.

オブジェクト

オブジェクトはクラスのインスタンスです。その変数とメソッドは->演算子でアクセスできます。

$foo = new stdClass(); // create new object of class stdClass, which a predefined, empty class
$foo->bar = "baz";
echo $foo->bar; // Outputs "baz"
// Or we can cast an array to an object:
$quux = (object) ["foo" => "bar"];
echo $quux->foo; // This outputs "bar".

リソース

リソース変数には、開いているファイル、データベース接続、ストリーム、イメージキャンバス領域などの特別なハンドルがあります( マニュアルに記載されています )。

$fp = fopen('file.ext', 'r'); // fopen() is the function to open a file on disk as a resource.
var_dump($fp); // output: resource(2) of type (stream)

変数の型を文字列として取得するには、 gettype()関数を使用します。

echo gettype(1); // outputs "integer"
echo gettype(true); // "boolean"

グローバル変数のベストプラクティス

この問題を次の疑似コードで説明することができます

function foo() {
    global $bob;
    $bob->doSomething();
}

あなたの最初の質問は明白なものです

$bobどこから来たのですか?

混乱していますか?良い。あなたは、グローバルが混乱していて、 悪い習慣を考えている理由を学んだだけです。

これが本当のプログラムだったなら、あなたの楽しみの次のビットは$bobすべてのインスタンスを追跡し、あなたが正しいものを見つけることを願っています( $bobがどこでも使用されれば悪化します)。さらに悪いことに、他の誰かが$bobを定義している(またはあなたがその変数を忘れて再利用した)場合、コードが壊れる可能性があります(上記のコード例では、オブジェクトが間違っているか、オブジェクトがまったくないと致命的なエラーが発生します)。

事実上すべてのPHPプログラムinclude('file.php');ようなコードを使用しますinclude('file.php');このようなコードをメンテナンスすると、追加するファイルが増えるほど指数関数的に難しくなります。

また、これにより、アプリケーションをテストする作業が非常に困難になります。データベース接続を保持するためにグローバル変数を使用するとします。

$dbConnector = new DBConnector(...);

function doSomething() {
    global $dbConnector;
    $dbConnector->execute("...");
}

この関数を単体テストするには、グローバル$dbConnector変数をオーバーライドしてテストを実行し、それを元の値にリセットする必要があります。これはバグが非常に発生しやすくなります。

/**
 * @test
 */
function testSomething() {
     global $dbConnector;

     $bkp = $dbConnector; // Make backup
     $dbConnector = Mock::create('DBConnector'); // Override

     assertTrue(foo());

     $dbConnector = $bkp; // Restore
}

グローバルを避けるにはどうすればいいですか?

グローバルを避ける最善の方法は、 Dependency Injectionという哲学です。ここで、必要なツールを関数またはクラスに渡します。

function foo(\Bar $bob) {
    $bob->doSomething();
}

これは理解して維持する方がずっと簡単です。通話者がそれを知る責任があるので(それは私たちが知る必要があるものを私たちに渡しているので) $bobが設定された場所を推測することはありません。さらに良いことに、 型宣言を使って渡されるものを制限することができます。

だから我々はことを知っている$bobのインスタンスのいずれかであるBarクラス、またはの子のインスタンスBar我々は、そのクラスのメソッドを使用することができます知っている意味します。標準のオートローダー(PHP 5.3以降)と組み合わせることで、 Barが定義されている場所を追跡することができます。 PHP 7.0以降には拡張型宣言があり、スカラー型( intstring )も使用できます。

4.1

超大域変数

PHPのスーパーグローバルはあらかじめ定義された変数で、常に利用可能で、スクリプト全体のどのスコープからでもアクセスできます。

グローバル$変数を行う必要はありません。関数/メソッド、クラス、またはファイル内でそれらにアクセスします。

これらのPHPの大域変数は以下の通りです。

すべての定義済み変数の取得

get_defined_vars()は、関数が呼び出されるスコープで定義された変数の名前と値をすべて含む配列を返します。データを印刷する場合は、 print_rvar_dumpような人間が読めるデータを出力するための標準関数を使用することができます。

var_dump(get_defined_vars());

注意 :この関数は、通常、 $_POST $_GET$_POST$_COOKIE$_FILES 4つのスーパーグローバルのみを返します。他のスーパーグローバルは、コード内のどこかで使用された場合にのみ返されます。これは、 auto_globals_jitディレクティブがデフォルトで有効になっているためです。有効にすると、 $_SERVERおよび$_ENV変数は、スクリプトの起動時ではなく、最初に使用されたとき(Just In Time)に作成されます。これらの変数がスクリプト内で使用されていない場合、このディレクティブをオンにするとパフォーマンスが向上します。

初期化されていない変数のデフォルト値

ただし、PHPでは必須ではありませんが、変数を初期化することは非常に良い方法です。初期化されていない変数は、使用されるコンテキストに応じて型のデフォルト値を持ちます。

設定解除され、参照されない

var_dump($unset_var); // outputs NULL

ブール

echo($unset_bool ? "true\n" : "false\n"); // outputs 'false' 

文字列

$unset_str .= 'abc';
var_dump($unset_str); // outputs 'string(3) "abc"'

整数

$unset_int += 25; // 0 + 25 => 25
var_dump($unset_int); // outputs 'int(25)'

フロート/ダブル

$unset_float += 1.25;
var_dump($unset_float); // outputs 'float(1.25)'

アレイ

$unset_arr[3] = "def";
var_dump($unset_arr); //  outputs array(1) {  [3]=>  string(3) "def" }

オブジェクト

$unset_obj->foo = 'bar';
var_dump($unset_obj); // Outputs: object(stdClass)#1 (1) {  ["foo"]=>  string(3) "bar" }

初期化されていない変数のデフォルト値に依存することは、同じ変数名を使用する別のファイルに1つのファイルを含める場合に問題になります。

変数値の真理と同一の演算子

PHPでは、変数値には「真実性」が関連付けられているため、ブール値でない値でもtrueまたはfalse 。これにより、任意の変数を条件ブロックで使用することができます。

if ($var == true) { /* explicit version */ }
if ($var) { /* $var == true is implicit */ }

さまざまなタイプの変数値に対するいくつかの基本的な規則があります:

  • 非ゼロ長の文字列がに等しいtrueのみなどwhitepace含む文字列を含みます' '
  • 空の文字列''falseと同じです。
$var = '';
$var_is_true = ($var == true); // false
$var_is_false = ($var == false); // true

$var = '   ';
$var_is_true = ($var == true); // true
$var_is_false = ($var == false); // false
  • ゼロがゼロでない場合、 整数true等しく、ゼロはfalse等しくなりfalse
$var = -1;
$var_is_true = ($var == true); // true
$var = 99;
$var_is_true = ($var == true); // true
$var = 0;
$var_is_true = ($var == true); // false
  • nullfalse等しい
$var = null;
$var_is_true = ($var == true); // false
$var_is_false = ($var == false); // true
  • 空の文字列''と文字列ゼロ'0'falseと同じです。
$var = '';
$var_is_true = ($var == true); // false
$var_is_false = ($var == false); // true

$var = '0';
$var_is_true = ($var == true); // false
$var_is_false = ($var == false); // true
  • 浮動小数点の値は、ゼロ以外の場合はtrue 、ゼロの場合はfalse
    • NAN (PHPのNot-a-Number)はtrue 、つまりNAN == truetrueです。これは、 NANゼロ以外の浮動小数点値であるためです。
    • ゼロ値には、IEEE 754で定義されている+0と-0の両方が含まれますfloatval('0') == floatval('-0')では、倍精度浮動小数点で+0と-0を区別しません。つまり、 floatval('0') == floatval('-0')trueです。
      • 実際、 floatval('0') === floatval('-0')
      • さらに、 floatval('0') == falseおよびfloatval('-0') == false両方floatval('0') == false
$var = NAN;
$var_is_true = ($var == true); // true
$var_is_false = ($var == false); // false

$var = floatval('-0');
$var_is_true = ($var == true); // false
$var_is_false = ($var == false); // true

$var = floatval('0') == floatval('-0');
$var_is_true = ($var == true); // false
$var_is_false = ($var == false); // true

同一のオペレータ

比較演算子のPHPドキュメントには、同じ演算子があります=== 。この演算子を使用すると、変数が参照値と同じかどうかを確認できます。

$var = null;
$var_is_null = $var === null; // true
$var_is_true = $var === true; // false
$var_is_false = $var === false; // false

これに対応する演算子は同じではありません !==

$var = null;
$var_is_null = $var !== null; // false
$var_is_true = $var !== true; // true
$var_is_false = $var !== false; // true

同じ演算子をis_null()ような言語関数の代わりに使うことができます。

strpos()使用してケースを使用する

strpos($haystack, $needle)言語関数は位置のインデックス検索するために使用され$needleで起こる$haystack 、またはそれがすべてで発生するかどうかを。 strpos()関数は大文字と小文字を区別します。大文字と小文字を区別しないfindが必要な場合は、 stripos($haystack, $needle)

strposstripos関数には3番目のパラメータoffset (int)も含まれています。これを指定すると、文字列の先頭から数えた文字数で検索が開始されます。 strrposおよびstrriposとは異なり、オフセットは負であってはなりません

この関数は以下を返すことができます:

  • $haystack先頭に$needleがある場合$needle 0
  • $haystack $needleが最初以外のどこかにある場合にインデックスを指定する非ゼロの整数。
  • $needle$haystackどこに見つからない場合はfalse $haystackます。

両方なので0false truthiness持っているfalse PHPでなく、ために明確な状況を表すstrpos()それらを区別して、同一の演算子を使用することが重要です===のために正確に探すためにfalseに相当だけでなく、値false

$idx = substr($haystack, $needle);
if ($idx === false) 
{
    // logic for when $needle not found in $haystack
} 
else
{
    // logic for when $needle found in $haystack
}

あるいは、 同一でない演算子を使用する:

$idx = substr($haystack, $needle);
if ($idx !== false) 
{
    // logic for when $needle found in $haystack
} 
else
{
    // logic for when $needle not found in $haystack
}


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow