загрузка классов в реестр на php

232
09 августа 2017, 20:45

использую реестр:

class Registry {
    public static $objects = array();
    protected static $instance;
    /*protected function __construct() { //метод для автодобавления классов в файл конфигурации
        global $config;
        foreach ($config['pages'] as $name => $obj) {
            self::$objects[$name] = new $obj;
        }
    }*/
    public static function instance () {
        if(self::$instance === null) {
            self::$instance = new self;
        }
        return self::$instance;
    }
    public function __set($name, $value) {
        if (!isset(self::$objects[$name])) {
            self::$objects[$name] = new $value;
        }
    }
    public function __get($name) {
        if (is_object(self::$objects[$name])) {
            return self::$objects[$name];
        }
    }
}

для того чтоб пользоваться нужными классами в необходимое время и необходимом месте кода, далее загрузчик всех дополнительных классов из папок libs и models:

    class LoadClasses {
    private $app;
    public function __construct() {
        return $this->app = Registry::instance();
    }
    public function LoadLibs ($dir) {
        if($handle = opendir($dir)){
            while(false !== ($file_dir = readdir($handle))) {
                if($file_dir != "." && $file_dir != ".."){
                    $data = file_get_contents($dir.'/'.$file_dir);
                    preg_match_all('/class [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $data, $matches);
                    if (!empty($matches[0])) {
                         foreach ($matches[0] as $val) {
                             $className = 'lib_'.substr($val, 6);
                             $this->app->$className = substr($val, 6);
                         }
                    }
                }
            }
        }
    }
    public function LoadModels ($dir) {
        if($handle = opendir($dir)){
            while(false !== ($file_dir = readdir($handle))) {
                if($file_dir != "." && $file_dir != ".."){
                    $data = file_get_contents($dir.'/'.$file_dir);
                    preg_match_all('/class [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $data, $matches);
                    if (!empty($matches[0])) {
                         foreach ($matches[0] as $val) {
                             $classNameMods = 'mod_'.substr($val, 6);
                             $this->app->$classNameMods = substr($val, 6);
                         }
                    }
                }
            }
        }
    }
}
$loader = new LoadClasses();

в чем собственно проблема, все файлы с кассами из каталога libs успешно обрабатываются и заносятся в реестр и после этого я могу с ними работать когда мне это нужно и где, но вот с классами из каталога models проблема что они выводят результат даже если не обращаться к этому классу в файле индекс вызываю загрузчики классов:

$loader->LoadLibs(WWW.'/libs');
$loader->LoadModels(WWW.'/models');

пример класса из каталога libs:

class validateForms {
    public function FormData ($data) {
        echo $data . ' Fuck! ';
    }
}

пример класса из каталоога models:

class MainModel extends Model {
    public function mainModel () {
        echo __CLASS__." model! ";
    }
}

почему классы из models выводят результат даже если к ним не обращаться??? будно сами собой!

Answer 1

Ну потому что у вас название функции mainModel а название класса MainModel. Такую ситуацию PHP воспринимает равносильно __construct.

READ ALSO
Передать значение checkbox методом POST в цикле

Передать значение checkbox методом POST в цикле

Добрый деньЕсть одна проблема

252
Ошибка 0xC0000005

Ошибка 0xC0000005

Пишу стек на плюсахExeшник компилится и крашится с ошибкой 0xC0000005

360