2016-10-08 10 views
0

私は別のクラスをロードする "コア"クラスを構築しました。 "class"という名前の特定のフォルダにすべてのクラスを自動的にロードしたいと思っています。それが良いならば。
コアクラスのconstruct関数では、ロードするクラス名の配列が取得されています。
構造体関数は_loadClassesという名前の関数を呼び出し、_loadClasses関数では
私はrequire_once()関数を使用してクラスをロードしています。
次に、ページの上部に、私はクラスの名前を持つpublic変数を追加します。
たとえば、「public $ example;」と入力します。
今、残っているのはクラスのオブジェクトを作成することです、それが私のやり方です。 _loadClasses方法の
例:
自動的にクラスをロードする

require_once("class/user.class.php"); 
self::$user = new User(); 

ここで "自動機械" の部分が来ます。
私は、関数_loadClassesは、例えば、配列、取得したい:

private function _loadClasses($classesToLoad = array('security', 'is')); 

そして今、私は、フォルダ「クラス」からクラスをロードするためのクラスファイルの名前構文をグロブを使用していますがフォルダ "class"はclassname.class.phpです。

$classesArray = array(); // initialize the variable of all the web classes 

    $classesFiles = glob("class/*.php"); // gets all the web classes from the folder 'class' 

    foreach($classesFiles as $file) { // loop on the classes in the folder 'class' 
     $filename = explode('class/', $file); 
     $filename = $filename[1]; 
     $className = explode('.class.php', $filename); 
     $className = $className[0]; 

     if($className != 'index.php' || $className != 'database') { 
      array_push($classesArray, $className); // adds the class name into the array 'classesArray' 
     } 
    } 

    foreach($classesArray as $className) { 
     if(in_array($className, $classesToLoad)) { 
      require_once("class/$className.class.php"); 
      $classLines = file("class/$className.class.php"); 
      $classNameLine = $classLines[1]; 
      $classNameLine = explode(' ', $classNameLine); 
      $classObjectName = $classNameLine[1]; 
      $classObjectName = explode(" ", $classObjectName); 


      self::$$classObjectName = new $classObjectName(); 
     } 
    } 

私はそれだけで私は例をどうしたいものをお見せすることだ、それは動作しません呪いのようなものを、必要とします。
ありがとうございます。

+7

正しいオートローダーを使用してみませんか? – PeeHaa

答えて

2

// Your custom class dir 
define('CLASS_DIR', 'class/') 

// Add your class dir to include path 
set_include_path(get_include_path().PATH_SEPARATOR.CLASS_DIR); 

// You can use this trick to make autoloader look for commonly used "My.class.php" type filenames 
spl_autoload_extensions('.class.php'); 

// Use default autoload implementation 
spl_autoload_register(); 

は、彼らが唯一の彼らの役割の機能に注意する必要がありますので、「コア」オブジェクトの親クラスのオートローディング機能を実装する必要はありません開始するには。 PHPの標準ライブラリを使用してください。

+0

ありがとうございますが、配列 "$ classesToLoad"はどうですか?私は珍しいクラスだけをロードしたい、またはすべてをロードするためにnullの場合はどうしますか?どうやってやるの?助けてくれてありがとう – guyshitz

+1

自動ローダーは実際に使用されているクラスだけなので、心配しないでください。 これらのインスタンスを作成することはできませんが、コンストラクタで行うほうがよいでしょう。 –

+0

クール、本当ですか? – guyshitz

-1

この目的のために、__autoload()機能を使用できます。新しいオブジェクトを作成するときに呼び出されます。

__autoload($class) 
{ 
    require 'dir/to/your/classes/'. $class. '.php' 
} 

ファイルごとに1つのクラスを使用し、ファイルの名前をクラスと同じ名前にする必要があります。私のようなものをお勧めしたい。この特定のアプローチのために

+0

少なくとも、OPの命名規則を使用して回答し、代わりにスプラウトオートローダーを使用してください。 – PeeHaa

-1

「機能しません」は有用な診断ではありません。何がうまくいかない?エラーメッセージとは何ですか?それはどのラインで失敗するのですか?コードを見ると、最初のループが少し乱雑ですが(なぜこのディレクトリにindex.phpという名前のファイルがありますか?なぜ、* .class.phpのためにglobしてみてください)、うまくいくはずです。しかし、第2のループは恐ろしいものです。

まず、すべてのファイル名を1つのループ内の配列にロードしてから、2番目のループを使用してその一部をロードするのはなぜですか?オブジェクト名を決定するためにクラスファイルを読むのは....単語は私には失敗します。単に.class.php

$classesFiles = glob("class/*.class.php"); // gets all the web classes from the folder 'class' 

foreach($classesFiles as $file) { 
    $prefix=array_shift(explode('.', basename($file))); 
    if (in_array($prefix, $classestoload) 
      && !isset($this->$prefix)) { 
     if (!class_exists($prefix)) { 
      require($file); 
     } 
     $this->$prefix=new $prefix(); 
    } 
} 

あなたはオートローダーを使用することができずに、ファイル名としてそれに名前を付けるが、あなたはまた、オートローダーを使用しますが、別の方法で他のコードとの統合場合、これは厄介になります。

+0

説明なしのDownvote?一口。 – symcbean

関連する問題