Post on 07-Jul-2015
description
transcript
Standard Coding, OOP Techniques and Code Reuse
phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 2
Standard Coding
phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 3
What isWhat is Standard CodingStandard Coding??
● Clean, smart and readable code● Follows a coding standard● Streamlined to the purpose
“Code is Art”
phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 4
Why Standard Coding?
● Code Quality● Less buggy● Maintainability● Scalability● Collaboration
(Readability)
phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 5
Coding Standards
● Zend Coding Standard
- The most advanced coding standard in PHP
● PEAR Coding Standards- Base for most of the coding standards in PHP
● CakePHP Coding Standard
● CodeIgniter Coding Standard
Note: There are tons of bad & inconsistent coding standards in PHP
phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 6
Code Commenting
● Remember! Doc-block is must for File, Class and Method
● Always in phpDocumentor format, don't put your own tag
● Latest PHP IDE like NetBeans, Zend Studio, Eclipse PDT can help you generating doc-block easily
● Benefit
● Documentation is done as you go with coding
● Doxygen can build your API documentation in chm format instantly from your code
● IDE like netbeans shows code hints, code completion along with popup documentation on the fly
phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 7
See, netbeans can show documentation on the fly
for you
phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 8
Standard Coding - Tips
● Say no to short tags <? ?>, always long tags (<?php ?>)
● Use foreach instead of for loop for array iteration
● Ensure variable is not empty before any iteration
● Use null as default function parameter if possible
● Avoid nested conditions, return as early as possible
● Use alternative syntax for control structures when mixing with HTML
if ():
else:
endif;
foreach ():
endforeach;
for ():
endfor;
while ():
endwhile;
phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 9
Standard Coding – empty
● empty() is a magic in php, learn how to use it, at the end you will love it
● Use !empty() instead of isset() when working with non-empty or non-zero value
● Use !empty($array) instead of count($array) when checking if array has value
● Always check your variable before going further with it
phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 10
array functions = green power
● Learn them all, specially: in_array, array_merge, array_map, array_values, array_keys, join, explode!
● They can save your time!
phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 11
Clean and Smart
Clean and Smart
phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 12
OOP Techniques
phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 13
Static Method & Variables
● Ever used Configure::read() in CakePHP.
● Remember! Public static method can be accessed from any part of your application
● No more global function, move them to a wrapper class with static method
● All methods in Sanitize, Set and String among other classes in CakePHP are static
● Extensively used in Zend Framework too
phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 14
One-time/Magic Configuration
● Tired of multiple setters! Or you can't remember the order of parameters
● $options array as function parameter instead of multiple parameters or multiple setters
● setConfig() method, in constructor call setConfig(), do not bypass.
● Ensure configure and reconfigure ability
● Chain your method if possible
phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 15
Design PatternsDesign Patterns● Solve common design problems not coding problems
● Singleton, Factory and MVC patterns are common
● Worth learning: Registry, Adapter, Decorator, Observer and Strategy patterns
● Same task can be done using different patterns, so choose wisely!
● Reminder! Patterns are not perfect, they have week points too
phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 16
Singleton - Design Pattern
● Ensure a class has only one instance● Provide a global point of access to it
● Mostly used in application level Configuration, Logging, Database etc
● CakePHP uses extensive number of singleton classes like Configure, Router, App with static method etc
● Lazy initialization
phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 17
class Logger {
protected static $_instance;
private function __construct($options = null) {}
public static function &getInstance($options = null) {
If (is_null(self::$_instance)) {self::$_instance = new self($options);
}
return self::$_instance;}
public function write($message, $type = null) {}}
Logger::getInstance()->write('My log message');
// Or $Logger = Logger::getInstance();$Logger->write('My log message!');
phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 18
class Logger {
protected static $_instance;
private function __construct($options = null) {}
public static function &getInstance($options = null) {if (is_null(self::$_instance)) {
self::$_instance = new self($options);}
return self::$_instance;}
protected function _write($message, $type = null) {}
public static function write($message, $type = null) {$_this = self::getInstance();$_this->_write($message, $type = null);
}}
Logger::write('My log message!');
phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 19
Order the factory to get
your favorite jeans
Factory MethodFactory Method
phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 20
Factory Method - Design Pattern
● Single interface for creating instance from a family of classes that can do the same task in multiple ways
● Reduce platform dependency
● Example:
● Database Driver– mysqli, sqlite, oracle, postgres, odbc, mssql
● Authentication– Database, LDAP, OpenID etc
phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 21
class DatabaseDriver {
static function &factory($driver = null, $options = null) {
switch ($driver) {case 'postgres':
return PostgresDriver($options);
case 'sqlite':return SQLiteDriver($options);
default:return MySQLiDriver($options);
}}
}
$DbDriver = DatabaseDriver::factory('mysqli');
phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 22
MVC - Design Patterns
● Separate presentation, decision making and data layer
● Web is MVC
● So, your web application should be
● Zend Framework, CakePHP, CodeIgniter all are MVC
StorageClient Server
phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 23
ORM – Object Relational Mapping
● Raw SQL? No more!
● ORM is more flexible, efficient and maintainable
● CakePHP has built-in ORM through association
● Zend has Relationships using Zend_Db_Table
● Doctrine and Propel are most popular ORM in PHP
● Doctrine can be used with both Zend Framework & CodeIgniter
phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 24
Abstract Class
● Incomplete implementation of some concept
● You can implement multiple Interfaces but extend from only one abstract class
● You can't create instance of an Abstract Class
● Type hinting, enforce object type
phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 25
Code Reuse
phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 26
Code Reuse – when and how?
● Don't Re-Invent the Wheel
● But, you can always Improve the Wheel
● Decide when to Reuse● Got a peace of code that can perform a specific task
individually
● No copy & paste of the same code, put them inside a wrapper class and call whenever you need.
phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 27
Wrap your code● Say you have got a
piece of code for updating Twitter Status
● First, separate configuration variable like apiUrl, username and password
● Separate variables that are specific to call, like message
● Write your update method
class Twitter {
protected $_configs = array('apiUrl' => '_api_url_','username' => '','password' => ''
);
function __construct($options) {
$this->_configs = $options; }
function setConfig($options);
function update($message);
}
phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 28
Avoid DependencyAvoid Dependency
● My belief “Always keep the door open”
● Loosely coupled classes are reusable
● Make your class independent and flexible as much as you can
● Avoid dependency on global variables, constants, files, paths, system parameters
● Use dependency injection if necessary
phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 29
Share Your Code
● Your Blog
● PHPClasses.org
● Google Code
● Github.com
phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 30
Question and Answer
?
phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 31
Source
● All images are taken from flickr.com