TechGekkaスマートフォン用の表示で見るTechGekkaこの広告は、90日以上更新していないブログに表示しています。コードリーディングをしていて、なんだこれって思ったのでまとめてみます。行うコードが見つかった。「二重否定」というよりは「否定の二重適用」というような挙動だった。毎度のことながらここまでは検索用の文なので、以降は日本人に戻ってカタカナで書きます。!!$foo;というようなコードを見つけた。2文字の演算子なので、一見比較演算子か論理演算子かと思ったのだが、コードの文脈上違うようだ。(bool)$foo;と同義のようだ。二重否定でboolean型へのキャストとなるのか二重否定は、このように置き換えられる。);否定を行う論理演算子を一度適用し、さらにもう一度否定している流れである。PHPではエクスクラメーションマークによる否定ではboolean型への暗黙的なキャストが行われ、boolean型にキャストされたものに対してもう一度否定をしてやることで、キャストしつつ元々の結果に反転させることで、遠回りにキャストを実現している。2回目の論理否定となる。"1"というような変換と似た、演算での暗黙変換を利用するキャストの手法である。PHPでの比較演算では、2つの変数の比較結果のbooleanを変数に押し込めたい時、どうすればよいだろうか。PHPでは比較演算の結果は必ず返却されるため、if文の条件式中で使うだけではなく変数に代入することもできる。$piyo);これらはすべて等価である。二重否定によるキャストは、単純に2つ書いただけでそんなことが可能であると知らなければ読めないので、いささか可読性に欠けると言える。他にスマートな書き方はないだろうか。以下は全て二重否定と等価の書き方である。true);もっとありそうだけど、思いつくのはこれくらい。三項演算子かな、と思う。論理積はスマートだけど、他に良い方法あるし、これをあえて選ばなくても、というくらいかな。リテラルへの適用ちなみに、$fooの部分はリテラルであってもよい。!!(1+2+3);ここで、ちょっとガチャガチャとやってみよう。PHPでは、0以外の数字、及び、'0'以外または''以外の文字列リテラルはtrueとなる。演算子で繋ぐことによって、整数リテラルを文字列リテラルに変換することができる。これと二重否定を絡めてみよう。bool(true)この通りたった3行で型がゴシャゴシャになるので、絶対にやるなよ!!!!!!そんなことしねえと思ったそこのお前!!!!!長いこと煮詰まったコードではこれらが分散して、たとえば$fooの初期化が120行目、リテラル変換が140行目、二重否定が170行目にそれぞれあったりするんだからな!!!!その間に煩雑なコードが追加されていったりするから$fooについて追うまで気づかないんだ!!!!!絶対にこの手の成長をする種を蒔くな!!!!!!!結論:どれ使ったら良いのこれはチームが採用している規約などに応じて変えるべきだとは思うが、規定がないのであれば、ボトムの実力に合わせるべきである。false;}が強いと思う。これは教科書みたいな技術書にも最初の方に書いてあるようなif文でしかないので。それ以上の実力があるなら、キャストかboolval()の利用。演算結果を変数に押し込めることを知っているレベルなら、三項演算子や論理積が強いと思う。見た目にもtrueとの演算であることがすぐわかり、そもそもtrueとfalseの文字列が出てくるのでgrepや目検にも強いという有用性がある。何らかの定数が導入されて比較対象を変える場合にも、明示的に比較演算子やtrueなどbooleanリテラルがコードに現れているとわかりやすい。二重否定は、それがシンタックスエラーではなく成立するということを知らない限り使えない局所的な知識なので、推奨はできない。コールバックがないならDOMの変更を監視する月花です。複雑なbindのリーディング月花です。パネルを追加・表示するまで月花です。正規化されたテーブルをSQLだけで入れ子のJSONにする月花です。SQL芸人としての活動のメモです。今回は、正規化され...2017-05-29Postgres・MDB2のキャスト演算子とプレースホルダ月花です。PDOによるデータベース操作の話をします。9.4より古いなら、マテビューをFROM句に入れるビューは良くない月別アーカイブはてなブログをはじめよう!gekka9さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。