【ワレコのPHP講座】PHPのNamespaceとClassの使い分け【3/10】

この記事は約6分で読めます。
スポンサーリンク

このところ、猛烈にPHPを勉強中だ。

PHPを良く知っている人には常識の事でも、初心者のワテには難しい事ばかり。

 

例えば、サーバーサイドで幾つかのphpファイルがあり、

file1.php
file2.php

などがあるとする。

その時に、これらのPHPファイルの中で共通に利用する関数群をどこか一カ所のファイルで定義しておきたい。

その共通PHPファイルをWEBサーバーのルートフォルダの下にサブフォルダを作って入れておく。

MyPHP_Path/MyPHP_Lib.php

まあ共通ライブラリ関数みたいな感じかな。

 

この共通ライブラリPHPファイルを使う file1.php や file2.php の冒頭では、最近覚えたばかりの include_once を実行すると読み込める。

<?php
include_once($_SERVER['DOCUMENT_ROOT'] . '/MyPHP_Path/MyPHP_Lib.php');

include() ではなくて include_once() にしておくと、うっかり間違えて多重に読み込もうとしても一回しか読み込まれないので安心だ。

 

さて、今日覚えたPHPの話題であるが、それは名前空間とクラスの使い分けである。

では、本題に入ろう。

スポンサーリンク
ワテ推薦のプログラミングスクールで学ぶ
スポンサーリンク
スポンサーリンク

名前空間とクラスの使い分け

PHPのクラスも他の言語と同じなので、new でインスタンスを作成する場合もあれば、クラスの中にstatic なメソッド(関数)を定義しておいて newせずにそのまま利用する事も可能だ。

今回のような共通ライブラリ関数なら、わざわざnewでインスタンスを作成せずに関数を使うのがワテは好きである。

一方、それとは別にnamescpae内でクラスを使わずに関数を定義する手法でも良い。

今日はこのテクニックを覚えたので備忘録としてメモしておく。

名前空間内に関数を定義しておく手法

<?php
namespace MyNamespace {
   function MyFunc($x) {
     echo '$x =' . $x . 'でんがな。<br/>';
   }
}
?>

こんなふうに定義しておけば、それを他のPHPファイルの中で使う場合には、

 MyNamespace\MyFunc('ワテ');

実行結果

 $x =ワテでんがな。

となる。

このnamespaceを使う場合には、バックスラッシュ記号を関数名の前に書いて区切るのだが、使っているエディタが日本語フォントの場合には、それが円記号¥に置き換わる。

MyNamespace¥MyFunc('ワテ');

まあ表示の設定を変えて英語フォントにすればバックスラッシュで表示は出来る。

MyNamespace\MyFunc('ワテ');

でもVisual Studioの編集画面はデフォルトのフォントがワテは好きなのでそれは英語フォントに変えたくない。

と言う事で、このNameSpaceを使うやり方は不採用とした。

 

で、ワテが採用したのは次に説明するクラスの静的メンバ関数を使う方法だ。

クラス内にstaticな関数を定義しておく手法

<?php
class MyClass {
   public static function MyFunc($x) {
      echo '$x =' . $x . 'でんがな。<br/>';
   }
}

この場合は区切り記号にはコロンを二個(::)使う。

こんな感じ。

MyClass::MyFunc('ワテ');

実行結果は先ほどのNameSpace版と同じである。

まあ、コロン2連結の記述方法はC++で馴染みがあるし、ワテにはこっちの方が好み。

 

と言う事で、ワテの場合にはPHPで使う自前の共通ライブラリ関数は、Classの中にstaticな関数として実装する事にした。

 

Staticなクラスで初期化の処理をしたい場合

上で説明したように、クラスの静的メンバ変数や静的メンバ関数のみを使うとすると、クラスのインスタンスは作成する必要が無いのでコンストラクタも呼ばれない。

その場合に、クラス内のメンバ変数に初期値を代入したい場合にはどうするべきか迷った。

定数を代入するだけならそのまま変数への代入式を書けば良いが、何らかの計算式や他の関数の実行結果で得られる値を変数の初期値にしたい場合もある。

そう言う場合にはこんな手法が良いみたい。

<?php

MyClass::init();  // 初期化を行う関数を実行する
class MyClass {
 
    public static function init(){   // 初期化用のメンバ関数
        // ここで必要な初期化処理を行うと良い。
    }
    public static function MyFunc($x) {  // 他のメンバ関数
        ...
    }
}
?> 

これ以外には、singleton と言う手法があるようだがワテの場合は使った事が無い。

参考情報

HTMLで文章を作成する場合(例えばこのページ)、使っているフォントが英語か日本語かに応じてバックスラッシュ\が円記号¥に変わる、あるいはその逆もある。

そう言う場合に、どんなフォントを使っていても確実に目的の記号を描くには、「文字実体参照」と言う手法で可能だ(下図)。

文字 文字実体参照 説明
  &nbsp; ノーブレークスペース – 折り返しを起こさない(ホワイトスペースではない)空白
< &lt; 小なり記号(半角)
> &gt; 大なり記号(半角)
& &amp; アンパサンド(半角)
&quot; 二重引用符(半角)
&#x27; &apos;

The named character reference &apos; (the apostrophe, U+0027) was introduced in XML 1.0 but does not appear in HTML. Authors should therefore use &#39; instead of &apos; to work as expected in HTML 4 user agents.

引用元 https://stackoverflow.com/questions/2083754/why-shouldnt-apos-be-used-to-escape-single-quotes

/

&#47;

&sol;

Slash
\

&#92;

&bsol;

Backslash
¥

&#xA5;

&#165;

&yen;

円記号

表 文字実体参照の例

まあ要するに円記号を確実に表示したいなら、&yen;と書けば良い。

あと、シングルクォーテーション「」に関してはスタックオーバーフローのサイトを見たら、&apos;はHTML4では採用されていないので、使わないのが良いとの事だ。使うなら&#x27;が良いとの事。

まとめ

今回覚えた手法をまとめると以下の通り。

PHPで他のファイルを読み込むには include_once() か include() が良い。

Namespace内で関数を定義した場合には MyNamespace\Myfunc() と書く。

Class内でstaticな関数を定義した場合には MyClass::MyFunc() と書ける。

Classでstatic関数を定義する手法では new でインスタンスを作成する必要は無い。

以上、ワテが最近覚えたPHPの入門編でした。

スポンサーリンク
ワテ推薦のプログラミングスクールで学ぶ
コメント募集

この記事に関して何か質問とか補足など有りましたら、このページ下部にあるコメント欄からお知らせ下さい。

PHP
スポンサーリンク
warekoをフォローする
スポンサーリンク
われこ われこ

コメント