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

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

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

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

Q&A

解決済

1回答

844閲覧

PHPにおけるリソースの削減を意識したオブジェクトの作り方

aaiau

総合スコア11

PHP

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

0グッド

1クリップ

投稿2019/05/01 14:16

編集2019/05/02 09:24

前提・実現したいこと

現在PHPで作成するクラスの設計を行っています。

1日の実績データを扱うクラス(仮にdailyClass)を使って月毎のデータを扱うクラス(仮にmonthlyClass)を作成する場合、
monthlyClass内で日付の数分のdailyClassオブジェクトを作成する想定で考えているのですが、
保持している値だけが異なるdailyClassオブジェクトを30個も作ることによって、メモリリソースが食われるのは如何なものかと考えています。

そこで皆さんに質問したいのですが、以下のようなコードの場合、リソース削減のために考えられる事としてどういったものが挙げられるでしょうか?
また、PHPの内部仕様によって、実質メモリ量を削減する仕組みになっているといった事があればご教授いただけますと幸いです。
曖昧な質問になってしまい申し訳ありませんが、よろしくお願いします。

該当のソースコード(上記を元に仮作成したもの)

<?php // 日毎のデータを作成するクラス class dailyClass{ private $date; private $result; function __construct( $Ymd ){ $this->date = $Ymd; $this->setDayResult(); } // 実際にはデータベースより取得したデータから計算、整形した配列データが返る function setDayResult(){ // $this->result = $dbObj->get( $this->date ); $this->result = rand(1,100); } function getResult(){ return $this->result; } } // 日毎のデータを元に月毎のデータを作成するクラス class monthlyClass{ private $date; private $result; function __construct( $date ){ $this->date = $date; $dateTs = strtotime($date); $lastDay = date( 't' , $dateTs ); // ここで1月分のオブジェクトを作成する -- 懸念しているポイント -- for( $i = 1 ; $i <= $lastDay ; $i++ ){ $getDate = date('Y/m/d' , strtotime( sprintf('+%d day' , $i -1 ) , $dateTs ) ); $this->result[$i] = new dailyClass( $getDate ); } } // dailyClassオブジェクトのresultを1ヶ月分合算して返すメソッド function getTotal(){ $result = 0; foreach( $this->result as $daily ){ $result += $daily->getResult(); } return $result; } } $startDate = '2019/05/01'; $obj = new monthlyClass( $startDate ); $result = $obj->getTotal(); // 最終的に取得したい値 var_dump($result);

補足情報

開発環境では、PHP5.3を使っているため、無名クラスなど一部使えない構文があります。
今回の例題に絡めてバージョンアップするべき理由等もあれば幸いです。

上記のプログラムは、出退勤のシステムを構築するための仕組みです。
日々打刻される入出、退出の時間に基づき、1日の所定労働時間、時間外労働時間等を算出します。
そのデータを1月分で合算して実績として出力するという考えです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

現場の設計ポリシーもありましょうし、
そのような構成が本当に必要ならそうするしかないと思いますが…
率直にいって、汎用的に過ぎるよう感じます。
もっと機能的な面から見直した方がいいのでは?

データは必要な時に必要な分があればよい、と個人的には考えます。
どのような運用なのかも分かりませんので想像で書きますが、
もしそのように汎用的な扱いをしたいのならば、(プログラムでなく)
データベースにもたせることも検討してはいかがでしょうか。

投稿2019/05/01 14:42

takasima20

総合スコア7458

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

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

aaiau

2019/05/02 09:23

ご回答ありがとうございます。 前提条件が少なすぎたと思うので、追記させていただきます。 上記のプログラムは、出退勤のシステムを構築するための仕組みです。 日々打刻される入出、退出の時間に基づき、1日の所定労働時間、時間外労働時間等を算出します。 そのデータを1月分で合算して実績として出力するという考えです。 takasima20さんのおっしゃる通りデータベースに持たせるというのもありと思いますが、月の途中で参照することもあるため、計算を行ってデータを保存するタイミングが難しいということもあります。 一つ案として考えてみたいと思います。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問