Потенциальный PHP памяти боров или нет? - PullRequest
2 голосов
/ 02 января 2011

Эй, мне нужен совет. Это небольшая функция, которую я написал "хорошо", или это будет боров ресурсов? Используется следующим образом:

$login = load_class('LoginClass');

или

load_class('LoginClassTwo', false); // for singletons and stuff
$loginTwo = LoginClassTwo::getInstance();

Вот функция

function load_class($class, $instantiate = TRUE){

static $obj = array(); // holds the instancec of the classes

$l = strtolower($class); // the name of the file is the name of the class but lowercased

if (isSet($obj[$l])) { // Do we have an instance?

    return $obj[$l]; 
}

$file = 'classess/' . $l . '.class.php';
if (file_exists($file) && is_readable($file)) { // Can we read the file?

    include $file;

    if ($instantiate == FALSE) { // Do we need to instantiate?

        $obj[$l] = TRUE;
    } else {

        $obj[$l] = new $class;
    }

    return $obj[$l];
}

return FALSE;  }

Я обеспокоен тем, что этот метод неэффективен и будет использовать слишком много памяти, или я ошибаюсь? И есть ли лучшая практика для этого?

Ответы [ 3 ]

1 голос
/ 02 января 2011

Это распространенный шаблон, известный как реестр или локатор службы.

может быть проблемой с глобальным реестром объектов, так как эти объекты не восстанавливаются до завершения сценария. Если один из этих объектов использует много памяти, то все готово. Однако, сам по себе, это не проблема, с точки зрения памяти.

Вы должны рассмотреть, какие объекты вы хотите удерживать в глобальном масштабе. Общепринято, что глобальные объекты вносят вклад в общую сложность и взаимосвязь программы. Может быть, вы могли бы передать некоторые из них в качестве параметров в конструкторе, а не обращаться к ним глобально? Конечно, это полностью зависит от варианта использования.

Наконец - php имеет функцию autoload , благодаря которой он загружает класс из файла, если он еще не определен. Вы должны подключиться к этому, вместо того, чтобы помещать логику в свой реестр.

0 голосов
/ 02 января 2011

PHP имеет встроенную функцию __autoload для классов. он запускается каждый раз, когда вы пытаетесь создать новый объект из класса, который еще не существует. функция попытается включить файл класса, используя имя класса в качестве файла класса. Вот почему многие проекты используют один файл на класс. таким образом, вам никогда не нужно снова загружать класс вручную, и классы никогда не загружаются без необходимости Смотрите следующую ссылку.

http://www.php.net/manual/en/language.oop5.autoload.php

0 голосов
/ 02 января 2011

Я не вижу ничего подобного в вашем коде. Если вы испытываете подобные вещи это, вероятно, класс, который вы загружаете

...