Namespace in PHP:-
Namespace concept isn’t any new for programmers coming from c++, java, python or ruby platform. They are a way of encapsulating classes. You could compare it with package in other programming language, which contains several classes.
Advantages of PHP Namespaces:-
- Prevents class collisions of different libraries.
- Allow to use class alias to make code more readable.
Defining and importing Namespaces in PHP.
1 2 | namespace DB; // here DB is declared as namespace any code come below will be encapsulated by it. |
They can be separated by forward slashes.
1 2 | namespace \FRAMEWORK\DB\MODELS; // but it doesn't mean class DB must reside inside FRAMEWORK namespace. |
Now to use it,
1 2 | use \FRAMEWORK\DB\MODELS as model; // to import namespace in your application. |
Example:- code readability with namespaces
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | use \DB\MySQL as mysql; /** * Creating a new database connection. * new mysql() creates new Object */ $link = new mysql(array( 'host' => 'localhost', 'database' => 'curd', 'username' => 'root', 'password' => '' )); $DB = $link->getConnection()->connectDB(); $users = $DB->query("select * from users")->fetch(); |
See the database table structure for above code.
Using namespace in PHP code
We’ll have following file structure to arrange the namespace.
1 2 3 4 5 6 7 8 | /demo.php /config.php /import/ /import/db.php /import/db/ /import/db/mysql.php /import/db/mysql/ /import/db/mysql/query.php |
Make config file with global configuration:-
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | //File Location: /config.php define("NAMESPACE_DIR",'import'); function __autoload($class) { $parts = explode("\\", $class); $filepath = implode(DIRECTORY_SEPARATOR,$parts); $filepath = strtolower(NAMESPACE_DIR.DIRECTORY_SEPARATOR.$filepath.'.php'); require $filepath; } $DB_SETTINGS = array( 'host' => 'localhost', 'database' => 'curd', 'username' => 'root', 'password' => '' ); global $DB_SETTINGS; |
- Above code makes default setting for database connection.
- we made __autoload() function to specify php how it should load class files.
- In our example __autoload() function looks into directory “import”.
- Then every namespace would be store as separate directory.
- classes within that namespace will be stored inside namespace directory.
Example, see following code
1 | use \DB\MySQL as mysql; |
___autoload() will look for file into following location.
1 | /import/db/mysql/mysql.php |
Revisiting basic mysql functions
Function Name | Description |
---|---|
mysql_connect(‘HOSTNAME’,’USER’,’PASSWORD’); | Connects to mysql server. |
mysql_select_db(‘DATABASE’); | Select database from mysql |
mysql_query(‘SQL’) | Does SQL manipulations |
mysql_fetch_row / mysql_fetch_array / mysql_fetch_assoc | Gets SQL results into array. |
mysql_close() | Closes Database Connection |
Create mysql class into DB package
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | //File Location: /import/db/mysql.php namespace DB; class MySQL{ protected $host; protected $database; protected $username; protected $password; private $resource_id; public $connection = NULL; function __construct($settings = array()) { $this->host = $settings['host']; $this->database = $settings['database']; $this->username = $settings['username']; $this->password = $settings['password']; /** * if connection already created just return resource_id * else create new one */ if( is_null($this->connection) ) { $this->getConnection()->connectDB(); } return $this->connection; } function __destruct() { @mysql_close($this->connection); } public function getConnection(){ /** * Native php function to create db_connection */ $this->connection = @mysql_connect( $this->host, $this->username, $this->password ); if(!$this->connection) { die("Unable to create connection, Server might be too busy or check your credentials!"); } return $this; } public function connectDB() { /** * Native php function to select database */ if(mysql_select_db($this->database,$this->connection)){ return $this; } else { die("Unable to connect to database"); } } } |
Create query class into MySQL package
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | //File Location: /import/db/mysql/query.php namespace DB\Mysql; use DB\Mysql as mysql; class Query extends mysql{ private $resource_id; private $record_set; function __construct( $sql ){ global $DB_SETTINGS; $this->record_set = Array(); $this->resource_id = parent::__construct($DB_SETTINGS); $this->query($sql); } public function query($sql) { $this->resource_id = mysql_query($sql,$this->connection); if(!$this->resource_id){ echo (mysql_error()); return null; } return $this; } public function fetch() { $record_set = Array(); while($row = mysql_fetch_assoc($this->resource_id)) { $record_set[] = $row; } return $record_set; } } |
Creating demo.php file
1 2 3 4 5 6 7 8 9 10 11 12 13 | // File Location: /demo.php require("config.php"); use DB\MySQL\Query as query; $users = new query("select * from users"); $all_users = $users->fetch(); foreach ($all_users as $user): print $user['name'] . " "; print $user['email'] . ""; endforeach; |
You could download sample working code here. In upcoming post I’ll explain how to plug mysqli class to this DB package without changing core business logic.
Nice blog, looking forward to see more useful stuff here.
Thanks Vikas. 🙂
Hello there! Your post is so useful. But I have some doubts about it. How do you implement the _autoload fuction in the configuration file?