$arr = array(); // is this line needed?
$arr[] = 5;
最初の行がなくても機能することは知っていますが、実際には含まれていることがよくあります。
理由は何ですか?それなしでは安全ではありませんか?
私はあなたもこれを行うことができることを知っています:
$arr = array(5);
しかし、私はあなたがアイテムを一つずつ追加する必要がある場合について話している。
$arr = array(); // is this line needed?
$arr[] = 5;
最初の行がなくても機能することは知っていますが、実際には含まれていることがよくあります。
理由は何ですか?それなしでは安全ではありませんか?
私はあなたもこれを行うことができることを知っています:
$arr = array(5);
しかし、私はあなたがアイテムを一つずつ追加する必要がある場合について話している。
回答:
新しい配列を宣言せず、配列を作成/更新するデータが何らかの理由で失敗した場合、その配列を使用しようとする将来のコードは E_FATAL
存在しないため、配列。
たとえばforeach()
、配列が宣言されておらず、値が追加されていない場合、エラーがスローされます。ただし、宣言した場合のように、配列が単に空の場合はエラーは発生しません。
foreach
例とエラーがトリガーされるという事実は、実行しているPHPのバージョンに明らかに依存しているため、賛成です。
のPHPドキュメントがarrays
実際にドキュメントでこれについて話していることを指摘したかっただけです。
PHPサイトから、コードスニペットを添付して:
$arr[key] = value;
$arr[] = value;
// key may be an integer or string
// value may be any value of any type
「
$arr
まだ存在しない場合は作成されるので、これはアレイを作成するための代替方法でもあります。」
しかし、他の回答が述べているように...そうしないとあらゆる種類の悪いことが起こる可能性があるため、変数の値を宣言する必要があります。
PHPは緩く型付けされた言語です。それは完全に受け入れられます。そうは言っても、本物のプログラマは常に変数を宣言します。
あなたの後に来るコーダーのことを考えてください!が表示されただけでは$arr[] = 5
、$arr
スコープ内の前述のすべてのコードを読み取らなければ、何が起こるかわかりません。明示的な$arr = array()
行はそれを明確にします。
値を追加する前に配列を宣言することを強くお勧めします。上記のすべてに加えて、配列がループ内にある場合、意図せずに要素を配列にプッシュする可能性があります。私はこれがコストのかかるバグを作成しているのを観察しました。
//Example code
foreach ($mailboxes as $mailbox){
//loop creating email list to get
foreach ($emails as $email){
$arr[] = $email;
}
//loop to get emails
foreach ($arr as $email){
//oops now we're getting other peoples emails
//in other mailboxes because we didn't initialize the array
}
}
使用する前に配列を宣言しないと、実際に問題が発生する可能性があります。私が見つけた1つの経験では、このテストスクリプトを次のように呼び出しました。indextest.php?file = 1STLSPGTGUSこれは期待どおりに機能します。
//indextest.php?file=1STLSPGTGUS
$path['templates'] = './mytemplates/';
$file['template'] = 'myindex.tpl.php';
$file['otherthing'] = 'otherthing';
$file['iamempty'] = '';
print ("path['templates'] = " . $path['templates'] . "<br>");
print ("file['template'] = " . $file['template'] . "<br>");
print ("file['otherthing'] = " . $file['otherthing'] . "<br>");
print ("file['iamempty'] = " . $file['iamempty'] . "<br>");
print ("file['file'] = " . $file['file'] . "<br>");// should give: "Notice: Undefined index: file"
print ("file = " . $file);// should give: "Notice: Undefined index: file"
//the Output is:
/*
path['templates'] = ./mytemplates/
file['template'] = myindex.tpl.php
file['otherthing'] = otherthing
file['iamempty'] =
Notice: Undefined index: file in D:\Server\Apache24\htdocs\DeliverText\indextest.php on line 14
file['file'] =
Notice: Array to string conversion in D:\Server\Apache24\htdocs\DeliverText\indextest.php on line 15
file = Array
*/
今度は、購入した別のスクリプトのファイルを上部に必要とします。配列$ pathが正常であるのに、配列$ fileの値が完全に間違っていることがわかります。「checkgroup.php」が有罪です。
//indextest.php?file=1STLSPGTGUS
require_once($_SERVER['DOCUMENT_ROOT']."/IniConfig.php");
$access = "PUBLIC";
require_once(CONFPATH . "include_secure/checkgroup.php");
$path['templates'] = './mytemplates/';
$file['template'] = 'myindex.tpl.php';
$file['otherthing'] = 'otherthing.php';
$file['iamempty'] = '';
print ("path['templates'] = " . $path['templates'] . "<br>");
print ("file['template'] = " . $file['template'] . "<br>");
print ("file['otherthing'] = " . $file['otherthing'] . "<br>");
print ("file['iamempty'] = " . $file['iamempty'] . "<br>");
print ("file['file'] = " . $file['file'] . "<br>");
print ("file = " . $file);
//the Output is:
/*
path['templates'] = ./mytemplates/
file['template'] = o
file['otherthing'] = o
file['iamempty'] = o
file['file'] = o
file = oSTLSPGTGUS
*/
前に配列を初期化してから、問題ありません!
//indextest.php?file=1STLSPGTGUS
require_once($_SERVER['DOCUMENT_ROOT']."/IniConfig.php");
$access = "PUBLIC";
require_once(CONFPATH . "include_secure/checkgroup.php");
$path = array();
$file = array();
$path['templates'] = './mytemplates/';
$file['template'] = 'myindex.tpl.php';
$file['otherthing'] = 'otherthing.php';
$file['iamempty'] = '';
print ("path['templates'] = " . $path['templates'] . "<br>");
print ("file['template'] = " . $file['template'] . "<br>");
print ("file['otherthing'] = " . $file['otherthing'] . "<br>");
print ("file['iamempty'] = " . $file['iamempty'] . "<br>");
print ("file['file'] = " . $file['file'] . "<br>");
print ("file = " . $file);
//the Output is:
/*
path['templates'] = ./mytemplates/
file['template'] = myindex.tpl.php
file['otherthing'] = otherthing.php
file['iamempty'] =
file['file'] =
file = Array
*/
後でどのような問題が発生するかわからないため、変数を初期化することがいかに重要であるかを理解しました。時間を節約したいだけで、最終的にはさらに無駄になる可能性があります。私のように専門家ではない人にも役立つことを願っています。
foreach
データがわからない場合のforループでは、次のように実行できます。
foreach($users ?? [] as $user) {
// Do things with $user
}
$users
が設定されていない場合(null合体が設定されている場合isset($users)
)、空の配列が取得されるため、[]
ループするforeach
ものがないため、PHPはループしません-エラー、警告、または通知はありません。
コメント/回答の一部に同意しません。ある種のセーフティネットとして、単に空の配列を宣言したり、変数を初期化したりする必要はないと思います。そのようなアプローチは私の意見では悪いプログラミングです。必要なときに明示的に実行してください。
正直なところ、空の配列を初期化する必要がある場合は、コードをより適切に構造化できるかどうか、後でデータをチェックする方法などを検討してください。
次のコードは無意味であり、「意図」を示していないため、初期化された理由について人々を混乱させる可能性があります(せいぜい、読んで処理するのは無意味なものです)。
$user = [];
$user['name'] = ['bob'];
2行目も新しい配列を宣言しており、失敗することはありません。
@djdyに同意します。投稿したい選択肢の1つです。
<?php
// Passed array is empty, so we'll never have $items variable available.
foreach (array() AS $item)
$items[] = $item;
isset($items) OR $items = array(); // Declare $items variable if it doesn't exist
?>
array()
空の配列です、foreach
何もしませんか?
$foo = array()
それが配列に変換された文字列ではなかったことは明らかですなど)。