PHPに関するtrashtoyのブックマーク (375)

  • PHPerのための配列処理100本ノック

    はじめに 「配列」は、プログラミング初学者の最初の関門のひとつであり、 そして一生の付き合いでもあります。 記事は、PHPで配列を操作する演習問題集です。 ここに掲載している問題は全て for / foreach を使えば解けます。 初学者の方は、すぐにスマートな方法が思いつかなければ、 まずは for / foreach を使って解決してみてください。 それだけでも、十分配列の理解は深まります。 ただし、ここに掲載している問題は全て for / foreach を使わずに解けます。 ステップアップを目指す方は、ループ処理を使わない方法も考えてみてください。 使用方法 各問題のソースコードを手元のエディタに全文コピペします。 末尾の var_dump() の出力が、コメントの通りになるように、 // SOME CODE HERE // の箇所に、 処理を記述してください。 難易度:低 問

    PHPerのための配列処理100本ノック
    trashtoy
    trashtoy 2021/03/09
    array_combine は勉強になった. JSON の入出力などで応用できそう
  • コマンドラインで「php-cgi test.php」を実行し、$_GETの値を取得したい

    CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。 PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

    コマンドラインで「php-cgi test.php」を実行し、$_GETの値を取得したい
    trashtoy
    trashtoy 2021/02/18
  • WordPressを運用中のサーバがまるごとPHPマルウェアに感染していた時の対応メモ - Qiita

    (2021.1.26 追記) 稿の続きを書きました。 時系列で見る:WordPressを運用中のサーバが丸ごとPHPマルウェアに感染する流れ https://qiita.com/Ayutanalects/items/e7919afadc7d8394820f 制作会社から「自社で管理中のサイトがおかしい」との連絡を受けて、 中をのぞいたら、PHP製の複数種類のマルウェアに感染していたので対応をメモ。 以下の内容は、あくまでも自分の対応時のものです。 攻撃者がスクリプトを変更すれば同じ方法では検出できなくなるのでご注意ください。 初期状態 症状 自社管理中のWordPressサイトにアクセスすると、全く知らないサイトにリダイレクトされる 今回は allc〇〇ling.shop というEC風サイト。Kasperskyを使っていると、「警察機関指定の危険サイト」の警告あり https://sup

    WordPressを運用中のサーバがまるごとPHPマルウェアに感染していた時の対応メモ - Qiita
    trashtoy
    trashtoy 2021/01/26
    だらしない運用と思いつつ, 反面教師としてセキュリティ周りの提案などに活用できそうなのでブックマークしておく
  • PHP 8 Attribute シンタックスの変遷 - Shin x Blog

    PHP 8 の新機能の一つ、Attribute の形式が紆余曲折ありながら最終的に #[] となりました。実用上は #[] 形式だけ覚えておけば良いのですが、シンタックスの変遷は興味深いものだったので残しておこうと思います。 Attribute Attribute 仕様の変遷 8.0.0alpha1: <<>> 8.0.0alpha2 8.0.0beta1: @@ @@ の問題 8.0.0beta4: #[] #[] の注意点 さいごに Attribute PHP 8 の Attribute は、他のプログラミング言語によくあるアノテーションです。クラスやメソッド、プロパティ、関数に付与することで任意の処理を追加することができます。PHP では従来 Doc コメントでこれを指定する文化がありましたが、これを言語仕様として実装したものです。 <?php declare(strict_type

    PHP 8 Attribute シンタックスの変遷 - Shin x Blog
    trashtoy
    trashtoy 2020/10/05
  • SJIS-macに変換したはずなのにSJIS-winになる - Qiita

    $utf8Str = "❶❷❸❹❺"; $sjisStr = mb_convert_encoding($utf8Str, 'SJIS-mac'); echo(mb_detect_encoding($sjisStr, ['UTF-8','SJIS-mac', 'SJIS-win', 'SJIS'])); // SJIS-win ← SJIS-macに変換したはずなのに、何故かSJIS-winと判定されてしまいます。 そもそもSJIS-macってなんだよって話ですが、単にMacJapaneseのエイリアスです。 従ってMacJapaneseと書いても同じく、正しく誤判定されます。 そしてコメント欄にThis is a bug in PHP's mbstring extension『mbstringエクステンションのバグじゃよ』という人が現れています。 間違ったコードを書いたときに自分のせいでは

    SJIS-macに変換したはずなのにSJIS-winになる - Qiita
    trashtoy
    trashtoy 2020/09/29
  • 【PHP8.0】非厳密な比較演算子`==`の挙動が今さら変更になる - Qiita

    結果は順にtrue、true、falseです。 これがPHP7までの非厳密な比較(等価)演算子だったわけですが、まあおかしいよねってことで、この挙動がPHP8.0で変更になることになりました。 よもや今さら基中の基である比較演算子の動作を弄ってくるとは思わなかったぞ。 以下はSaner string to number comparisonsの日語訳です。 PHP RFC: Saner string to number comparisons Introduction ==やその他の非厳密な比較演算子を用いた文字列と数値の比較は、現在は、文字列を数値にキャストし、その後整数か浮動小数の比較を行っています。 この結果、多数の不可解な結果が得られますが、中でも注目すべきは0 == "foobar"がtrueになることです。 このRFCでは、文字列が実際に数値型文字列である場合にのみ数値型

    【PHP8.0】非厳密な比較演算子`==`の挙動が今さら変更になる - Qiita
    trashtoy
    trashtoy 2020/08/28
    ついでにマジックメソッド __equals() を導入して, "==" でオブジェクト同士の「等価性」チェックが出来るようにしてほしい ("===" による「同一性」チェックと使い分ける感じで)
  • 【PHP8.0】PHPにヌルセーフ演算子が導入される - Qiita

    $user = null; echo $user->address->country ?? ''; PHPのプロパティは元よりnull安全なので、存在しないプロパティだろうがnullだろうがプリミティブ型だろうがいきなりプロパティを取り出せます。 取れない場合はE_NOTICEが発生しますが、??を使えば黙殺できます。 しかしメソッドはだめです。 echo $user->getAddress()->getCountry() ?? ''; // Fatal error: Call to a member function getAddress() // 1 if (method_exists($user, 'getAddress')) { if (method_exists($user->getAddress(), 'getCountry')) { echo $user->getAddres

    【PHP8.0】PHPにヌルセーフ演算子が導入される - Qiita
    trashtoy
    trashtoy 2020/07/21
    賛成多数みたいだけど個人的には反対. PHP初心者による脳死 ?-> 利用が増えて, Java で言うところの catch された Exception の握りつぶしみたいな気づかれにくいバグを誘発する可能性が出てきそう
  • 【PHP8.0】厳密なswitch文ことmatch式が使えるようになる - Qiita

    switch($x){ case 1: '$xは1だよ'; break; case "1": '$xは"1"だよ'; break; } case "1"に到達することは決してありません。 ということで厳密な比較を用いるswitchことmatch構文のRFCが提出されました。 以下はMatch expression v2の日語訳です。 PHP RFC: Match expression v2 Proposal このRFCは、switchに似ていますが、より安全なセマンティクスを持つmatch構文の提案です。 例として、Doctrineのクエリパーサを挙げます。 // Before switch ($this->lexer->lookahead['type']) { case Lexer::T_SELECT: $statement = $this->SelectStatement(); br

    【PHP8.0】厳密なswitch文ことmatch式が使えるようになる - Qiita
    trashtoy
    trashtoy 2020/06/30
  • 【PHP8.0】PHPにオブジェクト初期化子が導入される - Qiita

    これまで何度も塩漬けにされたり却下されたりしていたオブジェクト初期化子ですが、ついにPHP8.0で導入されることになりました。 オブジェクト初期化子が何かというとこれです。 これはオブジェクト初期化子でいいのか? 日語で何と表すのか適切な単語が思いつかなかったのでとりあえずオブジェクト初期化子としておきます。 愚直に訳すと"コンストラクタ引数昇格"ですが、そんな単語は無いうえに型昇格と紛らわしいです。 引数プロパティ宣言もパラメータプロパティ宣言もほぼ使われてないし何と表現すればいいのだろう。 きっと誰かが適切な語をプルリクしてくれるはず。 以下は該当のRFC、PHP RFC: Constructor Property Promotionの日語訳です。 PHP RFC: Constructor Property Promotion Introduction PHPでは現在のところ、オブ

    【PHP8.0】PHPにオブジェクト初期化子が導入される - Qiita
    trashtoy
    trashtoy 2020/06/02
    IDEによる静的解析やソースリーディングに支障が出そうだから自分は使いたくない
  • 最高にラブリー💖なHello world 【php編】 - Qiita

    変更履歴 * 2019/09/28 Array の取得方法が短くなりました。$__=$_[].=$_; → $_.=[]; * 2019/09/28 かっこ多めの別解を追加しました。 はじめに 何ヶ月前でしょうか、私はjsfuckに夢中でした。jsfuckとは記号プログラミングの一種で、通常6種類の記号(!, +, [, ], (, ))のみを使用してjavascriptのコードとして動作させようという試みです。へ、変態だ…。そして、ある日ふと思ったのです。jsfuckがあるならphpfuckだってあるだろ、と。 完成品 $_.=[];$__.=$$_[!_]=$_[!!_]&$_[-!!_];$__.=$_[!!_];$__.=$$_[!!_]=$_[-!!_]&~$_[!!_]|$_[!_];$$_[_]=$_[!!_]&~$_[!_]^_;$__.=++$$_[_];$__.=$$_

    最高にラブリー💖なHello world 【php編】 - Qiita
    trashtoy
    trashtoy 2019/09/05
  • P++: 銀河に平和をもたらすための奇策と決着 - Qiita

    PHP 8から、PHPは「PHP」と「P++」という2つの言語を提供するようになる というキャッチーな紹介をするP++: 静的型付けをめざすPHPという記事がそれなりに話題になり、このニュースは目覚しく革新的な内容で、多くのひとの目を引き付けました。 これは早まった理解であり、ほとんど誤報と言ってもいい内容でした。2019年8月15日には提案者人も、少くとも「P++」の計画を短期的に実現するととは非現実的であり時期尚早であることを認めています。 この記事では、PHP開発の現状、なぜ野心的なP++計画が提案され、事実上撤回されたかの経緯について紹介します。 [中立性のための表示] この記事の著者@tadsanはPHPの静的解析を強く推進する立場です。 PHPゆるふわCI入門 PHP型検査・夢と理想と現実) 三行で要約 PHPはバージョンを経るごとに「歴史的経緯」による負債が削ぎ落されてきた

    P++: 銀河に平和をもたらすための奇策と決着 - Qiita
    trashtoy
    trashtoy 2019/08/14
  • P++: 静的型付けをめざすPHP

    PHP: pplusplus:faq PHP 8から、PHPは「PHP」と「P++」という2つの言語を提供するようになる。P++はPHPとの下位互換性を削りながら除々にPHPを静的型付け言語にする試みだ。 PHP開発者の中には2つの流派がある。PHPの源流であり現在の形である動的型付け言語としてのPHPを良しとする流派と、PHPをより強い静的型付け言語へと発展させたい流派だ。良い悪いの問題ではない。どちらの流派も正当な理由がある。しかし、ゆるふわな動的型付け言語とガチガチの静的片付け言語は同じ一つの言語として同居できない。 そこで、コードネームP++として、PHPを静的型付け言語に発展させる新しい言語の開発が提案された。P++はforkではなく、PHPと同じコードベースを共有する。PHP 8のバイナリはPHPとP++を同時に実装する。言語の切り替えは何らかの宣言によって指定する。 P++は

    trashtoy
    trashtoy 2019/08/13
  • PHPサーバーサイドプログラミングパーフェクトマスターのCSRF対策に脆弱性

    サマリ PHPサーバーサイドプログラミングパーフェクトマスターには、PHP入門書としては珍しくクロスサイト・リクエストフォージェリ(CSRF)対策についての説明があるが、その方法には問題がある。アルゴリズムとして問題があることに加えて、実装上の問題があり、そのままコピペして用いると脆弱性となる。 はじめに 古庄親方の以下のツイートを見て驚きました。 CSRF用のトークンの作成 $token = password_hash(mt_rand(), PASSWORD_DEFAULT); ってのを書籍で見た………もンのすンげぇなぁ(苦笑 書籍名でググって調べる……評判が悪いので、まぁ、納得っちゃぁ納得。 — がる (@gallu) July 17, 2019 CSRFトークンの生成に、password_hash関数を使うですと? 親方に書籍名を教えていただき、購入したのが、この記事で紹介する「PH

  • 【PHP7.4】レガシーな仕様はどんどんしまっちゃおうねぇ - Qiita

    恒例の仕様凍結直前駆け込みRFC第二弾。 色々な古い書き方について、PHP7.4でE_DEPRECATEにし、PHP8で削除を目指すRFCが投票中です。 以下はDeprecations for PHP 7.4の日語訳です。 Deprecations for PHP 7.4 Introduction このRFCでは、以下に列挙されている機能についてPHP7.4で非推奨とし、PHP8で削除することを提案します。 Proposal 各提案は個別に投票を行い、投票数の2/3+1の賛成で受理されます。 投票開始は2019/07/08、投票終了は2019/07/22です。 The 'real' type 現在のPHPでは、float型にはdoubleとrealという2種類のエイリアスが存在します。 後者は滅多に使用されず、廃止されるべきです。 これは(real)キャストと、is_real関数の両方が

    【PHP7.4】レガシーな仕様はどんどんしまっちゃおうねぇ - Qiita
    trashtoy
    trashtoy 2019/07/13
  • PHP: 静的メソッドは何のためにあるか? - Qiita

    稿ではPHPの静的メソッドが何のためにあるかを考えるものである。 クラスとインスタンスの概念的な関係性 静的メソッドを理解するには、クラスとインスタンスの関係性を理解していなければならない。 クラスとインスタンスの関係は何だろうか? 一言で言えば、クラスは、複数のインスタンスの集合である。概念的な集合であって、インスタンスの配列という意味ではない。例えば、$user1のオブジェクトと$user2のオブジェクトを総じて、Userと呼べるのは、Userが$user1と$user2の集合だからだ。 以上の集合論的な観点を踏まえると、静的メソッドは何のためにあるかといえば、集合に含まれるすべてのオブジェクトに共通した処理(公理ともいう)を記述するためにあると言える。 逆を言えば、集合の一要素にすぎない$user1にのみ関係する処理は静的メソッドにはならない。Userクラス(ここまで読んだみなさん

    PHP: 静的メソッドは何のためにあるか? - Qiita
    trashtoy
    trashtoy 2019/03/12
    納得のいく分かりやすい説明. とあるクラスをイミュータブルとして設計した場合, この記事のようにクラスとインスタンスを集合論的な関係として捉えることができる
  • 【PHP7.4】PHPの新たな演算子??=ってなんぞ? - Qiita

    2019/01/22(JST)にImplement ??= operatorという謎のマージがありました。 RFC RFCは賛成37、反対4の圧倒的多数で可決されています。 なお投票開始は2016/03/24で、終了が2016/04/02です。 つまり、それ以来3年弱ほったらかされていたということです。 ??=ってなに? RFCでは『Null Coalescing Assignment Operator』と呼ばれています。 どうも適切な日語がないみたいなのですが、NULL合体演算子(Null Coalescing Operator)から類推すると『NULL合体代入演算子』とかになるんですかね? 名前のとおり、NULL合体演算子と代入演算子を合わせたような演算子です。 使い方 // NULL合体代入演算子 $id ??= getId(); // これと同じ $id = $id ?? get

    【PHP7.4】PHPの新たな演算子??=ってなんぞ? - Qiita
    trashtoy
    trashtoy 2019/02/22
  • PHP: Builderパターンの実装手順 #1【基礎実装】 - Qiita

    Builderパターンとは、生成過程を抽象化したり、コンストラクタの引数が多かったり、コンストラクタの引数を作るのが複雑なときに使うデザインパターンのひとつだ。稿では、引数が多すぎるコンストラクタの解消法のひとつとしてPHPでのBuilderパターンの実装方法を紹介する。 なお、稿で実装したコードの完全版はGitHubで公開している。 お題のモデル Builderパターンを実装するに当たってのお題として、Eメールを扱う。Eメールは、To, CC, From, Subject, Bodyの5つの情報を持っていることにする。これを素直にモデルにするとこうなる: コンストラクタには5つ引数がある。この実装では、Emailクラスを利用したいクライアントコードは次のようになる: new Email( ['alice@example.com'], ['bob@example.com'], [],

    PHP: Builderパターンの実装手順 #1【基礎実装】 - Qiita
    trashtoy
    trashtoy 2019/02/14
    “EmailをEmailBuilder経由で作ることを強制する方法”, もしも自分だったら Email クラスのコンストラクタ引数を EmailBuilder にするとか. Java だったらコンストラクタの可視性をパッケージプライベートにするだけでラク.
  • 今からでも遅くない!PHPerも型を書こう! - Qiita

    最初にまとめ 型を書くとオブジェクト指向をちょっと意識しやすくなるよ 稿の目的 PHP歴史的に型を書かない人が多いです。 そういう自分もPHP7.x系になるまで書いたことはほとんどありませんでした。 書かなくても動くしなんでそんなめんどくさい事をわざわざ、、、みたいな。 そんな自分でも今は型が書いていないと気持ち悪いと感じる位になれたので、その思考の過程をご紹介していきたいと思います。 ただ、稿は型の素晴らしさや型安全なプログラミングとは等を正攻法で説明するというのが意図ではないです。 ちょっと普段とは違う目線で型を書くメリットを紹介してみようと思います。 型 is 何? 型とはそもそも何でしょう? 端的に言えばデータ型という事になりますが、今回は少し違った見方をしたいと思います。 それは 『型とはふるまいに対する主語です』 稿はこんな視点で型について説明したいと思います。 そもそ

    今からでも遅くない!PHPerも型を書こう! - Qiita
    trashtoy
    trashtoy 2019/02/12
  • PHP:手軽なのに型安全。多重度[1..*]の制約を実装する裏ワザ - Qiita

    オブジェクト指向するとき、「多重度が1以上」の制約を設計で想定することがある。例えば、「メッセージ」には「受信者」がいるが、「受信者は最低1名」という制約をクラス設計(UMLのクラス図)で表現すると次にのようになる。recipientsはMessageクラスのメンバで、1..*が多重度1以上を意味する。 稿では、こうした多重度が1以上のモデルを、PHPでいかに型安全1にコードに落とし込んだらいいか、その裏ワザを紹介する。 なお、稿で提示するPHPのサンプルコードの完全版はGitHubで公開しているので、必要があれば参照していただきたい。 オーソドックスな多重度制約の表現方法 今回紹介したい内容に行く前に、多重度制約を表現するオーソドックスな実装方法を見ておこう。 final class Message { /** * @var Recipient[] */ private $recip

    PHP:手軽なのに型安全。多重度[1..*]の制約を実装する裏ワザ - Qiita
    trashtoy
    trashtoy 2019/02/04
    リファクタリングで引数を変えづらくなるので, 素直にクラスを作る派
  • CSVファイルを呼び出す前に文字コードを確認するようにする。 | バシャログ。

    みなさんこんにちは 私の担当したプロジェクトで必要な情報をエクセルからCSVファイルに変換してそれをphpで読み取って保存する。 という手順がありました。 処理自体は簡単なものでSplFileObject()を使ってやればforeachで一行ずつ読み取るだけです。 しかし、一点読み取る前に問題がありました。文字コードです。 エクセルからCSVファイルを保存するとShift-JIS 調べてみるとどうやら最新のエクセルでは問題なくutf-8で保存ができるようですが、私の使用しているMicrosoft Excel 2010では難しいようです。 そのため一度CSVファイルを保存してからエディタなどで開いてutf-8に保存し直しています。 しかし人間なので何回もやっているとその工程を忘れてしまう事があります。 すると・・・・ターミナルが最悪停止します。 サーバーは生きてるとはいえ、ターミナルを立ち上

    CSVファイルを呼び出す前に文字コードを確認するようにする。 | バシャログ。
    trashtoy
    trashtoy 2019/01/25
    mbstring モジュールを有効にして mb_convert_encoding を使ってください. exec 関数などは一切不要