• 締切済み

class定義のphpをファイル分割したい

classを定義したファイルに複数のfunctionがあります。 functionもコードも多くなったので、ファイルサイズが大きくなりました。 そこで、同じクラスのままファイルを分割したいのですがどうやればできますでしょうか。   同じクラス名のファイルに分割->だめですね  functionだけ別ファイルにして、includeで取り込む。->だめみたい。

  • PHP
  • 回答数2
  • ありがとう数0

みんなの回答

  • JaneDue
  • ベストアンサー率75% (263/350)
回答No.2

別ファイル分を別クラスとして定義、requireして、 class 現在のクラス extends 別クラス{~} と継承を利用すれば分割できないこともありません。ただし本来の意味からすると ??? です。 個人的には無理に分割すべきではないと考えますが、どうしても分割するならファイル操作やデータの取得・整形など、現在のclassに別のオブジェクトが隠れていないかを見直し、それを別クラスにする方が遥かに良いかと。(1クラスが冗長になった場合、大抵別の「何か」を発見できます) また継承以外では __call()を定義して別ファイルの関数を取込む等いろいろな方法があるにはありますが、関数内で$thisが使えない、private等のアクセス権がぐだぐたになるなどどの方法も一長一短、見通しは悪くなります。

回答No.1

リファクタリング。 具体的には  ・命令の簡略化  ・クラスの細分化及び、責任範疇の分離化 などが挙げられるでしょう。 PHPはC#などのようにpartial指定は出来ないので、 1クラスを複数ファイルにまたいで定義することは できません。 また、肥大化してきたとしても、そのクラス内で絶対的に 必要な機能なら、分割する必要はどこにもありません。 1つのfunctionが100行も200行もあるなら、privateメソッドを 利用してリファクタリングすれば済む話です。

tomoac
質問者

補足

ありがとうございました。でもすみません。難しすぎて理解できませんでした。

