В чём преимущество автозагрузчика классов?

Простой код:
spl_autoload_register(function ($class) {
    include 'user/app/' . $class . '.php';
});
 
$obj  = new MyClass();
$obj->displayVar();

В папке user/app/ лежит много классов и преимущество очевидно в том, что не надо include_once или require делать для каждого. Т.е. мы экономим по мути только на времени интерпретации файлов с классами, ведь даже если мы их поключим, но экземпляр не создадим, то ресурсы-то им всё равно не выделяться...
А можно избавиться от строки $obj = new MyClass(); и создавать экземпляр автоматически в момент $obj->displayVar();?
Естественно заранее не создавая "впрозапас" по экземпляру каждого класса.
  • Вопрос задан
  • 355 просмотров
Решения вопроса 3
@D3lphi
ведь даже если мы их подключим, но экземпляр не создадим, то ресурсы-то им всё равно не выделяться...

На декларацию класса, функции тратятся ресурсы (Их же нужно где-то хранить). Код пропускается через лексический анализатор, для каждой лексемы создаются токены, а из токенов строится синтаксическое дерево. Так что, даже просто подключение файла потребляет ресурсы.

А можно избавиться от строки $obj = new MyClass(); и создавать экземпляр автоматически?

Нет, нельзя.

В 2017 году принято использовать composer для автозагрузки, а не писать свои велосипеды.
Ответ написан
HeadOnFire
@HeadOnFire
PHP, Laravel & WordPress Evangelist
Автозагрузка нужна в первую очередь для того, чтобы не подключать их везде (имеется в виду в других классах) руками. Потому что в случае изменения путей, имен файлов и тд потом надо весь код перелопатить и везде все поменять. Плюс, надо помнить что где подключено, чтобы классы были доступны там, где они нужны. Для большого приложения, особенно если использовать ООП во всей красе - interface, abstract, trait и конкретные субклассы, это огромный плюс. Ну и да, классы будут загружаться только если они реально нужны, а не всегда, что сократит в том числе и время парсинга.

А можно избавиться от строки $obj = new MyClass(); и создавать экземпляр автоматически в момент $obj->displayVar();?


( new MyClass )->displayVar();
Ответ написан
Комментировать
GeneMoss
@GeneMoss
void
А можно избавиться от строки $obj = new MyClass(); и создавать экземпляр автоматически в момент $obj->displayVar();?
Естественно заранее не создавая "впрозапас" по экземпляру каждого класса.

Не совсем четкое требование, но по описанию похоже на синглтон. Т.е. вызывать вот так:
MyClass::getInstance()->displayVar();
MyClass::getInstance()->foo();
MyClass::getInstance()->bar();

Объект создастся в момент первого вызова.

В классе реализовать вот так:
class MyClass {
  protected static $instance = null;
  
  protected __construct() { }

  public static function getInstance() {
    if (is_null($this->instance)) {
      self::$instance = new self();
    }
    return self::$instance;
  }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
нет.
Ответ написан
Комментировать
dmitriylanets
@dmitriylanets
веб-разработчик
А можно избавиться от строки $obj = new MyClass(); и создавать экземпляр автоматически?

можно
function __constuct(MyClass $obj){
$this->obj = $obj;
}

container.thephpleague.com/2.x/auto-wiring
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы