質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

2261閲覧

一度設定したら変更不可な値を作りたい

kjshdfiuasye

総合スコア25

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/01/22 07:50

前提・実現したいこと

複数作るページのうち、共通する値や固有の値は
任意のデータから取ってくるようにしたいです。
そのデータは一度設定したら変更不可能にしたいです。

共通化するデータ

・サイト名
・画像や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';/*エラー*/

備考

パソコンを使える時間が限られているので、返信が遅くなってしまったらすみません。
試行錯誤過程をお知りなりたくてググった時の検索履歴を御所望であれば、スクショを添付しますのでお申し付けください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/01/22 12:23

そもそも、 INPUT_ENV / INPUT_SERVER って INPUT してないから当然といえば当然
kjshdfiuasye

2020/01/24 01:07

コメントありがとうございます。 inputしていないとはどういった意味でしょうか? 直訳してみたら「入力」ということでしたが、 フォーム送信を行わない画面ではルートパスを安全に取得できないのでしょうか? ($_SERVERは書き換えられてる可能性があるので危険という記事を見ました)
guest

回答1

0

ベストアンサー

ではダメですか?

投稿2020/01/22 07:58

yambejp

総合スコア114757

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kjshdfiuasye

2020/01/24 01:40

constを使えという記事を見てから、そうしなければならないと思い込んでいました。 理由を見てみると大量に定義する場合速度が劣るためとあったため、 サイトの基本情報を少量定義する今回は該当しませんでした。 よってdefineを使おうと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問