classとstatic functionの活用。
活用シーン
phpは他のphpファイルを読み込むことができるので部分部分をファイル別で管理することができる。wpのテーマがいい例で、ヘッダーとフッターを使いまわしてそれぞれのページに突っ込んでる。
基本的にはこれで足りるんだけど、ファイルごとに分ける必要のない、そこまで大掛かりじゃない一元管理して使いまわしたいパーツ、WEBサイト名とか電話番号とか住所とか、関数をまとめて1ファイルに収めてしまえば確認も楽だし一括更新することができて漏れがなくて便利だよねっていう。
wpでいう「get_bloginfo()」みたいなやつを格納するところから出力までphpで自作しようっていう話。
組む
地の文を重ねてもイメージが付きづらいだろうから具体例でやっていく。
関数ファイルと出力ファイルを分けて作るとする。
<?php
class Parts {
static function tel(){
$staticVal = '000-0000-0000';
return $staticVal;
}
static function date(){
$staticVal = date('Ymd');
return $staticVal;
}
}
//関数ファイル読み込み
require_once "data.php";
//出力
<? echo Parts::tel(); ?>
<? echo Parts::date(); ?>
関数内で文字列を作って、出力時にechoで書き出す。
出力の「Parts::」は作成時の「class Parts{}」に対応してるので、「class example{}」で作ったら「example::」になる。グループ分けみたいに思っておけばいい。「tel()」「date()」はstatic functionで宣言したやつ。見たまま。
引数を使えば出力文から関数に情報を突っ込むこともできる。
<?php
class Parts {
static function tel($select){
if($select == true):
$staticVal = '000-0000-0000';
else:
$staticVal = '非公開';
endif;
return $staticVal;
}
}
echo Parts::tel(true);
参考記事を探したらやりたいことが完結してた。
応用
関数内は文字列であることさえ守っておけば好き勝手に作れる。なので、wpとかだと記事一覧のパーツを作っておいて呼び出す、みたいなことができる。
<?php
class Parts {
static function custompost_list() {
$staticVal = '<ul>';
$myQuery = new WP_Query();
$param = array(
'posts_per_page' => '10',
'post_type' => 'custompost',
);
$myQuery->query($param);
if($myQuery->have_posts()):
while($myQuery->have_posts()) : $myQuery->the_post();
$img = scf::get('img');
$staticVal .= '<li><a href="'.get_the_permalink().'"><img src="'.wp_get_attachment_url($img).'" alt="'.get_the_title().'"></a></li>';
endwhile;
$staticVal .= '</ul>';
endif;
wp_reset_postdata();
return $staticVal;
}
}
echo Parts::custompost_list();
カスタム投稿とカスタムフィールド(SmartCustomFields)を絡めた例。
基礎っちゃ基礎だけど、文字列を変数に格納する際、複数回に分けて追加していくときは「.=」を使う。「=」だと上書きされちゃうので注意。
関数に関数を入れることもできる。
<?php
class Parts {
static function example01(){
$staticVal = 'aaaaaaaaaaaaaaaa';
return $staticVal;
}
static function example02(){
$staticVal = 'bbbbbbbbbbbbbbbb';
$staticVal .= self::example01();
return $staticVal;
}
}
echo Parts::example02();
同じClass内だったら「self::」で指定する。
まとめ的なもの
ボリュームのあるサイトを作る場合とかデータベース的なのを作るときとかにめっちゃ活躍する手法。だけどまあ、必要に駆られるレベルになると関数の数もやばいことになるはずなんで、仕様書とかメモを並行して作ったほうがいいと思う。楽になるはずなのによく分からなくなる。それこそwpみたいに既存のcmsに組み込んだら修正作業時に何が自作なのかどっから引っ張ってるのか、みたいな読み解きが必要になるのですごく時間がかかってしまう。引き継ぎも大変。という、制作側への脅し。
きっちりかっちり作れたとしても「このページだけ違う感じにして」とかいう誤差だろそんなもんみたいなレベルを強要されたときの面倒も簡単に想像できるのでしんどい。まあでもそれは、引数で条件つけたら大事にならずにカバーできるかも、とか。
応用の幅は広いので身につけておくといいと思うんだけど、必要な規模の制作はあんまりやりたくないなと思う。
マジで、既存cmsの機能で済むのに回りくどくphpで記述したもんでバージョンアップに耐えられずにバグを吐くとかあるから。いっそのことphpで完結すればいいのにとか、なんでここだけwpタグ絡んでんだよとか、中途半端なハイブリッドは本当に危ない。php畑から出てきて生き延びてる人なんだろうなとか、頑張ってwp導入したんですねとか、ある。wpを管理画面でのページ管理程度に思って使ってるタイプのサイトにぶち当たるとすごく大変になります。
コメント