前提・実現したいこと
複数作るページのうち、共通する値や固有の値は
任意のデータから取ってくるようにしたいです。
そのデータは一度設定したら変更不可能にしたいです。
共通化するデータ
・サイト名
・画像やCSS等、ファイルの種類ごとに保存場所を分けたパス
・インクルードするヘッダーやフッターなどのファイル名
・ナビゲーションに表示するリンク先情報(URL・ページ名)
固有化するデータ
・titleタグの値
・そのページでしか読み込まないcssのファイル名
該当のソースコード
php
1/*このファイル名=setting.php*/ 2<?php 3 4class Settings{ 5 const SITE_NAME = 'ほにゃらら'; 6 7 const PATH = [ 8 'img' => '/img/', 9 'js' => '/js/', 10 ]; 11 12 const INCLUDES = [ 13 1 => 'header.html', 14 2 => 'footer.html', 15 ]; 16 17 const NAV = array( 18 1 => array( 19 'label' => 'トップページ', 20 'path' => '/index.html', 21 ), 22 2 => array( 23 'label' => 'お問い合わせ', 24 'path' => '/contact.html', 25 ), 26 ); 27 28 private $title; 29 private $css; 30 private $path_root; 31 private $url_this_page; 32 33 34/*↓初期設定済フラグ*/ 35 private $flg_initialize = 0; 36 37 38 function __construct($title,$css) { 39 if($this->flg_initialize === 0){ 40 $this->title = $title; 41 $this->css = $css; 42 $this->path_root = $_SERVER['DOCUMENT_ROOT']; 43 $this->url_this_page = $_SERVER["REQUEST_URI"]; 44 $this->flg_initialize = 1; 45 } 46 } 47 public function getTitle() { 48 return $this->title; 49 } 50 public function getPathRoot() { 51 return $this->path_root; 52 } 53 public function getUrlThisPage() { 54 return $this->url_this_page; 55 } 56 public function getCss() { 57 $html = ''; 58 foreach ($this->css as $key => $value) { 59 $html .= '<link rel="stylesheet" href="' . self::PATH['css'] . $key . '.css' . $value . '">'; 60 } 61 return $html; 62 } 63} 64global $settings;
php
1/*このファイル名=index.html*/ 2<?php 3require($_SERVER['DOCUMENT_ROOT'] . '/setting.php'); 4$settings = new Settings('トップページ',array('index' => '?ver=2')); 5include($settings->getPathRoot() . $settings::PATH['include'] . $settings::INCLUDES[1]); 6?> 7<!--このページ固有のHTML--> 8<?php include($settings->getPathRoot() . $settings::PATH['include'] . $settings::INCLUDES[2]); ?> 9
問題1:グローバルな変数を使っている
代替案のfilter_input()は
レンタルサーバーがロリポップCGI版のphpだからかnullになってしまった。
参考リンクには直接$_SERVERを見た方がいいというコメントがあり、躊躇っている。
php
1/*このファイル名=setting.php*/ 2$this->path_root = $_SERVER['DOCUMENT_ROOT']; 3$this->url_this_page = $_SERVER["REQUEST_URI"];
結局上記のようにしてしまった。
変更不可能にしたくてconstを使おうとしたが$_SERVER['@@@']を代入できず、
エラーメッセージを調べても解決しなかったので、プロパティに格納。
下記のように、ページ側のファイルでもグローバル変数を使ってしまっている。
php
1/*このファイル名=index.html*/ 2require($_SERVER['DOCUMENT_ROOT'] . '/setting.php');
下記のように、インクルードファイルの関数中でも設定したデータを大量に流用したかったので、
引数に渡す手間を考えグローバル属性をつけてしまった。
php
1/*このファイル名=setting.php*/ 2global $settings;
問題2:フラグを使っている
参考リンクを見ると変更不可にできそうな気がしたが、「return new self」の意味を調べても理解できなくて応用ができず。フラグを使うことを思いついたが、そんな方法調べても出てこなかったので不安が残る。
php
1 private $flg_initialize = 0; 2 function __construct(/*引数*/) { 3 if($this->flg_initialize === 0){ 4 /*色々初期値を設定*/ 5 $this->flg_initialize = 1; 6 } 7 }
試してみたこと
値を後から変える方法を調べて試してみた。
上書きできなかったが、初心者なので不安が残ります。
php
1$settings = new Settings('A','hoge'); 2echo $settings->getTitle();/*output:A*/ 3$settings->__construct( 'B','hoge'); 4echo $settings->getTitle();/*output:A(Bに上書きされていない)*/ 5$settings->title='bbbbb';/*エラー*/ 6$settings::SITE_NAME = 'bbbbb';/*エラー*/
備考
パソコンを使える時間が限られているので、返信が遅くなってしまったらすみません。
試行錯誤過程をお知りなりたくてググった時の検索履歴を御所望であれば、スクショを添付しますのでお申し付けください。
回答1件
あなたの回答
tips
プレビュー