この質問への答えはノーだと確信していますが、PHPの第一人者がいる場合に備えて
無効な引数または存在しない変数を渡すことができ、phpを使用せずにエラーが発生しないような方法で関数を作成することは可能ですか?'@'
空とissetのように。作成したばかりの変数を渡すことができ、エラーは発生しません。
ex:
empty($someBogusVar); // no error
myHappyFunction($someBogusVar); // Php warning / notice
この質問への答えはノーだと確信していますが、PHPの第一人者がいる場合に備えて
無効な引数または存在しない変数を渡すことができ、phpを使用せずにエラーが発生しないような方法で関数を作成することは可能ですか?'@'
空とissetのように。作成したばかりの変数を渡すことができ、エラーは発生しません。
ex:
empty($someBogusVar); // no error
myHappyFunction($someBogusVar); // Php warning / notice
変数が参照によって渡された場合、エラーは発生しません (PHP はサイレントに新しい変数を作成します)。
function myHappyFunction(&$var)
{
}
しかし、プログラミング エラーを隠すためにこれを悪用しないことをお勧めします。
まとめると、適切な答えは「いいえ」です。そうすべきではありません(以下の警告を参照)。
条件で参照変数または isset() または empty() を使用し、PHP 構成で通知を抑制するなど、このスレッドで多くの人が既に言及している回避策があります。@ を使用した明らかな回避策に加えて、これは望ましくありません。
Gerryとの興味深いコメント ディスカッションの要約:関数内の変数の値をチェックし、未定義または null のケースを適切に処理する場合、変数を参照渡しすることは実際に有効です。PHPをシャットダウンする方法として参照渡しを使用しないでください(これは、私のオリジナルが指すべきではない場所です)。
次のように 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";
この func はさらに一歩進んで、任意の数の引数の最初の空でない値を提供します (最大 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がエラーにならないような方法で関数を作成することは可能ですか?
はい、できます!
porneLは正しい[編集:彼の回答にリンクしたり投票したりするのに十分なポイントがありませんが、このページにあります]
彼が「しかし、プログラミングエラーを隠すためにこれを悪用することはお勧めしません」と警告するときも彼は正しいです。ただし、これと同じ理由で、エラー制御演算子(@)によるエラー抑制も回避する必要があります。
Stack Overflowは初めてですが、正解が投票されないのに、間違った答えがページの最上位にランク付けされることは珍しいことではありません。:(
いいえ、これは実際には関数とは関係がないためです。エラーは、存在しない配列キーを参照解除しようとしたことが原因です。PHPセットアップの警告レベルを変更して、これらのエラーを抑制することができますが、これを行わない方がよいでしょう。
そうは言っても、あなたは次のようなことをすることができます
function safeLookup($array, $key)
{
if (isset($array, $key))
return $array[$key];
return 0;
}
そして、配列キールックアップの代わりにそれを使用します
defaultValue(safeLookup($foo, "bar"), "baz);
今、私はシャワーを浴びる必要があります:)
パラメータにデフォルト値を追加するだけの場合は、関数を呼び出すときにそれをスキップできます。例えば:
function empty($paramName = ""){
if(isset($paramName){
//Code here
}
else if(empty($paramName)){
//Code here
}
}
@ブライアン:私は私のためにチェックを行うために三元操作を使用します:
return $value ? $value : $default;
これは$valueまたは$defaultのいずれかを返します。$valueの値によって異なります。0、false、空、または同様の値の場合、$defaultの値が返されます。
empty()やisset()のような関数をエミュレートするという課題にもっと挑戦します
@ショーンそれはすでにブライアンによって答えられました
return isset($input) ? $input : $default;
ショーン、あなたはできる:
$result = ($func_result = doLargeIntenseFunction()) ? $func_result : 'no result';
編集:
三項演算子と関数呼び出しに関する素晴らしい議論があると確信しています。しかし、この質問のポイントは、「@」を使用せずに存在しない値が渡された場合にエラーをスローしない関数を作成できるかどうかを確認することでした。
そして、私はあなたに言った、それをチェックしてくださいisset()
。三項条件の最初の部分は、null または非 null をチェックせず、またはをチェックしtrue
ますfalse
。PHP で null 値をチェックしようとすると、これらの警告が表示されtrue
ます。変数または式がnull値を返すかどうかをチェックし、ブール値を返します。これは、エラーなしで三項の最初の部分で評価できます。false
isset()
三項演算子と関数呼び出しに関する素晴らしい議論があると確信しています。しかし、この質問のポイントは、「@」を使用せずに存在しない値が渡された場合にエラーをスローしない関数を作成できるかどうかを確認することでした。
1行で、それを達成できます:myHappyFunction($someBogusVar="");
これがあなたが探しているものであることを願っています。PHP のドキュメントを読むと、default argument valuesの下で、関数の引数にデフォルト値を割り当てると、関数を使用するときにエラー メッセージが表示されるのを防ぐのに役立つことがわかります。
この例では、デフォルト引数を使用することの違いとその利点を確認できます。
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に違反して自分自身を繰り返すことにつながるでしょう。
これは、これらすべてのデフォルト値を格納する単一の場所です。これらのセッターとゲッターの作成を避けたくなるかもしれませんが、出力の変更や入力の検証を行うことが適切になった場合に備えて、メンテナンスにも役立ちます。