2015-04-20 3 views
2

Есть список файлов PHP в том же каталоге моего скрипта. Все они следуют соглашению об именах (например, class.foo.php). Когда мой скрипт запускается, я хочу, чтобы он включал эти файлы. Достаточно просто сделать scandir файлов, выполнить тест в каждом элементе в результирующем массиве и include файл.PHP: Как включить и включить классы?

Проблема в том, как создать экземпляр этих классов в моем скрипте (который также является классом)? Файл class.foo.php будет содержать class Foo. Мне нужно создать экземпляр Foo (а иногда просто получить доступ к статическому методу). Я не могу сделать это в запущенном скрипте, потому что он не знает о автоматически включенных классах.

get_included_files бесполезен, потому что он возвращает все включенные файлы в цепочку классов (и меня интересуют только классы, включенные в исполняемый скрипт).

Возможно, я ошибаюсь. Какой способ для меня «автоматически включать» файлы классов и использовать их в запущенном скрипте?

+0

Вы решаете вашу проблему? –

ответ

4

Создать функцию автозагрузки и зарегистрировать его: spl_autoload_register

Правильная функция автозагрузки будет загрузить соответствующий файл при создании экземпляра класса.

Пример из php.net:

function my_autoloader($class) { 
    include 'classes/' . $class . '.class.php'; 
} 

spl_autoload_register('my_autoloader'); 
+0

Спасибо за это. Тем не менее, я все еще немного смущен. Если я делаю '$ a = новый MyClass;' и 'MyClass' еще не включен, функция автозагрузки попытается найти соответствующий файл (в вашем примере,' classes/'. $ Class.. .class.php ''file), что должно позволить мне создать экземпляр этого класса. Отлично, если не знать, что эти классы. Я 'scandir' для файлов и создаю экземпляр из результатов (я обязательно сделаю необходимую фильтрацию) и просто ожидаю, что автозагрузчик будет обрабатывать, включая« на лету »? – StackOverflowNewbie

+1

Зачем вам не знать, что такое классы или файлы? Вы используете случайные файлы или классы в своем коде? – Devon

+0

Я думаю, что стоит отметить, что, пока имена ваших классов совпадают с именем класса класса, определяемым этим файлом, тогда ваш метод будет передан всем именам файлов, чтобы найти тот, который соответствует поисковому классу для. т.е.: приведенная выше функция @Devon найдет и загрузит все файлы, которые $ class = объявленному имени класса в файле, заканчивающемся на .class.php. например: filename = AclassFile.class.Объявление класса php && в файле «class AclassFile» будет автоматически доступно для всех классов в одном каталоге – MER

1

Вы можете использовать __autoload() магический метод. Смотрите этот пример:

./myClass.php

<?php 
class myClass { 
    public function __construct() { 
     echo "myClass init'ed successfuly!!!"; 
    } 
} 

?> 

./index.php

<?php 
// we've writen this code where we need 
function __autoload($classname) { 
    $filename = "./". $classname .".php"; 
    include_once($filename); 
} 

// we've called a class *** 
$obj = new myClass(); 
?> 

Выход:

myClass init'ed successfuly!!! 

Узнайте больше на сайте:

http://php.net/manual/en/function.autoload.php

+1

Обратите внимание, что в правильном направлении следует использовать * spl_autoload_register * as * __ autoload * устарел –

+0

@ FredericYesidPeñaSánchez вы можете предоставить мне ссылку с этой информацией? Я просто прочитал руководство по php, и я не могу найти эту информацию об устаревшем –

+1

'__autoload()' становится беспорядочным, когда вам нужно несколько автозагрузчиков, например, в случае другой библиотеки. –

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