0

設定されていない可能性のある変数があり、代わりにデフォルトのパラメーターを使用したい場合があります。ここみたいに:

if ($p == "a") doSomething();

が定義されていない場合$p、PHP は をスローしNotice: Undefined variableます。これを避けるために、私はこのような場合にこの構造をよく使用しました。

$p = (isset($p) ? $p : "");

しかし、それを頻繁に使用する必要がある場合、それは醜いです。だから私はそれのための関数を書きました:

function getIfSet(&$value, $default = '')
{
    return isset($value) ? $value : $default;
}

// Example
if (getIfSet($p) == "a") doSomething();

これに対するPHP関数があるか、またはこれをどのように解決するのだろうか。

4

4 に答える 4

1

少し改善しました。null値を$defaultに渡すことをお勧めします。空の文字列を渡すと混乱する可能性があります。正しい値が空の文字列になる可能性があるためです。

function getIfSet(&$value, $default = null)
{
    return isset($value) ? $value : $default;
}
$p = getIfSet($p);
于 2012-10-02T10:30:24.100 に答える
0

チェックしている値の種類 (おそらく REQUEST データ?) に応じて、クラスの使用を検討してください。それらは楽しく、どこでも利用できます。

POST データをチェックしていると仮定して (そうでない場合は、これをアイデアとして考えてください)、この配列をチェックするクラスを作成します。

class Post
{
    public function __get($index)
    {
        if (isset($_POST[$index]))
            return $_POST[$index];
        else
            return null;
    }
}

それと同じくらい簡単です。存在しないプロパティにアクセスしようとすると __get() がトリガーされることがわかっています。この場合、プロパティ (実際には $_POST 配列のインデックス) が存在しない場合、null が返され、エラーは生成されません。

これで、次のことができます。

$params = new Post();
$foo = $params->name ?: ''; // of course this doesn't make much sense.

if (!$params->password) ...
// instead of 
if (isset($_POST['password'])) ...

// you'll still have to use isset for cases like:
if (isset($_POST['user']['password']) ...
if (isset($params->user['password'])) ...
// but still looks neater I'd say

すぐにわかる問題は、$_POST がスーパー グローバル変数であるのに対し、$params はスーパー グローバル変数ではないということです。これを解決する方法は?コントローラー クラスのコンストラクターで作成し、使用している他のすべてのオブジェクトに依存性注入を使用します。

于 2012-10-02T11:09:58.653 に答える
0

この解決策を思いついたとき、私は renocor の答えをよりクリーンで OOP にしようとしました:

class NiceArray implements ArrayAccess {
    protected $array;

    public function __construct(&$array) {
        $this->array =& $array;
    }

    public function offsetExists($offset) {
        return true;
    }

    public function offsetGet($offset) {
        if (isset($this->array[$offset]))
        {
            return $this->array[$offset];
        }
        else
        {
            return null;
        }
    }

    public function offsetSet($offset, $value) {
        $this->array[$offset] = $value;
    }

    public function offsetUnset($offset) {
        unset($this->array[$offset]);
    }
}

使用法:

$get = new NiceArray($_GET);
if ($get['p'] == "a") doSomething();

クラスが大きいことは知っていますが、この方法ではまだ配列があり、必要なすべての配列に簡単に使用できます。以前のコードを変更する必要はありません。データにアクセスして変更することは引き続き可能です。元の配列も変更されます。

于 2012-10-26T08:40:17.133 に答える
0

isset() は、それが得るのと同じくらいきれいです。空の文字列をデフォルトにするのはあまり好きではないことを認めなければなりませんが、変数は空の文字列である可能性がありますが、まだ「設定されている」からです。bool false または null のデフォルトは isset の動作に忠実だと思います:

function getIfSet(&$value, $default = false)
{
    return isset($value) ? $value : $default;
}

$p = getIfSet($p);

if($p !== false){
     //insert or whatever
}
else{
    header('Location: error.php');
    exit;
}
于 2012-10-02T10:30:24.883 に答える