質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.61%

  • PHP

    19851questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

地味に便利なPHP関数を教えてください

解決済

回答 6

投稿 編集

  • 評価
  • クリップ 10
  • VIEW 3,968

livetc

score 78

僕はあまりPHPの関数を知りません。

地味に便利だよ!という関数とシチュエーションを教えてください。
自分が知らない関数の発見につなげたいです。

ちなみに僕が長い間知らなかった、地味便利関数はmaxとminです。
可読性があがりました。

// if($i < 0) $i = 0;
$i = max($i, 0);

9/11 追記です。
emptyも個人的には好きで、主に分岐を増やしたくないHTMLテンプレートへの埋め込み時に重宝します。nullもfalseも空配列もsetも検出してくれるので。
<?php if(!empty($list)): ?>
<?php endif; ?>
この関数使うと分岐が少なくなってスマートになるよ、とか小技的(?)な関数が知りたいかもですね。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 6

+5

ob_start
ob_get_contents

長いHTMLを変数に入れたいときとかに便利

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/09/10 22:40

    HTMLのテンプレートなんかを読み込んで必要箇所を置換して出力、みたいな場面で使うんでしょうかね。
    回答ありがとうございます。

    キャンセル

  • 2015/09/11 00:26

    こいつが一番輝いたのはメール送信処理のときでしたね。

    キャンセル

  • 2015/09/11 00:43

    >メール
    なるほど!参考になりました。

    キャンセル

+5

var_dump
デバッグの時は圧倒できに便利です。
型もわかるので

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/09/11 00:37

    var_exportもいいですね。返値で受け取れるので、デバッグログなんかに出しやすいです。

    キャンセル

  • 2015/09/11 00:47

    var_dumpを知っているだけで開発効率がぐんっと良くなりますよね。
    回答ありがとうございます。

    >osaponさん
    var_export!これ知らなかったです!ログで使えそうですね。ありがとうございます。

    キャンセル

  • 2015/09/11 14:49 編集

    スニペットに

    echo '<pre style="text-align:left;">'; var_dump(); echo '</pre>';


    って登録しておくときれいに出てくるので地味に重宝してます。

    キャンセル

  • 2015/09/11 18:31

    saito.rukaさん
    やはり皆さんやるんですね。僕はグローバル関数でdump用関数入れたりしますね。
    function d($val){
    echo "<pre>";
    var_dump($val);
    echo "</pre>";
    }

    キャンセル

checkベストアンサー

+4

関数ではないのですがPHP5.3で導入されたエルビス演算子

$foo = 'bar';
if(isset($_POST['baz'])){
    $foo = $_POST['baz'];
}
こう書いてたのが

$foo = @$_POST['baz'] ?: 'bar';
こんな感じに書き直せます

@でNotice抑制しているのがちょっとモヤモヤするところなのですがPHP7からは ?? 演算子なるものができるらしく、さらに

