Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > new в цикле


Автор: php1221 11.12.2011, 22:08
Код

//auto load classes
if ($handle = opendir('class')) {
    while (false !== ($file = readdir($handle))) { 
        if ($file != "." && $file != "..") { 
            include('class/'.$file);
        }
    }
}
closedir($handle);
//manual connect to classes
$db = new db;
$settingsDatabase = new settingsDatabase;
$notices = new notice;
$people = new people;
$html = new html;

Нужно эту часть кода:
Код

$notices = new notice;
$people = new people;
$html = new html;

сделать в первый цикл, чтобы new исполнялось внутри цикла автоматически к каждому названию файла.

Как это лучше сделать?

Автор: WolfAlone 12.12.2011, 02:18
Не совсем понял вопроса, но, возможно вот это код (пример) поможет?
Код

<?php
class class1 {
    public function __construct() {
        echo "Hello world!";
    }
}

$class_name = 'class1';
$a = new $class_name;
?>

Автор: $дмитрий 12.12.2011, 07:25
По идеи так
Код

if ($handle = opendir('class')) {
    while (false !== ($file = readdir($handle))) { 
        if ($file != "." && $file != "..") { 
            include('class/'.$file);
            $sClass = substr($file, 0, -4);
            $$sClass = new $sClass;
        }
    }
}
closedir($handle);

Автор: message 19.12.2011, 21:44
я не понимаю, вы пытаетесь изобрести http://php.net/manual/en/language.oop5.autoload.php? 

Код

// добавляем папки с классами в include path.
$paths = array('/путь/к/папке/с/классами1', '/путь/к/папке/с/классами2', get_include_path());
set_include_path(implode(PATH_SEPARATOR, $paths));

// автозагрузка классов
function __autoload($className) {
    require_once $filename . '.php';
}


Теперь просто вызываете
Код

$db = new DatabaseClass(); 

и autoloader будет искать файл DatabaseClass.php в тех папках которые вы указали

Автор: krundetz 20.12.2011, 09:38
php1221, совместите варианты предложенные message и $дмитрий.

То есть ваш код будет выглядеть примерно так:
Код


function __autoload($className) {
    require_once 'class/' $filename . '.php';
}

if ($handle = opendir('class')) {
    while (false !== ($file = readdir($handle))) { 
        if ($file != "." && $file != "..") { 
            $sClass = substr($file, 0, -4);
            $$sClass = new $sClass;
        }
    }
}


P.S. Обязательно в функции __autoload сделайте проверку на существование подключаемого файла и существование подключаемого класса, как то так:

Код

function __autoload($className) {
    $pathClass = 'class/' $filename . '.php';
    if (file_exists($pathClass)) {
        require_once $pathClass;
        if (!class_exists($className)) {
            throw new Exception('Class not found!');
        }
    } else {
         throw new Exception('File not found!');
    }
}


P.P.S.
message ваш вариант использующий функцию set_include_path имеет неоднозначность в случае нахождения в директориях, для автоматического подключения классов, файлов с одинаковыми именами.

P.P.P.S.
php1221, а как вы собираетесь использовать созданные в цикле экземпляры классов? Возможно есть более разумное решение, нежели то, что вы хотите использовать.

Автор: $дмитрий 20.12.2011, 12:32
Кстати, разумно вместо
Код

$notices = new notice;
$people = new people;
$html = new html;

Использовать единый массив
Код

$lib['notice'] = new notice;
$lib['people'] = new people;
$lib['html'] = new html;
// etc

При использовании вышеуказанных методов в функциях, классах и т.д., ты ж не будешь писать global $notices, $people, $html

Автор: krundetz 20.12.2011, 12:53
$дмитрий, может
Код

$lib['notice'] = new notice;

без new в название элемента ассоциативного массива?

Автор: $дмитрий 20.12.2011, 14:02
упс, скобки пропустил
Код
    
$lib['notice'] = new notice();

Автор: krundetz 20.12.2011, 15:36
Цитата($дмитрий @  20.12.2011,  14:02 Найти цитируемый пост)
упс, скобки пропустил

не со скобками все в порядке, если в конструктор не передаются аргументы, скобки можно опустить, хотя и выглядит это кривовато

Я поправку показал так как на мой взгляд там бы было расхождение в дальнейшем в работе с ассоциативным массивом, так как 'new notice' полноценный ключ, но ожидалось бы 'notice' и запрашивалось скорее всего оно же

Автор: $дмитрий 20.12.2011, 18:34
krundetz, увидел очепятку

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)