4らしいコードだな,ということを感じました。見渡しただけでも,require_once文による外部PHPファイルの読み込み,メンバ変数のvarキーワードによる定義,クラス名と同名のコンストラクタ,メソッドのアクセス修飾子がないなどの特徴があります。引数の参照渡しやstatic指定なしのクラスメソッドなどもそうですね。5にはそぐわない書き方になりました。これは言語の変化だけではなく,開発手法や利用するライブラリ,フレームワークが変化したというのもその一因です。5の中でも,5.3未満とそれ以降でまた異なるのですが,それはまた別の機会に⁠)⁠。それぞれの個所について見てみましょう。require_once文による外部ファイルの読み込み両コードとも,ファイルの先頭でrequire_once文で外部のクラスファイルを読み込んでいます。当時,複数のクラスファイルで構成されるアプリケーションでは定石だったこの方法ですが,オートローダが普及した今では,オートローダ自身や設定ファイルなど最低限のファイルのみ自分で読み込んで,あとはオートローダに自動で読み込ませるという手法を取ることが多くなりました。require_once文は悪くない方法なのですが,ファイル位置を相対パスで指定したり,include_pathを別途指定する必要があるなど,少し煩わしさがあります。オートローダを使えば物理的なファイルパスを気にすることなくクラスファイルを読み込むことができるので便利です。オートローダは自作することもできますが,Composer(※1)のオートローダを利用するのが簡単です。Composerのオートローダを利用することで,ほかのライブラリやフレームワークを利用する際も同じオートローダを使うことができ,連携しやすい構成となります。※1Composerは,PHPで依存管理を行うツールです。アプリケーションが利用するライブラリやフレームワークを管理する手段としてデファクトスタンダードとなっています。名前空間Composerによるオートローダを導入して,ほかのライブラリやフレームワークと組み合わせる際に重要になるのが,名前空間の設定です。複数のソフトウェアを組み合わせると,同じ名前のクラスがそれぞれに存在して,競合してしまう場合があります。5.4からSessionHandlerクラスが導入されて,アプリケーションに存在するクラスと競合するということがありました⁠)⁠。名前空間を導入しておくと,こうした名前の競合を避けることができます。下記のように同じUserクラスでも,名前空間をAppとFooLibのように別にしておけば,名前空間を含めた完全なクラス名は\App\User,FooLib\Userとなり,同居することできます。クラス名と同名のコンストラクタコンストラクタのメソッド名がクラス名と同じ名前になっています。5では,__constructというメソッド名がコンストラクタとして記述できるようになりました。5.3.3以降,名前空間が設定されたPHPファイルでは同名コンストラクタが呼ばれなくなっているので,__constructを使いましょう。4らしい書き方と言えば,このオブジェクトの参照渡しです。Loginクラスのauth()メソッドの引数が参照渡しとなっています。{また,インスタンスを変数に代入する場合も下記のように参照で受け取るように書かれています。4では,変数の代入やメソッド呼び出しで引数を渡す際,デフォルトは値渡しとなっていました。そのため,オブジェクトを代入する際は処理速度やメモリ効率を考慮して,参照渡しを行うことがTipsとして知られていました。5からは,オブジェクトの実体ではなく,参照のみが渡されるようになったため,パフォーマンスを考慮した参照渡しを行う必要がなくなりました。Loginクラスのauth()メソッドの場合,引数で受け取ったUserModelクラスのオブジェクトに対してセッターメソッドで値をセットしています。このオブジェクトの変更を呼び出し元でも利用するため,参照渡しで引数を渡しています。5であれば,前途のとおりオブジェクトの参照を渡すので,メソッド内のオブジェクトと呼び出し元のオブジェクトは同一のオブジェクトとなります。よって,この理由による参照渡しを行う必要もありません。5でオブジェクトを代入する際、&を使った明示的な参照渡しは必要ありません。パフォーマンスについては,参照渡しを行うことでかえってパフォーマンスが落ちるケースもあるので,&による参照渡しは基本的には使わないほうがよいです。メソッドの重複LoginControllerクラスを見てみると,checkLoginId()というメソッドが2つ定義されています。4ではこういった実装が認められていました。同じ名前のメソッドを2つ書くメリットは特にないと思うので,おそらくコピペしてそのまま放置されたのでしょう。get_class()関数の挙動の違いLoginクラスのauth()メソッドでは,処理の先頭で引数のクラスをチェックしています。get_class()関数でクラス名を取得して,期待すべきクラスでなければ,returnするようになっています。4では,このget_class()関数の戻り値はクラス名を小文字にした文字列でした。よって,このコードでは期待すべきクラス名UserModelを小文字にしたusermodelと比較しています。5ではクラス名がそのまま返ってくるので,戻り値はUserModelとなります。5で実行すると,$userModel変数がUserModelクラスのオブジェクトでも,この式はtrueになりません。5で動かすなら,比較文字列をUserModelにするか,get_class()の戻り値をstrtolower()関数で小文字に変換する必要があります。5のタイプヒンティングを使う方法もあります(下記⁠)⁠。こちらのほうが意図がわかりやすいコードになりますね。5では非推奨(E_DEPRECATED)となっています。これはpreg_match()関数で代用しましょう。クラスメソッドにstaticが付いていないLoginクラスのauth()メソッドは,LoginControllerクラスでの呼び出し方を見るとクラスメソッドを想定しているようです。statically)が発生します。コードを読む際もメソッドがインスタンスメソッドなのかクラスメソッドなのかの判別ができないので,クラスメソッドの定義にはstaticキーワードを付けておきしょう。4固有のことではないのですが,気になる個所があります。Loginクラスのauth()メソッドでは,データベースへの問い合わせが実行されているのですが,検索条件を組み立てている個所で値のエスケープにaddslashes()関数が使われています。addslashes()関数はマルチバイト文字などを考慮せずに機械的にエスケープを行ってしまうため,利用する文字エンコーディングによっては,文字列が壊れてしまったり,本来は無効化すべき特殊文字をエスケープできない場合があります。SQLに含める値をエスケープするにはaddslashes()関数ではなく,データベースドライバに定義されている専用のエスケープ関数(PostgreSQLならpg_escape_string()/pg_escape_literal(),MySQLならmysqli_real_escape_string()など)を用いるほうが安全です。Object)を使い,プリペアドステートメントで値をバインドする方式に変えるほうがよりよいでしょう。addslashes()関数を使う場面はおおよそないとも言えるので,この関数が登場した場合は要注意です。連続したセッターメソッドこれは何かマズイことがあるというわけではないのですが,実装について気になった個所です。Loginクラスのauth()メソッドでは,$userModel変数に対してセッターメソッドが15行ほど並んでいます。各セッターメソッドに対して連想配列$recordの対応するキーの値をひたすら渡しています。丁寧でよいのですが,冗長なので,下記のように連想配列ごと引数で渡して,UserModelクラス内で値を一括でセットしてくれるようなヘルパーメソッドが欲しくなるところです。4の書き方に注目して治療するポイントを見てきました。5らしい書き方に治療していきます。大阪でPHPを駆使してWebシステムの開発を行う日々。MotoGPをこよなく愛す。2019」を開催しました。DAY1・DAY2の様子を注目セッションとともにお伝えします。LINEのエンジニア3名がイベントに先駆けて見どころを紹介します。コードの安全性・安定性を高める開発サイクル~テスト管理の効率を上げ,脆弱性診断を自動で行う~本連載では,連載「業務を改善する情報共有の仕掛け」を受けつつ,安全性・安定性を加えた開発サイクルについて考えていきます。若者世代から圧倒的な人気を誇るライブ配信&動画投稿コミュニティアプリ「MixChannel」(ミクチャ)の裏側(レコメンドシステムやサーバサイド開発など)について解説していきます。その他の連載CSS3アニメーションでつくるインターフェイス表現CSS3によるアニメーション表現を紹介していきます。その中でも,幅広い読者に応用してもらえるだろうインターフェイスを主なお題とします。MySQL道普請便り本連載では,MySQLを使ったアプリ開発・運用に関するノウハウをご紹介していきます。RecipeUbuntuの強力なデスクトップ機能を活用するための,いろいろなレシピをお届けします。JavaScriptセキュリティの基礎知識JavaScriptに関するセキュリティ上の問題はどこで発生し,どうすれば防ぐことができるのか?について解説していきます。〜システムをきちんと運用するための基礎知識システムは「作って終わり」ではなく,運用の中でさまざまな問題が発生します。問題の発生に備えて事前にどのような対応をしておくべきなのか,問題発生時に何をしなければならないのか,ポイントを解説していきます。きたみりゅうじの聞かせて珍プレーソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。Linuxのメンテナンスの傍ら,Linuxやオープンソースソフトと日々を過ごす著者が,その魅力とつきあい方を,エッセイ風味でお届けします。PRESS特別編集部員,さわやか笑顔のスーパーハカーはまちちゃんとネット大好き14歳わかばちゃんが,毎号,読者の皆さんから寄せられたおたよりを紹介します。皆さんの日頃の悩みにも答えちゃいますよ。]メールでのお知らせメールで次の案内をお送りしております。メールの配信を希望する方は,利用したい項目をチェックしてメールアドレスを入力し,[登録]ボタンをクリックしてください。UPDATES[ほぼ週間に1回]新刊メールマガジン[ほぼ週間に1回]電脳会議の各号案内[ほぼ1ヵ月半に1回]※変更する場合や停止する場合は,登録情報変更ページをご覧ください。※登録いただいたメールアドレスには,そのお知らせ以外,配信いたしません。Ltd.ページ内容の全部あるいは一部を無断で利用することを禁止します。個別にライセンスが設定されている記事等はそのライセンスに従います。