Php関数の引数エラー抑制、empty() isset()エミュレーション
-
09-06-2019 - |
質問
この質問に対する答えは「ノー」であると確信していますが、PHP の達人がいる場合に備えて
無効な引数または存在しない変数を渡すことができ、php を使用せずにエラーが発生しない方法で関数を作成することは可能ですか? '@'
empty や isset とよく似ています。作成したばかりの変数を渡すことができますが、エラーは発生しません。
ex:
empty($someBogusVar); // no error
myHappyFunction($someBogusVar); // Php warning / notice
解決
要約すると、正しい答えは次のとおりです いいえ、そうすべきではありません (以下の注意事項を参照してください)。
条件で参照変数や isset() または empty() を使用したり、PHP 設定で通知を抑制したりするなど、このスレッドで多くの人がすでに言及している回避策があります。これに加えて、@ を使用するという明白な回避策もありますが、これは望ましくありません。
との興味深いコメントディスカッションを要約すると、 ジェリー:次の場合、変数を参照によって渡すことは実際に有効です。 関数内の変数の値を確認する 未定義または null の場合を適切に処理します。PHP を黙らせる方法として参照の受け渡しを使用しないでください (これは、私のオリジナルでは指摘すべきではない点です)。
他のヒント
変数が参照によって渡される場合、エラーは発生しません (PHP は新しい変数をサイレントに作成します)。
function myHappyFunction(&$var)
{
}
ただし、プログラミングエラーを隠すためにこれを悪用しないことをお勧めします。
次のように func_get_args を使用してこれを行うことができます。
error_reporting(E_ALL);
ini_set('display_errors', 1);
function defaultValue() {
$args = func_get_args();
foreach($args as $arg) {
if (!is_array($arg)) {
$arg = array($arg);
}
foreach($arg as $a) {
if(!empty($a)) {
return $a;
}
}
}
return false;
}
$var = 'bob';
echo defaultValue(compact('var'), 'alpha') . "\n"; //returns 'bob'
echo defaultValue(compact('var2'), 'alpha') . "\n"; //returns 'alpha'
echo defaultValue('alpha') . "\n"; //return
echo defaultValue() . "\n";
この関数はさらに一歩進んで、任意の数の引数の最初の空でない値を返します (いつでも最大 2 つの引数のみを強制的に受け取ることができますが、このように私にとってはこの方が便利に見えます)。
編集:元のバージョンでは引数の配列を作成するためにコンパクトを使用していませんでしたが、それでもエラーが発生しました。エラーレポートがさらに強化され、コンパクト化されたこの新しいバージョンは少し整理されていますが、それでも同じことを行い、存在しない変数にデフォルト値を提供できるようになります。
チェックが煩雑で不必要になる場合もあります。
したがって、私はこの小さな魔法の関数を書きました:
/**
* Shortcut for getting a value from a possibly unset variable.
* Normal:
* if (isset($_GET['foo']) && $_GET['foo'] == 'bar') {
* Short:
* if (value($_GET['foo']) == 'bar') {
*
* @param mixed $variable
* @return mixed Returns null if not set
*/
function value(&$variable) {
if (isset($variable)) {
return $variable;
}
}
myHappyFunction() を変更する必要はありません。
変わらなければなりません
myHappyFunction($someBogusVar);
に
myHappyFunction(value($someBogusVar));
自分の意図を明確に述べる。それはそれを作る いい練習 私の本の中で。
いいえ、これは実際には関数とは何の関係もないからです。このエラーは、存在しない配列キーを参照解除しようとしたために発生しています。これらのエラーを抑制するために PHP セットアップの警告レベルを変更することもできますが、これは行わない方が賢明です。
そうは言っても、あなたは できた のようなことをしてください
function safeLookup($array, $key)
{
if (isset($array, $key))
return $array[$key];
return 0;
}
配列キー検索の代わりに使用します
defaultValue(safeLookup($foo, "bar"), "baz);
今、シャワーを浴びる必要があります:)
無効な引数または存在しない変数を渡すことができ、「@」を使用せずにphpでエラーが発生しない方法で関数を作成することは可能ですか?
はい、できます!
ポルノは正しい [編集:彼の回答にリンクしたり、投票したりするには十分なポイントがありませんが、このページにあります]
彼はまた、「しかし、プログラミングエラーを隠すためにこれを乱用することをお勧めします」と警告するときも彼は正しいです。ただし、この同じ理由で、エラー制御演算子(@)を介したエラー抑制も回避する必要があります。
私は Stack Overflow を初めて使用しますが、正解には投票が入らず、不正解がページ内で最上位にランクされることが一般的でないことを願っています。:(
@ブライアン:私は三項演算を使用してチェックを行います。
return $value ? $value : $default;
これにより、$value または $default が返されます。$value の値に応じて。0、false、空、または類似の値の場合は、$default の値が返されます。
私は、empty() や isset() のような関数をエミュレートすることにもっと挑戦するつもりです。
@Seanそれはブライアンによってすでに回答されています
return isset($input) ? $input : $default;
ショーン、次のことができます:
$result = ($func_result = doLargeIntenseFunction()) ? $func_result : 'no result';
編集:
Ternary Operators VRS Function Callについて素晴らしい議論があると確信しています。しかし、この質問のポイントは、「@」を使用せずに存在しない値が渡された場合、エラーをスローしない関数を作成できるかどうかを確認することでした。
そして私はあなたに言いました、それを確認してください isset()
. 。3 項条件の最初の部分は、null か非 null かをチェックするのではなく、 true
または false
. 。確認しようとすると true
または false
PHP で null 値を指定すると、次の警告が表示されます。 isset()
変数または式が null 値を返すかどうかをチェックし、ブール値を返します。これは、三項演算子の最初の部分でエラーなく評価できます。
三項演算子と関数呼び出しについては、素晴らしい議論が行われる可能性があると確信しています。しかし、この質問のポイントは、「@」を使用せずに存在しない値が渡された場合にエラーをスローしない関数を作成できるかどうかを確認することでした。
元の質問に対する答えは「いいえ」ですが、誰も言及していない選択肢があります。
@ 記号を使用すると、PHP は @ 記号をオーバーライドするだけです。 error_reporting
レベルを調整し、一時的にゼロに設定します。「」を使用できます。ini_restore('error_reporting');
" を使用して、@ が使用される前の状態に戻します。
これは、変数が設定されているかどうかを確認する便利な関数を作成し、他のプロパティも持っているかどうかを確認し、そうでない場合はデフォルト値を返すという状況で役に立ちました。ただし、設定されていない変数を送信すると PHP 通知が発生するため、@ を使用してそれを抑制しましたが、設定しました error_reporting
関数内の元の値に戻ります。
何かのようなもの:
$var = @foo($bar);
function foo($test_var)
{
ini_restore('error_reporting');
if(is_set($test_var) && strlen($test_var))
{
return $test_var;
}
else
{
return -1;
}
}
したがって、上記の場合、 $bar
設定されていないため、呼び出してもエラーは発生しません foo()
存在しない変数を使用しています。ただし、関数内で誤って入力するとエラーが発生します。 is_set
の代わりに isset
.
これは、実際にはそうではないにしても、元の質問が精神的に尋ねていたことをカバーする便利なオプションになる可能性があります。
パラメータにデフォルト値を追加するだけの場合は、関数を呼び出すときにその値をスキップできます。例えば:
function empty($paramName = ""){
if(isset($paramName){
//Code here
}
else if(empty($paramName)){
//Code here
}
}
たった 1 行でそれを完了できます。 myHappyFunction($someBogusVar="");
これがあなたが探しているものであることを願っています。php ドキュメントを読むと、 デフォルトの引数値, 関数の引数にデフォルト値を割り当てると、関数使用時のエラー メッセージの発生を防ぐことができることがわかります。
この例では、デフォルト引数を使用することの違いとその利点を確認できます。
PHPコード:
<?php
function test1($argument)
{
echo $argument;
echo "\n";
}
function test2($argument="")
{
echo $argument;
echo "\n";
}
test1();
test1("Hello");
test1($argument);
$argument = "Hello world";
test1($argument);
test2();
test2("Hello");
test2($argument);
$argument = "Hello world";
test2($argument);
?>
の出力 test1()
行:
警告:test1() の引数 1 がありません。
こんにちは。
.
こんにちは世界。
の出力 test2()
行:
.
こんにちは。
こんにちは世界。
これを組み合わせて使用することもできます isset()
必要なことを達成するためのその他の機能。
そして、抽象化ツリーをさらに上に進むと、これを何に使用するのでしょうか?
必要に応じて各クラスでこれらの値を初期化することも、次のようにすべてのデフォルト値と属性を含む特定のクラスを作成することもできます。
class Configuration {
private var $configValues = array( 'cool' => 'Defaultcoolval' ,
'uncool' => 'Defuncoolval' );
public setCool($val) {
$this->configValues['cool'] = $val;
}
public getCool() {
return $this->configValues['cool'];
}
}
コードのあらゆる場所でdefaultValue関数を使用すると、値を変更する必要があるたびに、defaultValue呼び出しを配置したすべての場所を探すというメンテナンスの悪夢が発生するという考えです。そしておそらく、DRY に違反して同じことを繰り返すことになるでしょう。
一方、これはすべてのデフォルト値を保存する単一の場所です。これらのセッターとゲッターの作成を避けたくなるかもしれませんが、出力の変更や入力の検証が必要になった場合に備えて、メンテナンスにも役立ちます。