notebook510

備忘録とか覚え書き的なところを想定しています

PHP実践 お知らせ機能の作成 前半

出張などが重なり、10日ぶりのスクー受講。

今回はCMS機能を持たせたお知らせ機能の講座。

 

タイトルからは想像できなかったけど、クラスを使った既存ページの
書き換えといった内容でした。

 

今回書いたコードはこちら。

HTML側の$templateの内容をPHP側のクラスCMSで書いた
関数を元に処理していくという感じです。

HTML側

<?php
$template = '
<p><img src="images/340x180.png" width="340" height="180" alt=""></p>
<p>{{title}}</p>
<p>{{body}}</p>
';
require_once('cms.php');
$cms = new MyCMS\CMS($template,2);
$cms->render();

?>

 {{title}}、{{body}}を出力時に書き換える感じです。

 

 

PHP側

<?php

namespace MyCMS;

class CMS
{

  private $template;
  private $length;
  private $variables;
  private $data;

public function __construct($template,$length)
{
  $this->template = $template;
  $this->length = $length;

  if(preg_match_all('/{{([^}]+)}}/', $this->template, $p)){
    $this->variables = $p[1];
  }//endif
$this->data = array(
'title' => array('1番目のタイトル', '2番目のタイトル'),
'body' => array('1番目の本文', '2番目の本文'),
);
}//end function __construct

public function render()
{
$body = '';
for($i=0; $i < $this->length; $i++){
$row = $this->template;

foreach($this->variables as $key){
$row = str_replace('{{'. $key . '}}', $this->data[$key][$i], $row);
}//end foreach

$body .= $row;
}//end for
echo $body;
}//end function render

}//end class CMS

?>

 

あまり理解できていないんですが、コードごとに
動作を振り返ってみたいと思います。

 

HTML側の

require_once('cms.php');

でクラスを読み込んでいます。

 

$cms = new MyCMS\CMS($template,2);

クラスCMSを利用するために、new演算子でオブジェクトを作成。
これをインスタンス化っていうんですね。

このように記述する事でPHP側の

public function __construct($template,$length)

 $template側にはHTML側の変数の内容が、$lengthには、2が代入されます。

オブジェクトの初期化を行う際に

__construct()

と宣言することで初期化できるそうです。
コンストラクタメソッドというんですね。

 

$cms->render();

 クラスCMS内に記述した関数、renderの実行です。

 

 

PHP側の

preg_match_all('/{{([^}]+)}}/', $this->template, $p)

 この記述で波括弧で囲われた文字列を検索し配列に格納しています。

 

書き換える文字列については、今回は手書きで配列を記述しています。

$this->data = array(
'title' => array('1番目のタイトル', '2番目のタイトル'),
'body' => array('1番目の本文', '2番目の本文'),
);

 

セットした配列を元に関数renderを経由して、
HTML側の{{title}} と {{body}} を書き換える感じです。

 

書き換える際に使う関数が、str_replace ってとこでしょうか。

 

うーん、今回は振り返っているけど
理解度が浅い感じですね。

後半を聞いて、理解を深めたいと思います。