第12回 Net_UserAgent_Mobile クラス - 携帯端末情報取得ライブラリ (3) - PEAR講座

PHP 中級 講座

くまっち先生のPEAR講座

Lecutures on PHP

第12回 Net_UserAgent_Mobile クラス - 携帯端末情報取得ライブラリ (3) (その1)

 このエントリーをはてなブックマークに追加

クラスオブジェクト生成に見られるある手法

くまっち先生前回の講座にて、必ず単一のクラスオブジェクトを使用することで初期処理にかかる負荷を省略するシングルトンというものを紹介しました。

Net_UserAgent_Mobileでそのシングルトンを実現するためのメソッドである「singleton」は以下のリスト1になりますが、実際にクラスオブジェクトを生成するためにnewを使うのではなく「factory」というメソッドを実行しているというのが、前回までのお話でした。

    リスト1singletonメソッド

    
function &singleton($stuff null)
    {
        static 
$instance;
        if (!isset(
$instance)) {
            
$instance Net_UserAgent_Mobile::factory($stuff);
        }

        return 
$instance;
    }

今回はこのfactoryについてのお話です。

この手法を使うに至るまで

くまっち先生factoryメソッドとは何か。なぜオブジェクト生成にnewではなく別メソッドを準備しているのか。それは前回のシングルトンと同じように、このライブラリが提供しようとする内容に理由があります。

今回はこのNet_UserAgent_Mobileに存在する機能、すなわち実装されているメソッドを実際に作ろうとするとどうなるか順に紹介していくことにしましょう。

Net_UserAgent_Mobileには、その端末がどこの携帯コンテンツのものであるか名称で返す「getName()」というメソッドがあります。DoCoMoならば「DoCoMo」とそのものズバリの名称が返ってきます。

このメソッドを実現するコードを書くとしたら、大よそ以下のリスト2のようなものになることでしょう。

    リスト2getNameメソッド例

    
function getName()
    {
        
// DoCoMo端末であるか確認する処理を実施
        
if ($this->_isDoCoMo()) {
            return 
'DoCoMo';
        }

        
// au (EZWeb) 端末であるか確認する処理を実施
        
if ($this->_isEZWeb()) {
            return 
'EZWeb';
        }

        
// SoftBank 端末であるか確認する処理を実施
        
if ($this->_isSoftBank()) {
            return 
'SoftBank';
        }

        ....
    }

それぞれどの端末であるかを確認する処理として「$this->_isDoCoMo()」などといった具合にプライベートメソッドを実行するよう簡略化していますが、各ポイントの結果が正であった場合は、そのまま携帯コンテンツ名を返すことで処理を終了するようなコードとなっています。

早速シンプルなコードに仕上がってなかなか満足のいく内容でしょうか。
続いて端末がDoCoMo端末かどうかを確認し成否判定を返す「isDoCoMo()」というメソッドを実現するコードを考えてみましょう。先ほどのコードの続きということで、今回はリスト3のようになりました。

    リスト3isDoCoMoメソッド例

    
function isDoCoMo()
    {
        
// DoCoMo端末であるか確認する処理を実施
        
if ($this->_isDoCoMo()) {
            return 
true;
        } else {
            return 
false;
        }
    }

先ほどのgetNameメソッドで準備したプライベートメソッドの再利用も行うことができてあっさり完成しました。同じようにau用、SoftBank用にも同様のメソッドが同様のコードで作ることができることでしょう。

このまま、その端末がFOMA端末がどうかを確認する「isFOMA()」メソッドというものを作ることにしましょう。最近リリースされている端末はほぼFOMAですが、以前のムーバ端末を引き続き利用している方も当然いるはずです。先のコードと同じように、リスト4のようにしました。

    リスト4isFOMAメソッド例

    
function isFOMA()
    {
        
// DoCoMo端末であるか確認する処理を実施
        
if ($this->_isDoCoMo()) {

            
// FOMAであるか確認する処理を実施
            
if ($this->_isFOMA()) {
                return 
true;
            } else {
                return 
false;
            }
        } else {
            return 
false;
        }
    }

と、この辺であることに気づきました。これまでのコードをよくよく見ると、必ずDoCoMo端末かどうかの確認する「$this->_isDoCoMo()」を実施しています。この調子でいくと、DoCoMoに関する情報を取り扱うメソッドの際には先頭で毎度実施することになりそうです。このことは、auに関する場合やSoftBankに関する場合それぞれでも同様のことがいえます。

  



Pick Up Q&A

Q
負荷時のmysql_connect()エラー
 このエントリーをはてなブックマークに追加 
A
これはPHPというよりOSまたはMySQLのコミュニティで質問されたほうがいいと思います。 ぱっと思いついた範囲で記すと MySQL等のDBに「ある時点において同時に接続可能なクライアントの最大数」に制限があるよう...

>>続きを読む

今回のような実践的な経験がエンジニアのキャリアに繋がると思います。是非サービスを成功させて下さい!

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)