PHP 5.3 and Lithium: the most rad php framework

G Woo
G Woocat herder
Wednesday, February 24, 2010
PHP 5.3



Wednesday, February 24, 2010
Why?
                   •      Speed & Memory        •   Phar

                   •      Namespaces            •   ext/intl

                   •      Anonymous Functions   •   ext/fileinfo

                   •      Late Static Binding   •   ext/sqlite3

                   •      Syntax enhancements   •   mysqlnd

                   •      SPL



Wednesday, February 24, 2010
Speed & Memory
                                                                                                                        Drupal 20% faster
                                                                                                                        Qdig 2% faster
                                                                                                                        typo3 30% faster
                                                                                                                        wordpress 15% faster
                                                                                                                        xoops 10% faster
                                                                                                                        http://news.php.net/php.internals/36484




                         http://sebastian-bergmann.de/archives/745-Benchmark-of-PHP-Branches-3.0-through-5.3-CVS.html




                               gc_enable() : New Garbage Collector




Wednesday, February 24, 2010
Namespaces
                      http://php.net/manual/en/language.namespaces.php


                   • Autoloading made easy
                   • lithiumcoreLibraries
                   • li3_docscontrollersBrowserController
                   • http://groups.google.com/group/php-
                           standards/web/psr-0-final-proposal



Wednesday, February 24, 2010
Namespaces Example
                               <?php

                               namespace app;

                               use appmodelsPost;

                               class PostsController extends lithiumactionController {

                                    public function index() {
                                        $posts = Post::all();
                                        return compact(‘posts’);
                                    }
                               }

                               ?>