$foo = $_POST['baz'] ?? 'bar';
と書けるらしいです

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/09/14 19:46

    ActionScriptとかだとそういうのが
    $hoge=$hoge or $fuga;
    で書けててそれに慣れてたので
    三項演算子だとちょっとコード長くなるのが
    不満があったところだったのですが
    できるようになってたのですね

    キャンセル

  • 2015/09/14 21:19 編集

    おお!エルビス演算子知りませんでした。
    これはスマートになりそうですね。
    (@はちょっとモヤっとしますね)

    関数を教えてください、と言いながらエルビス演算子をBESTアンサーにさせていただきました。関数ではないですがスマートに書きたいという意図に合致したので。
    回答ありがとうございます。

    キャンセル

  • 2015/09/16 00:51 編集

    エルビス演算子の例示には、3点の問題があります。

    - if文の例示はissetのみによる判定なのに対し、エルビス演算子の例示は論理値(以下、boolean)として判定している
    - 変数$fooに対する書き込み回数が異なる
    - @演算子を利用している

    順に説明します。

    # if文の例示はissetのみによる判定なのに対し、エルビス演算子の例示は論理値(以下、boolean)として判定している

    エルビス演算子による例示の動作は、以下とほぼ等価です。

    if (isset($_POST['baz']) && $_POST['baz']) {
    $foo = $_POST['baz'];
    } else {
    $foo = 'bar';
    }

    issetは「変数が定義されており、かつ、変数の値がnullではない」場合にtrueとなります。
    しかしエルビス演算子の場合、$_POST['baz']をbooleanに変換して判定を行うため、@演算子により抑えられている「変数が未定義」の場合以外に、以下の値でもfalseと判定されます。

    - false // booleanのfalse
    - 0 // integerのゼロ
    - 0.0 // floatのゼロ
    - "" // 空文字列
    - "0" // 文字列のゼロ
    - array() // 空の配列
    - null //null
    - // 空のタグから作成された SimpleXML オブジェクト

    (http://php.net/manual/ja/language.types.boolean.php#language.types.boolean.casting より)

    このうち、変数$_POSTに代入されるのは文字列と配列のみです。

    (http://qiita.com/mpyw/items/2f9955db1c02eeef43ea#is_string-%E9%96%A2%E6%95%B0is_array-%E9%96%A2%E6%95%B0 を参照)

    このため、回答にあるif文の例では$_POST['baz']が送信されていない場合のみ変数$fooの値が'bar'となっていた処理が、
    エルビス演算子の例では空文字列("")、文字列のゼロ("0")、空の配列の場合に変数$fooの値が'bar'となります。
    空文字列と空の配列は送信されていない値として扱っても良いかもしれませんが、文字列のゼロはどうでしょう。「送信されていない値」として扱うべきでしょうか?

    # 変数$fooに対する書き込み回数が異なる

    オブジェクトのプロパティでは、変数代入のように書き込まれた場合に任意の処理を行う機能が存在するため、変数$fooに対する書き込み回数が違う点でも等価ではありません。
    (回答のif文の例示は2回、エルビス演算子は1回のみ書き込んでいます)。

    # @演算子を利用している

    @演算子はエラーが抑止されるため、多用するとバグの元となります。
    また、@演算子はパフォーマンスの悪化も招きます。

    (http://www.programming-magic.com/20080511005743/ より)

    ただこれについては解答でも「@でNotice抑制しているのがちょっとモヤモヤするところ」とありますね…

    ---

    ところで、冒頭のエルビス演算子による例示をif文に書き換えた処理が"ほぼ"等価な理由として、set_error_handler関数を利用すると@演算子が出力するはずだったエラーを取得できることが挙げられます。
    書き換えたコードではそもそもエラーが発生しないため、その意味において@演算子によるエルビス演算子の処理とは「厳密に等価」ではありません。

    ただ、この差は、記述されている判定処理そのもの、及びこのコメントで指摘している問題とは一切無関係ですので、無視しても問題はありません。

    キャンセル

  • 2015/09/16 01:11

    ちなみに、回答にあるif文の例示と完全に等価な処理は、エルビス演算子では記述できません。
    代わりに三項演算子を利用することで実現できます。

    $foo = isset($_POST['baz']) ? $_POST['baz'] : 'bar';

    エルビス演算子はもっと別の、false判定されても構わない変数に対して利用するべきでしょう。

    キャンセル

+3

serialize
unserialize

WordPressを魔改造した時、DBに配列格納するときに便利でした。
あんまりこういう方法はよろしくないのかもしれませんが…;x;

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/09/10 18:37

    配列を文字列として保持しておきたいとき、serializeは便利ですよね。APIのレスポンスキャッシュなんかで僕も使います。
    回答ありがとうございます。

    キャンセル

  • 2015/09/11 19:04

    unserializeはインジェクションの脆弱性があるので情報共有です。
    http://blog.a-way-out.net/blog/2014/07/22/php-object-injection/

    キャンセル

  • 2015/09/14 09:05

    nanndemoiikaraさん
    情報ありがとうございます!

    キャンセル

+3

reset(), end()
配列の最初、最後の値を取得する。
結構知らない人が多いのでビックリしました。

マジックメソッド系
Rubyをよく使うので、method missingと同じことがPHPでも出来るのかと感動した記憶があります。
嫌いな人は嫌いな機能だと思いますが汗



投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/09/14 21:12

    reset,end知らなかったです!地味便利ですね。
    マジックメソッドはconstructくらいしか使ったことないですが、小技で使えそうですね。
    回答ありがとうございます。

    キャンセル

+1

str_repeat

地味だけど便利な関数といえばこれを忘れてました
HTMLコードを生成するクラスだとかで
インデントを綺麗にするときに重宝します

vsprintf

これも地味に便利、implodeでは対応できない
n個ごとに特定のフォーマットを繰り返すみたいな配列の文字列化が
str_repeatと組み合わせると簡単にできます

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/09/14 21:16

    こちらも初めて知りました。プログラム側で文字列を作るときに使う場面が出てきそうです。
    回答ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    19851questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。