Build an Object-oriented File System in PHP (cont'd)
Simplify Hyperlink Maintenance
Easy templates are great, but there's more to a useful Web site than just looks. Pages in useful sites are often heavily linked together. As the site grows, managing the links and keeping them working can become a huge problem, particularly when you need to move pages or folders around. Inheritance makes link maintenance significantly easier, although it does not completely alleviate the problem.

Implementing page inheritance will require a change in link syntax. Typically, a site might use HTML such as the following.

      <a href="/folder/page.php">description</a>
advertisement
In contrast, with the OOP file system, you call a special page() PHP function to create a link:

      <? page("page.php", "description"); ?>
Using this function, you no longer need to provide the full path for links; you just specify enough to uniquely identify a page, and the system figures out the rest of the path from context. For a page in the current directory or its parent directories, the filename is sufficient. For example, to link to /bears/pictures.php from /bears/species/black.php, you would write:

      <? page("pictures.php", "Pictures"); ?>
For a page in a sibling folder, you'll need to provide the sibling name and the file name. For example, if you wanted to link to /animals/bears/habitat.php from /animals/wolves/species/index.php, you could write:

      <? page("bears/habitat.php", "Bear Habitats"); ?>
This is significantly easier than specifying either the full path or a relative path in HTML, which would be /animals/bears/habitat.php or ../../bears/habitat.php. The full path works regardless of where it is linked from, but causes problems if the page you link to ever moves. For example, if you renamed /animals/ to /mammals/, all the links to the /animals/ section would break. Using relative links avoids that problem, but breaks if you move the page you link from. However, using inheritance, neither situation causes a problem.

The page() function works on the same underlying concept as the include() function and its include_path variable—it searches for whatever file name you give it, starting in the current directory and traveling upward through parent directories until it finds something or runs out of places to look. The function itself is fairly simple; it mostly just calls a generic search_parents() function and prints the result as HTML. The search_parents() function does a few sanity checks, then executes the actual search, making sure to keep track of both the real location of the file on disk, and its virtual location on the Web server. The actual details and implementation are mundane, but nevertheless important. Look through the commented inherit.inc file for more detail, in the downloadable code provided with this article.

Previous Page: Use Include Files to Provide Inheritance Next Page: Dealing with Images


Page 1: IntroductionPage 4: Dealing with Images
Page 2: Use Include Files to Provide InheritancePage 5: Putting It All Together
Page 3: Simplify Hyperlink Maintenance