Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

__autoload vs include family

Tags:

php

I've discovered the __autoload function today and after reading the official manual page of this function there's a point I don't get at all.

What's clearly the difference between using __autoload() and let's say require_once?

because it looks autoload is the new fashion way of doing the required includes but to me it's far better to use require_once instead. Hence, __autoload has to be defined into all the php files which means writing its code down there, if I put ALL my includes/require_once/...etc into one file let's call it main_header.php then all I'll need to do in my web app files is write one line of code:

<?php require_once('main_header.php');  ?> 

Am I wrong somewhere?

like image 624
CoolStraw Avatar asked Jun 22 '11 08:06

CoolStraw


4 Answers

I can see two things going for autoloading (not necessarily __autoload; prefer the more modern spl_autoload_register instead):

  1. You don't need to explicitly include the classes. Of course, you could make a main_header.php as in your example, but then the next item comes into effect.
  2. You don't have to load 100 classes if you are only going to use 10 of them.

It's also worth to point out that autoloading is also triggered when unserializing an object of a class that has not been yet defined, which makes things infinitely more practical. Of course there is another hook in unserialize for this (the configuration setting unserialize_callback_func), so autoloading is not technically necessary. It's definitely nicer though.

like image 79
Jon Avatar answered Nov 15 '22 14:11

Jon


First: Use spl_autoload_register() instead of __autoload().

The autoloader is called, when you try to access a class, that doesn't exists. With include() you just include a class. The main difference is, that using an autoloader the class is only included, if its really required/used.

Usually you define an autoloader in one file and include this one on every request. If you use bootstrapping (meaning: a single file, that catches every request and redirects it to the appropriate target) its only required to define the autoloader there. So its its not required to define it in every file.

like image 40
KingCrunch Avatar answered Nov 15 '22 13:11

KingCrunch


Autoloader is used for lazy initialization. It's the most effective with MVC architecture, not with websites that include a file here and there and define db connection string in every file (which is terrible).

Using autoload with MVC framework saves resources and brings a lot to modularity. Since you don't have to include files with classes, you just instantiate a class you require in the controller you're currently at.

Basically, it's an OOP thing. You shouldn't worry about it if you're not using object approach to structuring your website and include/require is what will work for you.

like image 43
Michael J.V. Avatar answered Nov 15 '22 15:11

Michael J.V.


I think it comes down to personal preference. For me, autoload is a typical php kind of thing - a dirty "magic-quotes"-alike hack, that only exists because they don't bother to sit down and code a clean solution to the problem - in this case, an adequate packaging system + a catchable ClassNotFound exception. Until we've got this fixed, I'll stick to include.

like image 44
user187291 Avatar answered Nov 15 '22 15:11

user187291