organinzing your php projects (2010 memphis php)
DESCRIPTION
By using a single organizational principle, developers can easily make their project structure more predictable, extensible, and modular. The talk will discuss this one lesson, how it can be discovered from researching publicly available PHP projects, how to apply it, and how it is used (or not used) in well-known applications and frameworks.TRANSCRIPT
![Page 1: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/1.jpg)
Organizing YourPHP Projects
Paul M. JonesVP Engineering, Company 52
Memphis PHP26 Aug 2010
![Page 2: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/2.jpg)
Read These• “Mythical Man-Month”, Brooks
• “Art of Project Management”, Berkun
• “Peopleware”, DeMarco and Lister
2
![Page 3: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/3.jpg)
• Examine real-world projects
• The One Lesson for organizing your project
• Elements of The One Lesson
• The One Lesson in practice
Project Planning in One Lesson
3
![Page 4: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/4.jpg)
• Web Architect
• PHP since 1999 (PHP 3)
• Solar Framework (lead)
• Savant Template System (lead)
• Zend Framework (found. contrib.)
• PEAR Group (2007-2008)
• Web framework benchmarks
About Me
4
![Page 5: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/5.jpg)
• Project lead/manager?
• Improve team consistency?
• Want to share your code with others?
• Want to use code from others?
• Want to reduce recurring integration issues?
About You
5
![Page 6: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/6.jpg)
• Security
• Integration and extension
• Adaptable to change
• Predictable and maintainable
• Teamwork consistency
• Re-use rules on multiple projects
Goals for Organizing
6
![Page 7: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/7.jpg)
Project Research;or,
“Step 1: Study Underpinnings”
7
![Page 8: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/8.jpg)
Project Evolution Tracks
Standalone App
Library Collection Modular App
Framework CMS
One-Off Heap
?
8
![Page 9: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/9.jpg)
• No discernible architecture
• Browse directly to the scripts
• Add to it piece by piece
• Little to no separation of concerns
• All variables are global
• Unmanageable, difficult to extend
One-Off Heap
9
![Page 10: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/10.jpg)
• One-off heap ++
• Series of separate page scripts and common includes
• Installed in web root
• Each responsible for global execution environment
• Script variables still global
Standalone Application
10
![Page 11: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/11.jpg)
// Setup or bootstrappingdefine('INCLUDE_PATH', dirname(__FILE__) . '/');include_once INCLUDE_PATH . 'inc/prepend.inc.php';include_once INCLUDE_PATH . 'lib/foo.class.php';include_once INCLUDE_PATH . 'lib/View.class.php';
// Actions (if we're lucky)$foo = new Foo();$data = $foo->getData();
// Display (if we're lucky)$view = new View(INCLUDE_PATH . 'tpl/');$view->assign($data);echo $view->fetch('template.tpl');
// Teardowninclude_once INCLUDE_PATH . "inc/append.inc.php";
Standalone Application:Typical Main Script
11
![Page 12: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/12.jpg)
// expects certain globalsif (! defined('APP_CONSTANT')) { die('Direct access not allowed.');}
Standalone Application:Typical Include File
12
![Page 13: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/13.jpg)
index.php # main pagespage1.php # page2.php # page3.php # sub/ # sub-section index.php # zim.php # gir.php # inc/ # includes config.inc.php # prepend.inc.php # lib/ # libraries foo.class.php # Bundle1/ # Bundle2/ #
Standalone Application:Typical File Structure
13
![Page 14: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/14.jpg)
bin/ # command-line toolscache/ # cache filescss/ # stylesheetsdocs/ # documentationimg/ # imagesinstall/ # installation scriptsjs/ # javascriptlog/ # log filessql/ # schema migrationstheme/ # themes or skinstpl/ # templates
-- no standard naming or structure-- index.html file in each directory
Standalone Application:Support Structure
14
![Page 15: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/15.jpg)
Project Evolution Tracks
Standalone App
Library Collection Modular App
Framework CMS
One-Off Heap
?
15
![Page 16: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/16.jpg)
• Standalone application ++
• Same file structure and script style
• One additional directory: “modules”, “plugins”, etc
• Hooks in the “main” scripts for additional behaviors
• Use global variables to coordinate between modules
Modular Application
16
![Page 17: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/17.jpg)
• Modular application ++
• General-purpose application broker
• All "main" scripts become sub-applications
• Still in the web root, still using globals to coordinate
CMS
17
![Page 18: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/18.jpg)
• Achievo
• Code Igniter*
• Coppermine
• DokuWiki
• Drupal
• Eventum
• Gallery
• Joomla/Mambo
• MediaWiki
• PhpMyAdmin
• Seagull*
• SugarCRM
• Vanilla
• WordPress
Application/CMS Projects
18
![Page 19: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/19.jpg)
Project Evolution Tracks
Standalone App
Library Collection Modular App
Framework CMS
One-Off Heap
?
19
![Page 20: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/20.jpg)
• Specific, limited logic extracted from an app
• Re-used directly in unrelated applications and other libraries
• No global variables
• Class-oriented
• Can exist anywhere in the file system
Library Collection
20
![Page 21: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/21.jpg)
Foo.php # FooFoo/ # Component.php # Foo_Component Component/ # Element1.php # Foo_Component_Element1 Element2.php # Foo_Component_Element2Bar.php # BarBar/ # Task.php # Bar_Task Task/ # Part1.php # Bar_Task_Part1 Part2.php # Bar_Task_Part2
Library Project:Typical File Structure
21
![Page 22: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/22.jpg)
• Codebase
• Library collection
• Apps extend from it
• Support structure
• Bootstrap file
• Public assets
• Protected assets
Framework
22
![Page 23: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/23.jpg)
• AdoDB
• Cake
• CgiApp
• Code Igniter *
• Doctrine
• EZ Components
• HtmlPurifier
• Horde
• Lithium
• Mojavi/Agavi
• PAT
• PEAR
• PHP Unit
• Phing
• Phly
• Prado
• Savant
• Seagull *
• Smarty
• Solar
• SwiftMailer
• Symfony
• WACT
• Zend Framework
Library/Framework Projects
23
![Page 24: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/24.jpg)
include-oriented
class-oriented
Project Evolution Tracks
Standalone App
Library Collection Modular App
Framework CMS
One-Off Heap
?
24
![Page 25: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/25.jpg)
The One Lesson;or,
“Step 2: ... ?”
25
![Page 26: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/26.jpg)
Organize your projectas if
it is a library collection.
![Page 27: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/27.jpg)
• Stop using globals
• Namespace everything
• Class-to-file naming
Elements ofThe One Lesson
27
![Page 28: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/28.jpg)
1. Stop Using Globals
• Stop using register_globals
• Stop using $GLOBALS
• Stop using global
28
![Page 29: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/29.jpg)
• Automatic deconfliction of identifiers
• Classes (“vendor”)
• Functions, variables, constants
• Use with $_SESSION, $_COOKIE, etc. keys
2. Namespace Everything
29
![Page 30: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/30.jpg)
• Project, client, brand, channel
• A short word or acronym, not a letter (“Z”)
• A unique name, not a generic name related to a task(Date, HTML, RSS, Table, User)
Choosing a Namespace
30
![Page 31: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/31.jpg)
PHP 5.2 “Namespaces”
31
// class User {}class Vendor_User {}$user = new Vendor_User();
// function get_info() {}function vendor_get_info()
// $_SESSION["user_prefs"]$_SESSION["Vendor_User"]["prefs"];
![Page 32: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/32.jpg)
PHP 5.3 Namespaces
32
namespace vendor;class User {}
// relative namespacenamespace vendor;$user = new User();
// absolute namespacenamespace other;$user = new \vendor\User();
![Page 33: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/33.jpg)
• Class name maps directly to file name
• Vendor_User => Vendor/User.php
• Horde, PEAR, Solar, Zend, others
• Highly predictable file locations
• Lends itself to autoloading
3. Class-To-File Naming
33
![Page 34: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/34.jpg)
// studly-caps needs preg_replace(), but:VendorAuthOpenId => ... Vendor/Auth/Open/Id.php? Vendor/Auth/OpenId.php?
// underscores just need str_replace()Vendor_Auth_OpenId => Vendor/Auth/OpenId.php
Class-to-File Naming(PHP 5.2, Horde/PEAR)
34
![Page 35: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/35.jpg)
Class-to-File(PHP 5.3, PSR-0)
35
• PEAR, Solar, Zend, Doctrine, Lithium, Symfony 2
\foo_bar\pkg\Main => /foo_bar/pkg/Main.php\foo_bar\pkg\Main_Sub => /foo_bar/pkg/Main/Sub.php
![Page 36: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/36.jpg)
The One Lesson In Practice;or,
“Step 3: Profit!”
36
![Page 37: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/37.jpg)
• Can be used anywhere(app, module, lib, CMS, framework)
• Structure for refactoring and additions
• Testing, profiling, and public files can parallel the same structure
• Intuitive for new developers
• No more include-path woes
Extended Effects of The One Lesson
37
![Page 38: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/38.jpg)
administrator/components/editor/files/help/images/includes/ Vendor/index.phpinstallation/language/mainbody.phpmambots/media/modules/templates/
Mambo CMS
38
![Page 39: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/39.jpg)
project/ application/ bootstrap.php configs/ controllers/ models/ views/ helpers/ scripts/ library/ Zend/ Vendor/ public index.php
Zend Framework
39
![Page 40: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/40.jpg)
app/ config/ controllers/ extensions/ index.php libraries/ models/ resources/ tests/ views/ webroot/libraries/ lithium/ vendor/
Lithium
40
![Page 41: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/41.jpg)
hello/ config/ console/ HelloKernel.phpsrc/ Application/ HelloBundle/ Bundle.php Controller/ Resources/ autoload.php vendor/ symfony/ zend/ vendor/web/
Symfony 2
41
![Page 42: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/42.jpg)
system/ config/ config.php docroot/ index.php public/ include/ Solar.php Solar/ Vendor/ script/ source/ sqlite/ tmp/
Solar
42
![Page 43: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/43.jpg)
include/ Solar/ Vendor/ App/ Page.php Page/ Layout/ Locale/ Public/ View/ Model/ Gir.php Gir/ Zim.php Zim/
Solar Apps Are Libraries Too
43
![Page 44: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/44.jpg)
Refactoring• Move from existing include-based architecture
to class-based architecture ...
• ... by functionality
• ... by script
• Then build scripts out of classes, not includes
• Then build apps out of classes, not scripts
• Leads to MVC / MVP / PAC architecture
44
![Page 45: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/45.jpg)
Summary
![Page 46: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/46.jpg)
• Organize your project as if it will be part of a library collection
• Avoid globals
• Use namespaces for deconfliction
• Use class-to-file naming convention
The One Lesson
46
![Page 47: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/47.jpg)
• Security
• Integration and extension
• Adaptable to change
• Predictable and maintainable
• Teamwork consistency
• Re-use rules on multiple projects
Goals for Organizing
47
![Page 48: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/48.jpg)
• Questions?
• Comments?
• Criticism?
48
![Page 49: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/49.jpg)
49
• <http://paul-m-jones.com>
• <http://solarphp.com>
• Google for “web framework benchmarks”
Thanks!
![Page 50: Organinzing Your PHP Projects (2010 Memphis PHP)](https://reader036.vdocuments.mx/reader036/viewer/2022081400/549bf5bcb47959d9318b45fd/html5/thumbnails/50.jpg)