Published 2005-03-29 13:32:38

I had the pleasure (pun intended) of installing a small framework of code today, which broke at least half of the rules I've been building up for the projects I've been working on. The code illustrated very clearly why explicitly typing require_once is not only good idea, it can make the difference between clear readable code, and poor magic.

The error "Fatal error: Call to undefined function: somefunction_xyz() in..." appears after installing the code. Looking at the file, it only contains one line.. somefunction_xyz()!

The framework is supposed to have loaded this file, but as it's not set up correctly, and therefore, it didnt happen. To me this assumption that the file is loaded is flawed to begin with. Ignoring the issue that the framework relies on function libraries, the other fatal flaw is that Frameworks should rarely load more that one 'action' file, which in turn should be reasonably self explainitory where it is getting things from.

The missing require_once makes the code very difficult to follow without inside knowledge (or heavy use of grep) of how the framework may be working, and very little is given away as clues to what should have happened prior to this error occuring.

I guess this harks back to the idea that __autoload() will encourage people to write more code that is less self documenting, almost all languages C#, Java, Python... usually have a list at the top of the page, indicating what they 'import' or 'use' to achieve the aim of the program, PHP uses the require_once to document the source of your libraries. It helps others read your code, and in PHP can also be placed close to the place you actually use the library method. Alot of these language have ways around ending up with this large import list, and often some import's implicitly load others, but in making code readable it's often worth duplicating these, just to ensure that it's readable.

So from the trenches here, please try and make your code readable, other people have to install, set it up, and as quickly as possible understand what you intended to do....

Mentioned By:
www.procata.com : Jeff Moore’s Blog » Blog Archive » Documentation versus Productivity? (79 referals)
phparch.com : php | architect - The PHP Magazine for PHP Professionals (79 referals)
google.com : april (63 referals)
www.phpdeveloper.org : PHPDeveloper.org: PHP News, Views, and Community... (53 referals)
google.com : march (45 referals)
www.procata.com : Jeff Moore’s Blog (42 referals)
www.mail-archive.com : Re: [PHP-DEV] __autoload() enhancement (32 referals)
planet-php.org : Planet PHP (32 referals)
google.com : december (27 referals)
google.com : php require_once (25 referals)
www.procata.com : Jeff Moore’s Blog » PHP (17 referals)
google.com : difference between require and require_once in php (14 referals)
www.procata.com : Professional PHP » 2005 » April (13 referals)
google.com : require_once (12 referals)
google.com : difference between require and require_once (10 referals)
www.midgard-project.org : Midgard Project - Open Source Content Management System (CMS) (8 referals)
www.phpn.org : require_once is part of your documentation. (7 referals)
hades.phparch.com : Require once as Documentation - php | architect — The PHP Magazine for PHP Professionals (7 referals)
www.artima.com : Artima Developer Buzz (6 referals)
google.com : php require once (6 referals)

Comments

or you just ..
find the definition of the __autoload() method once. There you will be able to find the class to file naming rules and instead of grepping for require_once all the time you know the single location. Of course when you mix and match require_once with __autoload is does get nasty and confusing.

idiots will always find ways to make their code unreadable.
#0 - Lukas ( Link) on 2005-03-29 15:58:14 Delete Comment
Mr
Hi Alan - as you're working on frameworks, would you be interested in 'auditing' the Seagull framework? Lot of (probably incorrect) use of DB_DataObject and Flexy, we're always seeking to improve/refine the design, all feedback welcome :-)
#1 - Demian Turner ( Link) on 2005-03-29 21:35:48 Delete Comment

Add Your Comment

Follow us on