Я хочу сделать то, что в названии. Например, я включаю все файлы с моими классами:
foreach(glob("library/*.php") as $file)
include $file;
После этого я определил все свои классы. Некоторые из них имеют статическую функцию, названную, например, __initiation. Как выполнить все из них после включения? Что-то вроде этого:
foreach( {classes} as $class ){
if( function_exists( $class . '::__initiation' ) )
$class::__initiation();
}
Я хочу сделать это, потому что некоторые классы должны быть подготовлены (например, подключение к базе данных), а некоторые классы должны использовать другие классы. Часто в обоих направлениях (класс с именем foo должен использовать класс инициации с именем bar, а класс named bar должен использовать класс с именем foo). Кто-нибудь знает, как это сделать?
Пример:
class database{
// some stuff
public static __initiation(){
database::connect();
foo::bar();
}
}
class foo{
// some stuff
public static bar(){/* blah blah blah */}
public static __initiation(){
database::select(/* blah blah blah */);
foo::start();
}
}
// Execute all declared {classname}::__initiation() function right now.
Заранее спасибо за помощь.
Основная проблема, с которой вы столкнетесь, заключается в том, что файлы являются списком в алфавитном порядке. Но зависимости между ними не в этом порядке, например, ссылки на бары foo, foo еще не загружен, когда загружается бар.
Знаете ли вы функциональность __autoload? Вот мой класс AutoLoader, который может вам помочь:
<?php
namespace de\g667\util;
class AutoLoader
{
/**
* Registers the autoload-function. All needed classes and interfaces will be
* automatically loaded on demand.
*/
static function register() {
spl_autoload_register(
function ($class) {
$class = str_replace ("\\", "/", $class);
$cwd = getcwd();
$filepath = $class.'.php';
$path = PATH . DIRECTORY_SEPARATOR . $filepath;
if( ! file_exists($path) ){
error_log("Autoloading $class failed");
}
require_once $path;
}
);
}
static function setPath($path) {
define("PATH", $path);
}
}
?>
Сохраните этот код в /library/de/g667/AutoLoader.php
Использование автозагрузчика:
<?php
require_once 'library/de/g667/util/AutoLoader.php';
use de\g667\util\AutoLoader;
AutoLoader::setPath("/path/to/library");
AutoLoader::register();
?>
Имейте в виду наличие одного файла для каждого класса в библиотеке. Вставьте свой экземпляр funcion в AutoLoader, тогда вы сможете легко создавать экземпляры своих классов.
{classname}::__initiation();
, Посмотрите на мой вопрос, я добавил простой пример.
$file
, сделать$file::__initiation();
? Если вы назвали свои классы в соответствии с вашими php-файлами, это должно сработать (конечно, после того, как вы удалили расширение вручную).