10

私は時々、PHP が常に三項演算子で完全に参照することを望んでいることに非常にうんざりして、このような恐怖を与えています。

$qb->records[$k]['Claimed'] = ($qb->records[$k]['Claimed'] === 1 ? $qb->records[$k]['Claimed'] : '0');

現在変更されている変数 (オブジェクト) を参照するだけの方法はありますか? 例えば;

$qb->records[$k]['Claimed'] = (self === 1 ? self ? '0');

コード自体を見ないでください。例のコードが機能するということではありません。それは純粋に、追加の変更なしで SELF 参照の可能性に関するものです。DEFINEメソッドもいいでしょうが、PHP は、Objective-C のように複雑な s を作成できないと思いますDEFINE

また、私はそのようなスタイルを認識しています。

foreach ($qb->records as $k => &$v) { ... }

..しかし、そのメソッドを事前定義された状態にしたくありません。

4

5 に答える 5

1

別のアイデアは、トリックを行う関数を作成することです:

function setval(&$val, $desired, $default) {
    if ($val != $desired) {
        $val = $default;
    }
}

$val参照によって渡されるため、関数の影響を受けます。$desired比較の目的の値です。$default所望の値が満たされていない場合の値です。

例:

setval($qb->records[$k]['Claimed'], 1, '0');

残りの部分については、condition ?: else省略形の if-else が最も近いです...

于 2013-09-11T10:42:51.570 に答える
0

SELF-referencedあなたが説明したようなポインタは存在しません。より短いコードが必要な場合は、長い名前の変数参照を新しい変数に保存し、その変数をステートメント$vで使用できます。if

$qb['records']['k']['Claimed'] = 'test';
$v = &$qb['records']['k']['Claimed'];

$v = $v === 'test' ? $v . ' extra' : null;
unset($v);

print_r($qb);
于 2013-09-11T09:51:10.907 に答える
0

残念ながら、できることはあまりありません。

私がこれまでに得た最善の方法は、一時変数インラインを導入することでした。これにより、初期変数の出現回数が 3 回から 2 回に減りました。例えば:

$arr = ['foo' => ['bar' => 2]];

// Introducing $_ -- the parens are needed!
$arr['foo']['bar'] = ($_ = $arr['foo']['bar']) === 2 ? $_ : 0;
于 2013-09-11T09:43:36.107 に答える
-1

Objective-C#defineは、現在のコンテキストからのものを使用して、定数の定義、関数のように見えるもの (実際には他のコードに置き換えられる) の定義など、さまざまなショートカットを定義できるようにするマクロコンストラクトです。

PHPdefine()は、定数の初期化のみを目的とした関数です。

達成したいことの唯一の PHP 省略表現は、三項演算子の省略形です$x ?: NULL

于 2013-09-11T09:43:31.647 に答える