2016-10-08 5 views
0

Я построил класс «core», который загружает другие классы, и я хочу автоматически загружать все классы в spesific-папке с именем «class», я начал что-то строить, но понятия не имею если это хорошо.
В функции построения в основном классе я получаю массив с именами классов для загрузки.
Функция конструктора вызывает функцию с именем _loadClasses и в функции _loadClasses,
Я загружаю классы с помощью функции require_once() fucntion.
Тогда в верхней части страницы я добавляю общедоступную переменную с именем класса.
Например, "public $ example;"
Теперь, что осталось, чтобы создать объект класса, так это то, что я сделал.
Пример использования метода _loadClasses:
Автоматическая загрузка классов

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

Здесь приходит "автомат" часть.
Я хочу функцию _loadClasses, чтобы получить массив, например:

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

и теперь, я использую Glob загружать классы из папки «класса», имя синтаксиса файлов классов в папка «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», я хочу загрузить только классные классы, или если ему нужно загрузить все. Как я могу это сделать? спасибо за помощь – guyshitz

+1

Не беспокойтесь об этом, так как автозагрузчик будет использовать только те классы, которые действительно используются. В том, что вы не создаете экземпляр, вам лучше сделать это в конструкторе. –

+0

Прохладный, ты уверен? – guyshitz

-1

Для этого вы можете использовать функцию __autoload(). Он будет вызываться при создании нового объекта.

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

Вы должны использовать один класс для каждого файла и называть файлы такими же, как класс, который они описывают.

+0

По крайней мере, ответьте на это, используя соглашение об именах OPs и вместо этого используйте автозагрузчик spl. – PeeHaa

-1

«это не работает» не является полезной диагностикой. Что не работает? Что такое сообщение об ошибке? В какой строке это происходит? Глядя на код, первый цикл, хотя и немного грязный (почему у вас есть файл с именем index.php в этом каталоге? Почему бы вам просто не заглянуть в * .class.php?), Вероятно, должно работать нормально. Но второй цикл ужасен.

Для начала, зачем загружать все имена файлов в массив в одном цикле, а затем использовать второй цикл для загрузки некоторых из них? Что касается чтения файла класса для определения имени объекта .... слова не дают мне. Просто назовите его как имя файла без .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

Смежные вопросы