関連するQ&A

  • classファイルの取り扱い方

    クラスファイルをnewをしてから関数を呼び出す場合と クラス名::関数名で呼び出す場合だとパフォーマンスやメモリの負担などの違いは在りますでしょうか? また、独自のpublic function関数のみのファイル(lib.php)をclassで囲ってあるのですが、 実際はincludeして扱うので、classで囲わなくても問題はないと思うのですが、どこのクラスにあるのかという目安として囲っています。 上記のファイル関数を呼び出す場合に 1.newをしてから$クラス変数->関数名(); 2.それともクラス名::関数名(); 3.そもそもclassで囲わないで、関数名();のみ コーディングルールがないのでどれが一般的なのかが分かりません。 教えて下さい。

    • ベストアンサー
    • PHP
  • PHPでのClass使用について

    これまで社内で1人でPHPコーディングを担当していたので、複数人での開発を経験した事がなく、Classを使用した事がありません。 PHPでもClassを使用するのが主流かと思うのですが、Classの有用性が今ひとつ理解出来ずにいます。 開発用のライブラリは用意しているのですが、「接続用function」などfunctionのみを使用してコードを纏めています。 現状このやり方で全く困っていないのですが、Classを使用する事でどんなメリットがあるのでしょうか? 使い慣れていないせいなのでしょうが、Class化する事で機能を纏め過ぎてより面倒臭くなっているような気がします…。

    • ベストアンサー
    • PHP
  • C++ proxy class の質問

    C++の学習者です。Visual Studio Community 2015の上で、教本を使って勉強しています。 その中でproxy class のサンプルコードがあり、忠実にキーボードから入力してビルドしようとしたのですが、添付画面写真のようなエラーメッセージが出て、出来ませんでした。 ちゃんとクラスの定義ファイルもありますので、「識別子がクラス名でも名前空間名でもありません。」などというメッセージがどうして出るのかわかりません。 詳しい方がいらっしゃいましたら、どうぞ教えて頂きたく、お願いいたします。 プロジェクトに含まれるソースファイルやヘッダーファイルなどを下にコピーしてあります。 (1) メインプロジェクトファイル : // ConsoleApplication84.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 // example of proxy class #include "stdafx.h" #include <iostream> #include <iomanip> #include <cstdlib> #include <ctime> #include <cmath> #include <cstring> #include <new> using namespace std; #include "interface.h" int main() { Interface i(5); cout << "interface contains : " << i.getValue() << " before setValue()" << endl; i.setValue(10); cout << "interface contains : " << i.getValue() << " after setValue()" << endl; return 0; } (2) Implementation クラスのヘッダー... クライアントから隠しておきたいクラス #pragma once // header file for class Implementation // example of proxy class class Implementation { public: // constructor Implementation(int v) : value(v) // initialization syntax { // empty body } // set value to v void setValue(int v) { value = v; } // return value int getValue() const { return value; } private: int value; };// end class definition (3) Interface クラスのヘッダー ... Implementation の proxy class #pragma once // header file for Interface class class Implementation; // forward class declaration // use this format when a pointer or reference to // class Implementation is used // do not write as " #include "inplementation.h" " class Interface { // this is the proxy class of Implementation class public: Interface(int); void setValue(int); int getValue() const; ~Interface(); private: Implementation *ptr; // use a pointer to an object in Implementation class }; 【4】Interface クラスの関数定義 // interface.cpp // definition of member function for Interface class #include "interface.h" #include "implementation.h" #include "stdafx.h" // constructor Interface::Interface(int v) : ptr (new Implementation(v)) // initialize pointer { // empty body } // set value function void Interface::setValue(int v) { ptr->setValue(v); // do not take the form of assigning the value to the private pointer ptr // but use the public function of setValue() of Implementation class through pointer ptr // this way the client(or main() program ) of class Implementation does not access to // the actual inside code of the class definition } // return value int Interface::getValue() const { return ptr->getValue(); } // destructor Interface::~Interface() { delete ptr; }

  • PHP4でのSmarty派生クラスの定義について

    こんにちはよろしくお願いします。 PHP4でSmarty派生クラスを定義する方法を教えてください。 PHP5のサンプルコードで次のようなものがありました。 PHP4では,「private」が使えないらしいとか,「__construct」ではなくてクラス名がコンストラクタ名になるとかでうまくいかないようです。どのように修正すればよいのでしょうか? また,「__destruct」はどのようにすれば良いのでしょうか?コンストラクタ名とデストラクタ名が同じでよいのでしょうか? よろしくお願いします。 <?php require_once("DB.php"); require_once("Smarty/libs/Smarty.class.php"); class MySmarty extends Smarty { private $_db; public function __construct() { $this->Smarty(); $this->template_dir="../templates"; $this->compile_dir="../templates_c"; $this->_db=DB::connect("sqlite://localhost/samples.db"); } public function __destruct() { $this->_db->disconnect(); } public function getDb() {return $this->_db;} } ?>

    • ベストアンサー
    • PHP
  • include無しにclassが書けない

    粗末な質問タイトルで申し訳ありません。 Visual C++2010で、includeを書かずにclass宣言を行おうとすると「Error:PCH警告」が発生します。 この理由をご教授ください。 IntelliSense: PCH 警告: 適切なヘッダー停止位置が見つかりません。 というエラーメッセージが表示されるのですが、これはプロトタイプ宣言がないときに発生する警告らしいですね。私が書こうとしているソースコードを次に示します。 -----main.cpp---- class TestClass {}; int main(void) { return (0); } ----------------- このソースで、"class"の部分に赤波線が引かれて先述のエラーメッセージが表示されます。 このソースの先頭に#include<iostream>なり#include<stdlib.h>なり何かインクルードを記述すると警告はなくなります。 しかしクラスはその枠のみですし、ライブラリ関数も何も使用していないのでとくに必要なインクルードファイルも何もないと思うのですが、どうしてこのようなエラーが発生するのでしょうか。 あと、蛇足になりますが、本来はクラス宣言部分を別のヘッダーファイルに分けたいのです。 クラス宣言部分を別のヘッダーに分離してヘッダーの先頭に #pragma once を記述するか、分離したヘッダをmain.cpp内でインクルードしてもエラーは解消されます。 (何からもインクルードされなかったらエラーになる) もう何が何やらさっぱりわからないです><

  • PHP 設定ファイルとユーザ定義関数

    ある機能を満たすためのライブラリ(lib.php)を作成しました。 このlib.phpはユーザ定義関数の寄せ集めです。 それぞれのユーザ定義関数では、設定ファイル(config.php)に記述されている共通変数を利用します。 このconfig.phpなのですが、ユーザ定義関数ごとにincludeする以外の方法はあるでしょうか? lib.php function one() { $hensu1... $hensu2... ...処理; } function two() { $hensu1... ...処理; } .... config.php $hensu1 = 1; $hensu2 = 2; ... という構成です。 function one,function twoでconfig.phpの変数を利用したいのですが、lib.phpの先頭でinclude "config.php"をしてもfunctionの中では変数のスコープが有効にはならず、 lib.php function one() { include "config.php"; ...処理; } function two() { include "config.php"; ...処理; } としています。 PHP5を使用しています。 function one() { global $hensu1... } としたらよいのでしょうか? どなたかアドバイスいただけますと幸いです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 外部ファイルのクラスのインスタンスが生成できない

    いつもお世話になっております。 PHP(Ver5.2)が利用できるレンタルサーバーを借りていろいろやっているのですが、 include_once した外部PHPファイルの中のクラス定義のコンストラクタがCallされません。 //外部クラスの記述 class A{ public function __construct(){ echo "OK"; } } //メインPHPの記述 include_once "xxx.php"; $obj = new A(); ↑におけるメインPHPをブラウザから呼び出したとき、本来なら OK とechoされるはずなのに、何も表示されません。 また、クラスAに定義したpublicなfunctionをCallしようとすると、定義されてないメソッドをCallした、とエラーになります。(インスタンス自体が生成されていない??) ファイル自体は正常にIncludeされていると思います。(ファイル名を間違ったらエラーになったから) ちなみに、クラスAの記述をメインPHPに記述すると、正常に動きます。 外部ファイルのクラスを正常に動かすにあたって、何かphp.iniあたりの編集が必要なのでしょうか? どうぞよろしくお願いいたします。

    • 締切済み
    • PHP
  • CSSで定義していないclass指定を削除したい

    CSSで定義していないクラスを、HTML内に多数記述しているのですが、それを簡単に特定出来る方法はありますでしょうか。 例をあげますと、 [HTML] <div class="test01">XXXXXXXXXX</div> [CSS] .test000 { font-size: 18px; } みたいな状態で、HTMLで呼び出しているclass名がCSSで定義していないのです。 CSSとHTMLを照らし合わせ、1個づつ確認するのが確実だとは思うのですが、1000ページ程度あり目視確認は現実的ではないので、、、。 アプリケーションはDreamweaverをつかっています。 どなたか方法をご存知の方がいらっしゃいましたら、宜しくお願いします。

  • フォームプログラムでのファイル分割

    先日よりお世話になっています。VC++フォームプログラムのスコープに関する質問です。 フォームプログラムではデザイナモードでGUIで作成したデザインや割り込み、プロパティなどが、自動的にソースとして全てForm1.hに作成されます。さらに自分で処理を追加していくわけですが、Form1.hが膨大になってしまうこともあり、デザインに関する部分以外を別のファイルanother.cppで書きたいのですがうまくいきません。どうか知恵をお貸しください。 まず、現在のForm1.hの構成は、 --Form1.h----------------------------------------------------- namespace namForm1{ class Form1{ private: void func(); //プロトタイプ ・・・・・・・・ } ・・・・・ } void namForm1::Form1::func(){・・・} //関数定義 --------------------------------------------------------------- のようになっており、ここでフォームプログラムの処理が全て記載され、実質のメインともいえるような作りになっています。 ですが、Form1.hのコード量が増えて見辛くなることを嫌って、Form1.hで書いてある関数func()などを内容をanother.cppに出したいのです。another.cppからnamForm1の名前空間を使おうとしても、当然「識別子がクラス名でも名前空間名でもありません。」怒られますし、another.cppにForm1.hをインクルードしてもやはり、「識別子がクラス名でも名前空間名でもありません。」となります。このプログラムをスマートにファイル分割する方法を教えてください。お願いします。

  • エクセル自ファイルを分割保管したい

    WinXP Excel2002 です。 ひとつのブック(自ファイル)にユーザー定義関数を多用したシートが複数あり、配布のために分割保管しようとしています。 自ファイルに関数があり、分割のコードも記述しようとしています。(※自ファイルのボタンをクリックして配布用ファイルを作成したい) 自ファイルを別名保管して不要シートを削除しようと考えました。 MyPath=ThisWorkbok.pathでフルパスを取得 This Workbook Save As フルパス別名 としたところ、 見えるファイルは  フルパス別名 のみとなり、元の自ファイル名は見えなくなります。 手作業の結果と同じなので「あぁ、なるほど」と思うのですが適切な対応方法がわかりません。 分割のためのコードを別ファイル(B)に記述し、自ファイルのボタンに (B) のコードを割り当てればよいのか?とも思うのですが、自ファイルは月例でフォルダが変わるのですごく厄介な気がします。 自ファイルの関数を有効にしたまま マクロボタン1クリックで分割保管する方法についての手順をご教授いただきたくお願いいたします。