Wednesday, February 24, 2010
Autoloading
                http://groups.google.com/group/php-standards/web/psr-0-final-proposal

                  <?php

                  function __autoload($className)
                  {
                      $className = ltrim($className, '');
                      $fileName = '';
                      $namespace = '';
                      if ($lastNsPos = strripos($className, '')) {
                          $namespace = substr($className, 0, $lastNsPos);
                          $className = substr($className, $lastNsPos + 1);
                          $fileName = str_replace('', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
                      }
                      $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';

                       require $fileName;
                  }

                  ?>




Wednesday, February 24, 2010
Anonymous Functions
                       http://php.net/manual/en/functions.anonymous.php


                   • Lambda
                         •     assigned to a variable

                         •     useful for recursion and multiple calls

                   • Closure
                         •     added as a method parameter

                         •     use() the parent scope




Wednesday, February 24, 2010
Lambda Example
                                 <?php

                                 $cube = function ($value) {
                                      return ($value * $value * $value);
                                 };
                                 $result = array_map($cube, array(1, 2, 3));
                                 var_dump($result);
                                 /*
                                 array
                                    0 => int 1
                                    1 => int 8
                                    2 => int 27
                                 */

                                 ?>




Wednesday, February 24, 2010
Another Lambda
                               $multiply = function ($value, $times) use (&$multiply) {
                                   return ($times > 0) ? $multiply($value * $value, --$times) : $value;
                               };
                               var_dump($multiply(2, 3));
                               /*
                               int 256
                               */




Wednesday, February 24, 2010
Closure Example
                      <?php
                      $data = 'string';
                      $result = array_filter(array(1, 2, 'string'), function ($value) use ($data) {
                           return ($value !== $data);
                      });
                      var_dump($result);
                      /*
                      array
                         0 => int 1
                         1 => int 2
                      */

                      ?>




Wednesday, February 24, 2010
Crazy Example
                         <?php

                         function Y($F) {
                             return current(array(function($f) { return $f($f); }))->__invoke(function($f) use ($F) {
                                 return $F(function($x) use ($f) {
                                     return $f($f)->__invoke($x);
                                 });
                             });
                         }

                         $factorial = Y(function($fact) {
                             return function($n) use ($fact) {
                                 return ($n <= 1) ? 1 : $n * $fact($n - 1);
                             };
                         });

                         var_dump($factorial(6));
                         /*
                         int 720
                         */

                         ?>




Wednesday, February 24, 2010
Why Static?
                               • Promotes proper
                                 application design

                               • Stateless
                               • Easier to access



Wednesday, February 24, 2010
Late Static Binding
                                      http://php.net/lsb
                               <?php
                               class A {
                                   public static function who() {
                                       return __CLASS__;
                                   }
                                   public static function test() {
                                       return static::who();
                                   }
                               }
                               class B extends A {
                                   public static function who() {
                                       return __CLASS__;
                                   }
                               }

                               $result = B::test();
                               var_dump($result);
                               /*
                               string 'B' (length=1)
                               */




Wednesday, February 24, 2010
Standard PHP Library (SPL)
                               http://us.php.net/manual/en/book.spl.php


                               •   spl_autoload_register()

                               •   Iterators

                               •   Exceptions

                               •   File Handling

                               •   Observer/Subject

                               •   Stack, Queue, Heap, ObjectStorage




Wednesday, February 24, 2010
Syntax Enhancements
                               http://php.net/manual/en/language.oop5.magic.php


                   •      PHP 5 < 5.3                     •   PHP 5.3

                         •      __set()/__get()               •   __callStatic()

                         •      __isset()/__unset()           •   __invoke()

                         •      __call()                      •   ?:




Wednesday, February 24, 2010
Phar
                               • PHP archives
                               • includable
                                 (include 'phar:///path/to/myphar.phar/file.php')


                               • stream accessible
                               • distributable


Wednesday, February 24, 2010
ext/intl
                               • Collator
                               • Locale
                               • IntlDateFormatter
                               • NumberFormatter


Wednesday, February 24, 2010
ext/fileinfo
                               <?php

                               $info = new finfo(FILEINFO_MIME);
                               $result = $info->file(__FILE__);
                               var_dump($result);
                               /*
                               string 'text/x-php; charset=us-ascii' (length=28)
                               */

                               $result = finfo_file(finfo_open(FILEINFO_MIME), __FILE__);
                               var_dump($result);
                               /*
                               string 'text/x-php; charset=us-ascii' (length=28)
                               */
                               ?>




Wednesday, February 24, 2010
ext/sqlite3
                   •       SQLite is a in-process library that implements a
                           self-contained, serverless, zero-configuration,
                           transactional SQL database engine (http://www.sqlite.org/
                           about.html)



                   •       A more compact format for database files.

                   •       Support for both UTF-8 and UTF-16 text.

                   •       Manifest typing and BLOB support.

                   •       New API via Sqlite3 class or sqlite3 functions



Wednesday, February 24, 2010
mysqlnd
                  • mysql native driver
                  • faster
                  • easier to compile
                  • transparent client, same old mysql/mysqli


Wednesday, February 24, 2010
Lithium
                               the most rad php framework




Wednesday, February 24, 2010
In Lithium
                               • Namespaces
                               • Anonymous Functions
                               • Late Static Binding
                               • Syntax Enhancements
                               • SPL
                               • Phar
                               • Sqlite3
Wednesday, February 24, 2010
Lithium Namespaces
                               •   action     •   security

                               •   analysis   •   storage

                               •   console    •   template

                               •   core       •   test

                               •   g11n       •   tests

                               •   net        •   util



Wednesday, February 24, 2010
Namespace Example
                   <?php

                   namespace appextensionshelper;

                   class Form extends lithiumtemplatehelperForm {

                           public function config(array $config = array()) {
                               ....
                           }
                   }




Wednesday, February 24, 2010
Anonymous Functions
                   Example
                               <?php

                               Validator::add('role', function ($value, $format, $options) {
                                   return (in_array($value, array('admin', 'editor', 'user')));
                               });

                               ?>




Wednesday, February 24, 2010
LSB Example
                   <?php

                   namespace lithiumcore;

                   class StaticObject {
                       ...
                   }
                                 <?php
                   ?>
                                 namespace lithiumdata;

                                 class Model extends lithiumcoreStaticObject {
                                     ...
                                 }

                                 ?>              <?php

                                                 namespace appmodels;

                                                 class Post extends lithiumdataModel {

                                                 }

                                                 ?>




Wednesday, February 24, 2010
__callStatic
                   <?php

                   namespace lithiumdata;

                   class Model extends lithiumcoreStaticObject {

                        public static function __callStatic($method, $params) {
                            ...
                        }

                   ?>
                                                 <?php

                                                 namespace appcontrollers

                                                 use appmodelsPost;

                                                 class PostsController extends lithiumactionController {

                                                      public function index() {
                                                          $posts = Post::all();
                                                          return compact('posts')
                                                      }
                                                 }

                                                 ?>




Wednesday, February 24, 2010
__invoke
           <?php

           namespace lithiumaction;

           class Controller extends lithiumcoreObject {

                public function __invoke($request, $dispatchParams, array $options = array()) {
                    ...
                }

           }                             <?php
           ?>
                                         namespace lithiumaction;

                                         class Dispatcher extends lithiumcoreStaticObject {

                                              protected static function _call($callable, $request, $params) {
                                                  ...
                                                      if (is_callable($callable = $params['callable'])) {
                                                          return $callable($params['request'], $params['params']);
                                                      }
                                                      throw new Exception('Result not callable');
                                                  ...
                                              }
                                         }
                                         ?>




Wednesday, February 24, 2010
SPL Iterators
                  <?php

                  protected function _cleanUp($path = null) {
                      $path = $path ?: LITHIUM_APP_PATH . '/resources/tmp/tests';
                      $path = $path[0] !== '/' ? LITHIUM_APP_PATH . '/resources/tmp/' . $path : $path;
                      if (!is_dir($path)) {
                          return;
                      }
                      $dirs = new RecursiveDirectoryIterator($path);
                      $iterator = new RecursiveIteratorIterator($dirs, RecursiveIteratorIterator::CHILD_FIRST);
                      foreach ($iterator as $item) {
                          if ($item->getPathname() === "{$path}/empty") continue;
                          ($item->isDir()) ? rmdir($item->getPathname()) : unlink($item->getPathname());
                      }
                  }

                  ?>




Wednesday, February 24, 2010
SPL Interfaces
                           <?php
                           /*
                             * @link http://us.php.net/manual/en/class.arrayaccess.php
                             * @link http://us.php.net/manual/en/class.iterator.php
                             * @link http://us.php.net/manual/en/class.countable.php
                             */
                           class Collection extends lithiumcoreObject implements ArrayAccess, Iterator, Countable {
                                ...
                           }

                           ?>




Wednesday, February 24, 2010
SPL autoloader
                               <?php

                               namespace lithiumcore;

                               class Libraries {
                                   ...
                                   public static function add($name, $config = array()) {
                                       ...
                                       if (!empty($config['loader'])) {
                                           spl_autoload_register($config['loader']);
                                       }
                                       ...
                                   }
                                   ...
                               }
                               ?>




Wednesday, February 24, 2010
Phar
                               <?php

                               namespace lithiumconsolecommand;

                               use Phar;

                               class Library extends lithiumconsoleCommand {

                                    public function archive() {
                                        ....

                                        $archive = new Phar("{$path}.phar");
                                        $from = $this->_toPath($from);
                                        $result = (boolean) $archive->buildFromDirectory($from, $this->filter);
                                        ...

                                        $archive->compress(Phar::GZ);
                                        return true;
                                    }
                               }

                               ?>




Wednesday, February 24, 2010
Sqlite3
                               <?php

                               Connections::add('default', array(
                                   'type' => 'database',
                                   'adapter' => 'Sqlite3',
                                   'database' => LITHIUM_APP_PATH . '/resources/db/sqlite.db'
                               ));

                               ?>




Wednesday, February 24, 2010
By Lithium
                   • Simple, Uniform API
                   • Unified Constructor
                   • Adaptable
                   • Filters (Aspect Oriented Programming)
                   • $_classes (Dependency Injection)
                   • Collections
Wednesday, February 24, 2010
Simple Uniform API
                   • logical namespaces and classes
                   • simple method names
                   • <= 3 params per method
                   • $config
                   • $options

Wednesday, February 24, 2010
Unified Constructor
                   • $config
                   • always an array
                   • check for $_autoConfig
                   • _init() and __init()


Wednesday, February 24, 2010
Adaptable
                               • securityAuth
                               • storageSession
                               • storageCache
                               • g11nCatalog
                               • dataConnections
                               • analysisLogger

Wednesday, February 24, 2010
Filters
                • Aspect Oriented Programming
                       secondary or supporting functions are isolated from the main
                       program's business logic...increase modularity by allowing the
                       separation of cross-cutting concerns...
                       (http://en.wikipedia.org/wiki/Aspect-oriented_programming)



                • modify core functionality without
                       extending a class

                • define your own callbacks
                • @filter

Wednesday, February 24, 2010
Routes Filter
                               <?php

                               use lithiumactionDispatcher;

                               Dispatcher::applyFilter('run', function($self, $params, $chain) {
                                   include __DIR__ . '/routes.php';
                                   return $chain->next($self, $params, $chain);
                               });

                               ?>




Wednesday, February 24, 2010
Asset Filter
                        <?php

                        use lithiumactionDispatcher;
                        use lithiumcoreLibraries;
                        use lithiumnethttpMedia;

                        Dispatcher::applyFilter('_callable', function($self, $params, $chain) {
                            list($plugin, $asset) = explode('/', $params['request']->url, 2) + array("", "");
                            if ($asset && $library = Libraries::get($plugin)) {
                                $asset = "{$library['path']}/webroot/{$asset}";

                                   if (file_exists($asset)) {
                                       return function () use ($asset) {
                                           $info = pathinfo($asset);
                                           $type = Media::type($info['extension']);
                                           header("Content-type: {$type['content']}");
                                           return file_get_contents($asset);
                                       };
                                   }
                               }
                               return $chain->next($self, $params, $chain);
                        });

                        ?>




Wednesday, February 24, 2010
Xhprof Filter
                               <?php

                               use lithiumactionDispatcher;

                               Dispatcher::applyFilter('run', function($self, $params, $chain) {
                                   xhprof_enable();
                                   $data = $chain->next($self, $params, $chain);
                                   $xhprof_data = xhprof_disable();

                                     $XHPROF_ROOT = '/usr/local/php/5.3.1/lib/xhprof';
                                     include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php";
                                     include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php";

                                     $xhprof_runs = new XHProfRuns_Default();
                                     $run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_lithium");

                                     return $data;
                               });

                               ?>




Wednesday, February 24, 2010
Save Filter
                       <?php

                       namespace appmodels;

                       class Paste extends lithiumdataModel {

                               public static function __init(array $options = array()) {
                                   parent::__init($options);
                                   static::applyFilter('save', function($self, $params, $chain) {
                                       $document = $params['record'];
                                       if (!$document->id) {
                                           $document->created = date('Y-m-d h:i:s');
                                       }
                                       if (!empty($params['data'])) {
                                           $document->set($params['data']);
                                       }
                                       $document->parsed = $self::parse($document->content, $document->language);
                                       $document->preview = substr($document->content, 0, 100);
                                       $document->modified = date('Y-m-d h:i:s');
                                       $params['record'] = $document;
                                       return $chain->next($self, $params, $chain);
                                   });
                               }
                       }

                       ?>




Wednesday, February 24, 2010
$_classes
                • Dependency Injection
                       a technique for supplying an external dependency (i.e. a
                       reference) to a software component - that is, indicating to a part
                       of a program which other parts it can use...
                       (http://en.wikipedia.org/wiki/Dependency_injection)



                • modify core functionality without
                       extending a class




Wednesday, February 24, 2010
$_classes Example
                               <?php

                               namespace lithiumconsole;

                               class Library extends lithiumconsoleCommand {
                                   ...
                                   protected $_classes = array(
                                       'service' => 'lithiumnethttpService',
                                       'response' => 'lithiumconsoleResponse'
                                   );
                                   ...
                               }
                               ?>




Wednesday, February 24, 2010
$_classes Example
                               <?php
                               namespace lithiumtestscasesconsole;

                               use lithiumconsoleRequest;

                               class LibraryTest extends lithiumtestUnit {
                                   ...
                                   public function setUp() {
                                       ...
                                       $this->classes = array(
                                           'service' => 'lithiumtestsmocksconsolecommandMockLibraryService',
                                           'response' => 'lithiumtestsmocksconsoleMockResponse'
                                       );
                                       ...
                                   }
                                   ...
                                   public function testArchiveNoLibrary() {
                                       ...
                                       $app = new Library(array(
                                           'request' => new Request(), 'classes' => $this->classes
                                       ));
                                       $expected = true;
                                       $result = $app->archive();
                                       $this->assertEqual($expected, $result);
                                   }
                                   ...
                               }
                               ?>




Wednesday, February 24, 2010
Collections
                         • lithiumutilCollection
                         • lithiumdataCollection
                          • lithiumdatacollectionRecordSet
                          • lithiumdatacollectionDocument
                         • lithiumtestGroup

Wednesday, February 24, 2010
Collections Example
            <?php

            use lithiumutilCollection;

            $coll = new Collection(array('items' => array(0, 1, 2, 3, 4)));
            $coll->first();   // 1 (the first non-empty value)
            $coll->current(); // 0
            $coll->next();    // 1
            $coll->next();    // 2
            $coll->next();    // 3
                                                                       <?php
            $coll->prev();    // 2
            $coll->rewind(); // 0
                                                                       use lithiumtestGroup;
            $coll->each(function($value) {
                return $value + 1;
                                                                       $group = new Group(array('items' => array(
            });
                                                                           'lithiumtestscasescoreLibraries',
            $coll->to('array'); // array(1, 2, 3, 4, 5)
                                                                           'lithiumtestscasescoreObject',
                                                                       ))
            ?>
                                                                       $resul = $group->tests()->run();

                                                                      ?>




Wednesday, February 24, 2010
More Lithium
                   • Integrated Test Suite for fast TDD
                   • Command Line Framework
                   • Document Based Data Sources
                   • Object based Record Sets with access
                           to non static model methods

                   • Transparent content type rendering

Wednesday, February 24, 2010
Still More Lithium
                   • Automatic output escaping
                   • Http Services
                   • g11n for internationalized applications
                   • Authentication
                   • Session/Cookie Handling
                   • Authorization (1.0)
Wednesday, February 24, 2010
Even More Lithium
                               • Validator
                               • Logging
                               • Debugger
                               • Parser
                               • Inspector
                               • Sockets
Wednesday, February 24, 2010
Lithium Integrations
                   • Use 3rd party libraries
                   • Easy to add with Libraries class
                   • Especially simple when PSR-0 is
                           followed

                   • Access classes in a standard way


Wednesday, February 24, 2010
Using Zend
                               http://rad-dev.org/lithium/wiki/guides/using/zend
                 <?php

                 Libraries::add("Zend", array(
                     "prefix" => "Zend_",
                     'path' => '/htdocs/libraries/Zend/trunk/library/Zend',
                     "includePath" => '/htdocs/libraries/Zend/trunk/library',
                     "bootstrap" => "Loader/Autoloader.php",
                     "loader" => array("Zend_Loader_Autoloader", "autoload"),
                     "transform" => function($class) { return str_replace("_", "/", $class) . ".php"; }
                 ));

                 ?>
                                            <?php

                                            namespace appcontrollers;

                                            use Zend_Mail_Storage_Pop3;

                                            class EmailController extends lithiumactionController {

                                                 public function index() {
                                                     $mail = new Zend_Mail_Storage_Pop3(array(
                                                         'host' => 'localhost', 'user' => 'test', 'password' => 'test'
                                                     ));
                                                     return compact('mail');
                                                 }
                                            }

                                            ?>



Wednesday, February 24, 2010
Plugins
                   • namespaces allow for a true plugin
                           system

                   • modify application with filters
                   • add extensions
                   • share your handy work


Wednesday, February 24, 2010
Some Plugins
                                 • li3_docs
                                 • li3_oauth
                                 • li3_bot
                                 • li3_doctrine
                                 • li3_lab

Wednesday, February 24, 2010
Wednesday, February 24, 2010
lithium_qa
                   • http://rad-dev.org/lithium/wiki/standards
                   • Check syntax of your code
                   • Shows rules violations in your code
                   • Automate the process with SCM hooks


Wednesday, February 24, 2010
Lithium
                               the most rad php framework

               • http://lithify.me
               • http://rad-dev.org/lithium/wiki
               • http://www.ohloh.net/p/lithium
               • http://twitter.com/UnionOfRAD
               • irc://irc.freenode.net/#li3
               •       http://search.twitter.com/search?q=%23li3


Wednesday, February 24, 2010
1 of 58

Recommended

The Zen of Lithium by
The Zen of LithiumThe Zen of Lithium
The Zen of LithiumNate Abele
2.6K views118 slides
Lithium: The Framework for People Who Hate Frameworks by
Lithium: The Framework for People Who Hate FrameworksLithium: The Framework for People Who Hate Frameworks
Lithium: The Framework for People Who Hate FrameworksNate Abele
12.2K views123 slides
Lithium: The Framework for People Who Hate Frameworks, Tokyo Edition by
Lithium: The Framework for People Who Hate Frameworks, Tokyo EditionLithium: The Framework for People Who Hate Frameworks, Tokyo Edition
Lithium: The Framework for People Who Hate Frameworks, Tokyo EditionNate Abele
1.6K views121 slides
The State of Lithium by
The State of LithiumThe State of Lithium
The State of LithiumNate Abele
2.3K views32 slides
Design Patterns avec PHP 5.3, Symfony et Pimple by
Design Patterns avec PHP 5.3, Symfony et PimpleDesign Patterns avec PHP 5.3, Symfony et Pimple
Design Patterns avec PHP 5.3, Symfony et PimpleHugo Hamon
6.1K views68 slides
Building Lithium Apps by
Building Lithium AppsBuilding Lithium Apps
Building Lithium AppsNate Abele
5.7K views57 slides

More Related Content

What's hot

The History of PHPersistence by
The History of PHPersistenceThe History of PHPersistence
The History of PHPersistenceHugo Hamon
2.3K views75 slides
Database Design Patterns by
Database Design PatternsDatabase Design Patterns
Database Design PatternsHugo Hamon
11.4K views87 slides
Silex meets SOAP & REST by
Silex meets SOAP & RESTSilex meets SOAP & REST
Silex meets SOAP & RESTHugo Hamon
14.8K views62 slides
Doctrine MongoDB ODM (PDXPHP) by
Doctrine MongoDB ODM (PDXPHP)Doctrine MongoDB ODM (PDXPHP)
Doctrine MongoDB ODM (PDXPHP)Kris Wallsmith
2.1K views49 slides
Rich domain model with symfony 2.5 and doctrine 2.5 by
Rich domain model with symfony 2.5 and doctrine 2.5Rich domain model with symfony 2.5 and doctrine 2.5
Rich domain model with symfony 2.5 and doctrine 2.5Leonardo Proietti
12K views90 slides
Symfony2 - WebExpo 2010 by
Symfony2 - WebExpo 2010Symfony2 - WebExpo 2010
Symfony2 - WebExpo 2010Fabien Potencier
2.1K views127 slides

What's hot(20)

The History of PHPersistence by Hugo Hamon
The History of PHPersistenceThe History of PHPersistence
The History of PHPersistence
Hugo Hamon2.3K views
Database Design Patterns by Hugo Hamon
Database Design PatternsDatabase Design Patterns
Database Design Patterns
Hugo Hamon11.4K views
Silex meets SOAP & REST by Hugo Hamon
Silex meets SOAP & RESTSilex meets SOAP & REST
Silex meets SOAP & REST
Hugo Hamon14.8K views
Doctrine MongoDB ODM (PDXPHP) by Kris Wallsmith
Doctrine MongoDB ODM (PDXPHP)Doctrine MongoDB ODM (PDXPHP)
Doctrine MongoDB ODM (PDXPHP)
Kris Wallsmith2.1K views
Rich domain model with symfony 2.5 and doctrine 2.5 by Leonardo Proietti
Rich domain model with symfony 2.5 and doctrine 2.5Rich domain model with symfony 2.5 and doctrine 2.5
Rich domain model with symfony 2.5 and doctrine 2.5
Leonardo Proietti12K views
Dependency injection-zendcon-2010 by Fabien Potencier
Dependency injection-zendcon-2010Dependency injection-zendcon-2010
Dependency injection-zendcon-2010
Fabien Potencier9.3K views
Symfony2, creare bundle e valore per il cliente by Leonardo Proietti
Symfony2, creare bundle e valore per il clienteSymfony2, creare bundle e valore per il cliente
Symfony2, creare bundle e valore per il cliente
Leonardo Proietti1.3K views
Advanced symfony Techniques by Kris Wallsmith
Advanced symfony TechniquesAdvanced symfony Techniques
Advanced symfony Techniques
Kris Wallsmith5.4K views
Models and Service Layers, Hemoglobin and Hobgoblins by Ross Tuck
Models and Service Layers, Hemoglobin and HobgoblinsModels and Service Layers, Hemoglobin and Hobgoblins
Models and Service Layers, Hemoglobin and Hobgoblins
Ross Tuck48.3K views
Dependency injection in PHP 5.3/5.4 by Fabien Potencier
Dependency injection in PHP 5.3/5.4Dependency injection in PHP 5.3/5.4
Dependency injection in PHP 5.3/5.4
Fabien Potencier37.4K views
Decouple Your Code For Reusability (International PHP Conference / IPC 2008) by Fabien Potencier
Decouple Your Code For Reusability (International PHP Conference / IPC 2008)Decouple Your Code For Reusability (International PHP Conference / IPC 2008)
Decouple Your Code For Reusability (International PHP Conference / IPC 2008)
Fabien Potencier4.2K views
Speed up your developments with Symfony2 by Hugo Hamon
Speed up your developments with Symfony2Speed up your developments with Symfony2
Speed up your developments with Symfony2
Hugo Hamon4.5K views
Doctrine fixtures by Bill Chang
Doctrine fixturesDoctrine fixtures
Doctrine fixtures
Bill Chang5K views
Dependency Injection with PHP and PHP 5.3 by Fabien Potencier
Dependency Injection with PHP and PHP 5.3Dependency Injection with PHP and PHP 5.3
Dependency Injection with PHP and PHP 5.3
Fabien Potencier15.4K views
Future of HTTP in CakePHP by markstory
Future of HTTP in CakePHPFuture of HTTP in CakePHP
Future of HTTP in CakePHP
markstory4.3K views
Corephpcomponentpresentation 1211425966721657-8 by PrinceGuru MS
Corephpcomponentpresentation 1211425966721657-8Corephpcomponentpresentation 1211425966721657-8
Corephpcomponentpresentation 1211425966721657-8
PrinceGuru MS491 views

Similar to PHP 5.3 and Lithium: the most rad php framework

IPC2010SE Doctrine2 Enterprise Persistence Layer for PHP by
IPC2010SE Doctrine2 Enterprise Persistence Layer for PHPIPC2010SE Doctrine2 Enterprise Persistence Layer for PHP
IPC2010SE Doctrine2 Enterprise Persistence Layer for PHPGuilherme Blanco
4.5K views79 slides
Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016) by
Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)
Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)James Titcumb
425 views88 slides
PHP 5.3 Overview by
PHP 5.3 OverviewPHP 5.3 Overview
PHP 5.3 Overviewjsmith92
492 views38 slides
SPL: The Missing Link in Development by
SPL: The Missing Link in DevelopmentSPL: The Missing Link in Development
SPL: The Missing Link in Developmentjsmith92
733 views44 slides
Can't Miss Features of PHP 5.3 and 5.4 by
Can't Miss Features of PHP 5.3 and 5.4Can't Miss Features of PHP 5.3 and 5.4
Can't Miss Features of PHP 5.3 and 5.4Jeff Carouth
3.1K views66 slides
Ch8(oop) by
Ch8(oop)Ch8(oop)
Ch8(oop)Chhom Karath
179 views21 slides

Similar to PHP 5.3 and Lithium: the most rad php framework(20)

IPC2010SE Doctrine2 Enterprise Persistence Layer for PHP by Guilherme Blanco
IPC2010SE Doctrine2 Enterprise Persistence Layer for PHPIPC2010SE Doctrine2 Enterprise Persistence Layer for PHP
IPC2010SE Doctrine2 Enterprise Persistence Layer for PHP
Guilherme Blanco4.5K views
Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016) by James Titcumb
Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)
Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)
James Titcumb425 views
PHP 5.3 Overview by jsmith92
PHP 5.3 OverviewPHP 5.3 Overview
PHP 5.3 Overview
jsmith92492 views
SPL: The Missing Link in Development by jsmith92
SPL: The Missing Link in DevelopmentSPL: The Missing Link in Development
SPL: The Missing Link in Development
jsmith92733 views
Can't Miss Features of PHP 5.3 and 5.4 by Jeff Carouth
Can't Miss Features of PHP 5.3 and 5.4Can't Miss Features of PHP 5.3 and 5.4
Can't Miss Features of PHP 5.3 and 5.4
Jeff Carouth3.1K views
Introducing PHP Latest Updates by Iftekhar Eather
Introducing PHP Latest UpdatesIntroducing PHP Latest Updates
Introducing PHP Latest Updates
Iftekhar Eather1.3K views
OpenGurukul : Language : PHP by Open Gurukul
OpenGurukul : Language : PHPOpenGurukul : Language : PHP
OpenGurukul : Language : PHP
Open Gurukul10.9K views
Load Testing with PHP and RedLine13 by Jason Lotito
Load Testing with PHP and RedLine13Load Testing with PHP and RedLine13
Load Testing with PHP and RedLine13
Jason Lotito1K views
Php on the desktop and php gtk2 by Elizabeth Smith
Php on the desktop and php gtk2Php on the desktop and php gtk2
Php on the desktop and php gtk2
Elizabeth Smith4.2K views
Practical PHP 5.3 by Nate Abele
Practical PHP 5.3Practical PHP 5.3
Practical PHP 5.3
Nate Abele7K views
Mirror, mirror on the wall - Building a new PHP reflection library (Nomad PHP... by James Titcumb
Mirror, mirror on the wall - Building a new PHP reflection library (Nomad PHP...Mirror, mirror on the wall - Building a new PHP reflection library (Nomad PHP...
Mirror, mirror on the wall - Building a new PHP reflection library (Nomad PHP...
James Titcumb265 views
関西PHP勉強会 php5.4つまみぐい by Hisateru Tanaka
関西PHP勉強会 php5.4つまみぐい関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい
Hisateru Tanaka2.6K views
Building Testable PHP Applications by chartjes
Building Testable PHP ApplicationsBuilding Testable PHP Applications
Building Testable PHP Applications
chartjes7.4K views

Recently uploaded

HTTP headers that make your website go faster - devs.gent November 2023 by
HTTP headers that make your website go faster - devs.gent November 2023HTTP headers that make your website go faster - devs.gent November 2023
HTTP headers that make your website go faster - devs.gent November 2023Thijs Feryn
21 views151 slides
Evolving the Network Automation Journey from Python to Platforms by
Evolving the Network Automation Journey from Python to PlatformsEvolving the Network Automation Journey from Python to Platforms
Evolving the Network Automation Journey from Python to PlatformsNetwork Automation Forum
12 views21 slides
Future of Indian ConsumerTech by
Future of Indian ConsumerTechFuture of Indian ConsumerTech
Future of Indian ConsumerTechKapil Khandelwal (KK)
21 views68 slides
Vertical User Stories by
Vertical User StoriesVertical User Stories
Vertical User StoriesMoisés Armani Ramírez
12 views16 slides
PRODUCT LISTING.pptx by
PRODUCT LISTING.pptxPRODUCT LISTING.pptx
PRODUCT LISTING.pptxangelicacueva6
13 views1 slide

Recently uploaded(20)

HTTP headers that make your website go faster - devs.gent November 2023 by Thijs Feryn
HTTP headers that make your website go faster - devs.gent November 2023HTTP headers that make your website go faster - devs.gent November 2023
HTTP headers that make your website go faster - devs.gent November 2023
Thijs Feryn21 views
The details of description: Techniques, tips, and tangents on alternative tex... by BookNet Canada
The details of description: Techniques, tips, and tangents on alternative tex...The details of description: Techniques, tips, and tangents on alternative tex...
The details of description: Techniques, tips, and tangents on alternative tex...
BookNet Canada126 views
SAP Automation Using Bar Code and FIORI.pdf by Virendra Rai, PMP
SAP Automation Using Bar Code and FIORI.pdfSAP Automation Using Bar Code and FIORI.pdf
SAP Automation Using Bar Code and FIORI.pdf
Data Integrity for Banking and Financial Services by Precisely
Data Integrity for Banking and Financial ServicesData Integrity for Banking and Financial Services
Data Integrity for Banking and Financial Services
Precisely12 views
Voice Logger - Telephony Integration Solution at Aegis by Nirmal Sharma
Voice Logger - Telephony Integration Solution at AegisVoice Logger - Telephony Integration Solution at Aegis
Voice Logger - Telephony Integration Solution at Aegis
Nirmal Sharma31 views
Five Things You SHOULD Know About Postman by Postman
Five Things You SHOULD Know About PostmanFive Things You SHOULD Know About Postman
Five Things You SHOULD Know About Postman
Postman30 views
Business Analyst Series 2023 - Week 3 Session 5 by DianaGray10
Business Analyst Series 2023 -  Week 3 Session 5Business Analyst Series 2023 -  Week 3 Session 5
Business Analyst Series 2023 - Week 3 Session 5
DianaGray10237 views
Special_edition_innovator_2023.pdf by WillDavies22
Special_edition_innovator_2023.pdfSpecial_edition_innovator_2023.pdf
Special_edition_innovator_2023.pdf
WillDavies2217 views
STPI OctaNE CoE Brochure.pdf by madhurjyapb
STPI OctaNE CoE Brochure.pdfSTPI OctaNE CoE Brochure.pdf
STPI OctaNE CoE Brochure.pdf
madhurjyapb13 views

PHP 5.3 and Lithium: the most rad php framework

  • 3. Why? • Speed & Memory • Phar • Namespaces • ext/intl • Anonymous Functions • ext/fileinfo • Late Static Binding • ext/sqlite3 • Syntax enhancements • mysqlnd • SPL Wednesday, February 24, 2010
  • 4. Speed & Memory Drupal 20% faster Qdig 2% faster typo3 30% faster wordpress 15% faster xoops 10% faster http://news.php.net/php.internals/36484 http://sebastian-bergmann.de/archives/745-Benchmark-of-PHP-Branches-3.0-through-5.3-CVS.html gc_enable() : New Garbage Collector Wednesday, February 24, 2010
  • 5. Namespaces http://php.net/manual/en/language.namespaces.php • Autoloading made easy • lithiumcoreLibraries • li3_docscontrollersBrowserController • http://groups.google.com/group/php- standards/web/psr-0-final-proposal Wednesday, February 24, 2010
  • 6. Namespaces Example <?php namespace app; use appmodelsPost; class PostsController extends lithiumactionController { public function index() { $posts = Post::all(); return compact(‘posts’); } } ?> Wednesday, February 24, 2010
  • 7. Autoloading http://groups.google.com/group/php-standards/web/psr-0-final-proposal <?php function __autoload($className) { $className = ltrim($className, ''); $fileName = ''; $namespace = ''; if ($lastNsPos = strripos($className, '')) { $namespace = substr($className, 0, $lastNsPos); $className = substr($className, $lastNsPos + 1); $fileName = str_replace('', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR; } $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php'; require $fileName; } ?> Wednesday, February 24, 2010
  • 8. Anonymous Functions http://php.net/manual/en/functions.anonymous.php • Lambda • assigned to a variable • useful for recursion and multiple calls • Closure • added as a method parameter • use() the parent scope Wednesday, February 24, 2010
  • 9. Lambda Example <?php $cube = function ($value) { return ($value * $value * $value); }; $result = array_map($cube, array(1, 2, 3)); var_dump($result); /* array 0 => int 1 1 => int 8 2 => int 27 */ ?> Wednesday, February 24, 2010
  • 10. Another Lambda $multiply = function ($value, $times) use (&$multiply) { return ($times > 0) ? $multiply($value * $value, --$times) : $value; }; var_dump($multiply(2, 3)); /* int 256 */ Wednesday, February 24, 2010
  • 11. Closure Example <?php $data = 'string'; $result = array_filter(array(1, 2, 'string'), function ($value) use ($data) { return ($value !== $data); }); var_dump($result); /* array 0 => int 1 1 => int 2 */ ?> Wednesday, February 24, 2010
  • 12. Crazy Example <?php function Y($F) { return current(array(function($f) { return $f($f); }))->__invoke(function($f) use ($F) { return $F(function($x) use ($f) { return $f($f)->__invoke($x); }); }); } $factorial = Y(function($fact) { return function($n) use ($fact) { return ($n <= 1) ? 1 : $n * $fact($n - 1); }; }); var_dump($factorial(6)); /* int 720 */ ?> Wednesday, February 24, 2010
  • 13. Why Static? • Promotes proper application design • Stateless • Easier to access Wednesday, February 24, 2010
  • 14. Late Static Binding http://php.net/lsb <?php class A { public static function who() { return __CLASS__; } public static function test() { return static::who(); } } class B extends A { public static function who() { return __CLASS__; } } $result = B::test(); var_dump($result); /* string 'B' (length=1) */ Wednesday, February 24, 2010
  • 15. Standard PHP Library (SPL) http://us.php.net/manual/en/book.spl.php • spl_autoload_register() • Iterators • Exceptions • File Handling • Observer/Subject • Stack, Queue, Heap, ObjectStorage Wednesday, February 24, 2010
  • 16. Syntax Enhancements http://php.net/manual/en/language.oop5.magic.php • PHP 5 < 5.3 • PHP 5.3 • __set()/__get() • __callStatic() • __isset()/__unset() • __invoke() • __call() • ?: Wednesday, February 24, 2010
  • 17. Phar • PHP archives • includable (include 'phar:///path/to/myphar.phar/file.php') • stream accessible • distributable Wednesday, February 24, 2010
  • 18. ext/intl • Collator • Locale • IntlDateFormatter • NumberFormatter Wednesday, February 24, 2010
  • 19. ext/fileinfo <?php $info = new finfo(FILEINFO_MIME); $result = $info->file(__FILE__); var_dump($result); /* string 'text/x-php; charset=us-ascii' (length=28) */ $result = finfo_file(finfo_open(FILEINFO_MIME), __FILE__); var_dump($result); /* string 'text/x-php; charset=us-ascii' (length=28) */ ?> Wednesday, February 24, 2010
  • 20. ext/sqlite3 • SQLite is a in-process library that implements a self-contained, serverless, zero-configuration, transactional SQL database engine (http://www.sqlite.org/ about.html) • A more compact format for database files. • Support for both UTF-8 and UTF-16 text. • Manifest typing and BLOB support. • New API via Sqlite3 class or sqlite3 functions Wednesday, February 24, 2010
  • 21. mysqlnd • mysql native driver • faster • easier to compile • transparent client, same old mysql/mysqli Wednesday, February 24, 2010
  • 22. Lithium the most rad php framework Wednesday, February 24, 2010
  • 23. In Lithium • Namespaces • Anonymous Functions • Late Static Binding • Syntax Enhancements • SPL • Phar • Sqlite3 Wednesday, February 24, 2010
  • 24. Lithium Namespaces • action • security • analysis • storage • console • template • core • test • g11n • tests • net • util Wednesday, February 24, 2010
  • 25. Namespace Example <?php namespace appextensionshelper; class Form extends lithiumtemplatehelperForm { public function config(array $config = array()) { .... } } Wednesday, February 24, 2010
  • 26. Anonymous Functions Example <?php Validator::add('role', function ($value, $format, $options) { return (in_array($value, array('admin', 'editor', 'user'))); }); ?> Wednesday, February 24, 2010
  • 27. LSB Example <?php namespace lithiumcore; class StaticObject { ... } <?php ?> namespace lithiumdata; class Model extends lithiumcoreStaticObject { ... } ?> <?php namespace appmodels; class Post extends lithiumdataModel { } ?> Wednesday, February 24, 2010
  • 28. __callStatic <?php namespace lithiumdata; class Model extends lithiumcoreStaticObject { public static function __callStatic($method, $params) { ... } ?> <?php namespace appcontrollers use appmodelsPost; class PostsController extends lithiumactionController { public function index() { $posts = Post::all(); return compact('posts') } } ?> Wednesday, February 24, 2010
  • 29. __invoke <?php namespace lithiumaction; class Controller extends lithiumcoreObject { public function __invoke($request, $dispatchParams, array $options = array()) { ... } } <?php ?> namespace lithiumaction; class Dispatcher extends lithiumcoreStaticObject { protected static function _call($callable, $request, $params) { ... if (is_callable($callable = $params['callable'])) { return $callable($params['request'], $params['params']); } throw new Exception('Result not callable'); ... } } ?> Wednesday, February 24, 2010
  • 30. SPL Iterators <?php protected function _cleanUp($path = null) { $path = $path ?: LITHIUM_APP_PATH . '/resources/tmp/tests'; $path = $path[0] !== '/' ? LITHIUM_APP_PATH . '/resources/tmp/' . $path : $path; if (!is_dir($path)) { return; } $dirs = new RecursiveDirectoryIterator($path); $iterator = new RecursiveIteratorIterator($dirs, RecursiveIteratorIterator::CHILD_FIRST); foreach ($iterator as $item) { if ($item->getPathname() === "{$path}/empty") continue; ($item->isDir()) ? rmdir($item->getPathname()) : unlink($item->getPathname()); } } ?> Wednesday, February 24, 2010
  • 31. SPL Interfaces <?php /* * @link http://us.php.net/manual/en/class.arrayaccess.php * @link http://us.php.net/manual/en/class.iterator.php * @link http://us.php.net/manual/en/class.countable.php */ class Collection extends lithiumcoreObject implements ArrayAccess, Iterator, Countable { ... } ?> Wednesday, February 24, 2010
  • 32. SPL autoloader <?php namespace lithiumcore; class Libraries { ... public static function add($name, $config = array()) { ... if (!empty($config['loader'])) { spl_autoload_register($config['loader']); } ... } ... } ?> Wednesday, February 24, 2010
  • 33. Phar <?php namespace lithiumconsolecommand; use Phar; class Library extends lithiumconsoleCommand { public function archive() { .... $archive = new Phar("{$path}.phar"); $from = $this->_toPath($from); $result = (boolean) $archive->buildFromDirectory($from, $this->filter); ... $archive->compress(Phar::GZ); return true; } } ?> Wednesday, February 24, 2010
  • 34. Sqlite3 <?php Connections::add('default', array( 'type' => 'database', 'adapter' => 'Sqlite3', 'database' => LITHIUM_APP_PATH . '/resources/db/sqlite.db' )); ?> Wednesday, February 24, 2010
  • 35. By Lithium • Simple, Uniform API • Unified Constructor • Adaptable • Filters (Aspect Oriented Programming) • $_classes (Dependency Injection) • Collections Wednesday, February 24, 2010
  • 36. Simple Uniform API • logical namespaces and classes • simple method names • <= 3 params per method • $config • $options Wednesday, February 24, 2010
  • 37. Unified Constructor • $config • always an array • check for $_autoConfig • _init() and __init() Wednesday, February 24, 2010
  • 38. Adaptable • securityAuth • storageSession • storageCache • g11nCatalog • dataConnections • analysisLogger Wednesday, February 24, 2010
  • 39. Filters • Aspect Oriented Programming secondary or supporting functions are isolated from the main program's business logic...increase modularity by allowing the separation of cross-cutting concerns... (http://en.wikipedia.org/wiki/Aspect-oriented_programming) • modify core functionality without extending a class • define your own callbacks • @filter Wednesday, February 24, 2010
  • 40. Routes Filter <?php use lithiumactionDispatcher; Dispatcher::applyFilter('run', function($self, $params, $chain) { include __DIR__ . '/routes.php'; return $chain->next($self, $params, $chain); }); ?> Wednesday, February 24, 2010
  • 41. Asset Filter <?php use lithiumactionDispatcher; use lithiumcoreLibraries; use lithiumnethttpMedia; Dispatcher::applyFilter('_callable', function($self, $params, $chain) { list($plugin, $asset) = explode('/', $params['request']->url, 2) + array("", ""); if ($asset && $library = Libraries::get($plugin)) { $asset = "{$library['path']}/webroot/{$asset}"; if (file_exists($asset)) { return function () use ($asset) { $info = pathinfo($asset); $type = Media::type($info['extension']); header("Content-type: {$type['content']}"); return file_get_contents($asset); }; } } return $chain->next($self, $params, $chain); }); ?> Wednesday, February 24, 2010
  • 42. Xhprof Filter <?php use lithiumactionDispatcher; Dispatcher::applyFilter('run', function($self, $params, $chain) { xhprof_enable(); $data = $chain->next($self, $params, $chain); $xhprof_data = xhprof_disable(); $XHPROF_ROOT = '/usr/local/php/5.3.1/lib/xhprof'; include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php"; include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php"; $xhprof_runs = new XHProfRuns_Default(); $run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_lithium"); return $data; }); ?> Wednesday, February 24, 2010
  • 43. Save Filter <?php namespace appmodels; class Paste extends lithiumdataModel { public static function __init(array $options = array()) { parent::__init($options); static::applyFilter('save', function($self, $params, $chain) { $document = $params['record']; if (!$document->id) { $document->created = date('Y-m-d h:i:s'); } if (!empty($params['data'])) { $document->set($params['data']); } $document->parsed = $self::parse($document->content, $document->language); $document->preview = substr($document->content, 0, 100); $document->modified = date('Y-m-d h:i:s'); $params['record'] = $document; return $chain->next($self, $params, $chain); }); } } ?> Wednesday, February 24, 2010
  • 44. $_classes • Dependency Injection a technique for supplying an external dependency (i.e. a reference) to a software component - that is, indicating to a part of a program which other parts it can use... (http://en.wikipedia.org/wiki/Dependency_injection) • modify core functionality without extending a class Wednesday, February 24, 2010
  • 45. $_classes Example <?php namespace lithiumconsole; class Library extends lithiumconsoleCommand { ... protected $_classes = array( 'service' => 'lithiumnethttpService', 'response' => 'lithiumconsoleResponse' ); ... } ?> Wednesday, February 24, 2010
  • 46. $_classes Example <?php namespace lithiumtestscasesconsole; use lithiumconsoleRequest; class LibraryTest extends lithiumtestUnit { ... public function setUp() { ... $this->classes = array( 'service' => 'lithiumtestsmocksconsolecommandMockLibraryService', 'response' => 'lithiumtestsmocksconsoleMockResponse' ); ... } ... public function testArchiveNoLibrary() { ... $app = new Library(array( 'request' => new Request(), 'classes' => $this->classes )); $expected = true; $result = $app->archive(); $this->assertEqual($expected, $result); } ... } ?> Wednesday, February 24, 2010
  • 47. Collections • lithiumutilCollection • lithiumdataCollection • lithiumdatacollectionRecordSet • lithiumdatacollectionDocument • lithiumtestGroup Wednesday, February 24, 2010
  • 48. Collections Example <?php use lithiumutilCollection; $coll = new Collection(array('items' => array(0, 1, 2, 3, 4))); $coll->first(); // 1 (the first non-empty value) $coll->current(); // 0 $coll->next(); // 1 $coll->next(); // 2 $coll->next(); // 3 <?php $coll->prev(); // 2 $coll->rewind(); // 0 use lithiumtestGroup; $coll->each(function($value) { return $value + 1; $group = new Group(array('items' => array( }); 'lithiumtestscasescoreLibraries', $coll->to('array'); // array(1, 2, 3, 4, 5) 'lithiumtestscasescoreObject', )) ?> $resul = $group->tests()->run(); ?> Wednesday, February 24, 2010
  • 49. More Lithium • Integrated Test Suite for fast TDD • Command Line Framework • Document Based Data Sources • Object based Record Sets with access to non static model methods • Transparent content type rendering Wednesday, February 24, 2010
  • 50. Still More Lithium • Automatic output escaping • Http Services • g11n for internationalized applications • Authentication • Session/Cookie Handling • Authorization (1.0) Wednesday, February 24, 2010
  • 51. Even More Lithium • Validator • Logging • Debugger • Parser • Inspector • Sockets Wednesday, February 24, 2010
  • 52. Lithium Integrations • Use 3rd party libraries • Easy to add with Libraries class • Especially simple when PSR-0 is followed • Access classes in a standard way Wednesday, February 24, 2010
  • 53. Using Zend http://rad-dev.org/lithium/wiki/guides/using/zend <?php Libraries::add("Zend", array( "prefix" => "Zend_", 'path' => '/htdocs/libraries/Zend/trunk/library/Zend', "includePath" => '/htdocs/libraries/Zend/trunk/library', "bootstrap" => "Loader/Autoloader.php", "loader" => array("Zend_Loader_Autoloader", "autoload"), "transform" => function($class) { return str_replace("_", "/", $class) . ".php"; } )); ?> <?php namespace appcontrollers; use Zend_Mail_Storage_Pop3; class EmailController extends lithiumactionController { public function index() { $mail = new Zend_Mail_Storage_Pop3(array( 'host' => 'localhost', 'user' => 'test', 'password' => 'test' )); return compact('mail'); } } ?> Wednesday, February 24, 2010
  • 54. Plugins • namespaces allow for a true plugin system • modify application with filters • add extensions • share your handy work Wednesday, February 24, 2010
  • 55. Some Plugins • li3_docs • li3_oauth • li3_bot • li3_doctrine • li3_lab Wednesday, February 24, 2010
  • 57. lithium_qa • http://rad-dev.org/lithium/wiki/standards • Check syntax of your code • Shows rules violations in your code • Automate the process with SCM hooks Wednesday, February 24, 2010
  • 58. Lithium the most rad php framework • http://lithify.me • http://rad-dev.org/lithium/wiki • http://www.ohloh.net/p/lithium • http://twitter.com/UnionOfRAD • irc://irc.freenode.net/#li3 • http://search.twitter.com/search?q=%23li3 Wednesday, February 24, 2010