GetSetGo – Dynamic Setter Getter Library for PHP

Build Status

GetSetGo is a dynamic setter-getter library for PHP 5.4+. Its developed by me and Sheikh Heera, and yes, its well unit tested.

You can use methods like setFoo('bar') and getFoo(), which you DON’T have to create (in your class). GetSetGo will make these methods work for you automatically as long as you have a $foo property in your class.

It makes use of Traits, so using it is super simple, you don’t have to extend any class, as you can extend a single class only, we don’t force you to use ours.
You can restrict to only getter only or you can specify a Type for property using annotations.

View on GitHubPackagist

Installation

GetSetGo uses Composer to make hassles Go.

Learn to use composer and add this to require (in your composer.json):

[code]
"usmanhalalit/get-set-go": "1.*@dev"
[/code]

Usage

Just add this in your classes:

use \GetSetGo\SetterGetter;

Example:

Class MyClass{
    use \GetSetGo\SetterGetter;

    protected $foo;
}

Now use it as
$myClass = new MyClass;

$myClass->setFoo('bar');
echo $myClass->getFoo();

That’s basically it.

Restrict Getter or Setter or Both

You can use annotation in you class property if you want to disable setter, getter or both using @setter and @getter annotation variables.

/**
 * We can't use setSomeProperty() anymore.
 *
 * @var
 * @setter false
 */
protected $someProperty;


/**
 * We can't use getSomeProperty() anymore.
 *
 * @var \stdClass
 * @getter false
 */
protected $someProperty;


/**
 * We can't use setSomeProperty() or getSomeProperty().
 *
 * @getter false
 * @setter false
 */
protected $someProperty;

Force a Type or Class

You can specify a type for the property using @var annotation variable, so setter will take only a value of this type, else it will throw an exception. The code below will work similar as public function setSomeProperty(stdClass $value){}

/**
 * Should be an instance of stdClass only.
 *
 * @var \stdClass
 */
protected $shouldBeStdClass;


/**
 * Should be an array only.
 *
 * @var Array
 */
protected $shouldBeArray;


/**
 * Should be a string only
 *
 * @var String
 */
protected $shouldBeString;


/**
 * Should be a number only.
 *
 * @var Number
 */
protected $shouldBeNumber;


/**
 * Should be an object only.
 *
 * @var Object
 */
protected $shouldBeObject;

Notes

GetSetGo assumes that you use proper camelCase. So name your properties like $pdoInstance (not $PDOInstance) and call setPdoInstance() method.

WordPress like Option feature for your CodeIgniter application

If you have developed a large application you may have faced this problem, in some cases we have some settings or options to save in the database but the data is not so large to create a db table for it, also it may do not require many rows. In that case we should have a table for settings, where we can store all our settings or options with a key then retrieve it. Our option can be a text value or an array or an object. WordPress has a really good feature for such cases its the Option Mechanism. By using the appropriate function, options can be addedchangedremoved, and retrieved.

I loved this feature too much that I added such feature in my CodeIgniter applications, because I don’t always use WordPress. Now I want to share my code with you which may help you in various tasks. Its not the exact same as WordPress. I have used 4 functions for it add_option, update_option, get_option and delete_option. The good part is you can store a PHP array, object or a string value (including number) with add_option(‘name_of_option’,’value’) or with update_option(‘name_of_option’,’value’) and whenever you retrieve your data with get_option(‘name_of_option’) it returns the data with the same format.
(Sorry, if you have used it in WordPress you may already know it and some info below, but its for those who haven’t used).

You may download the code from GitHub, also any contribution is highly appreciated.

Functions:

add_option(‘name_of_option’,’value’) will store data in the db with ‘name_of_option’ if the ‘name_of_option’ is already used it will return false, use add_option if you want to store a data for the first time such as installing an app.

update_option(‘name_of_option’,’value’) will update the ‘name_of_option’ if it is already used. If ‘name_of_option’ is not found it will add ‘name_of_option’. So use update_option in general case.

get_option(‘name_of_option’) will return the value of ‘name_of_option’ in original data type. Will return false if option is not found.

delete_option(‘name_of_option’) will delete the option and return true/false on success/failure.

Usage Example:

Below is the usage for CodeIgniter controller, I have made it as a CodeIgniter Helper. You will find instructions below on how to implement this Helper. I assume you have database set up in application/config/database.php

public function index()
{
	//load our helper,
	//better to autoload it by editing application/config/autoload.php
	$this->load->helper('option_helper');

	//text value example
	update_option('username','Usman');
	echo get_option('username');
	//array example
	$user_info=array(
		'username'		=>	'Usman',
		'profession'	=>	'Developer',
		'location'		=>	'Sylhet, Bangladesh',
	);
	update_option('user_info',$user_info);
	$return_value=get_option('user_info');
	print_r($return_value);
	echo $return_value['location'];

	//delete example

	delete_option('username');
	//delete_option('user_info');
}

Implementation:

1. Create a table in your database like below (of course its MySQL) :

CREATE TABLE IF NOT EXISTS `tbl_option` (

`option_id` bigint(20) NOT NULL AUTO_INCREMENT,

`option_name` varchar(50) COLLATE utf8_unicode_ci NOT NULL,

`option_value` longtext COLLATE utf8_unicode_ci NOT NULL,

`option_type` varchar(20) COLLATE utf8_unicode_ci NOT NULL,

PRIMARY KEY (`option_id`),

UNIQUE KEY `option_name` (`option_name`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=59 ;

2. As I have made a CodeIgniter Helper for this, keep the code in application/helpers folder (in most cases) and name it option_helper.php. I haven’t used any model for simplicity.

3. Copy the code below and paste it to your option_helper.php, that’s it.

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
function add_option($name,$value) 
{ 	         
      $CI =& get_instance(); 
      $CI->load->database();
	$query=$CI->db->select('*')->from('tbl_option')->where('option_name',$name)->get();

	//option already exists
	if($query->num_rows() > 0)
		return false;

	$data_type='text';
	if(is_array($value))
	{
		$data_type='array';
		$value=serialize($value);
	}
	elseif(is_object($value))
	{
		$data_type='object';
		$value=serialize($value);
	}

	$data=array(
		'option_name'=>$name,
		'option_value'=>$value,
		'option_type'=>$data_type,
	);
	$CI->db->insert('tbl_option',$data);
}

function update_option($name,$value)
{
	$CI =& get_instance();
	$CI->load->database();

	$data_type='text';
	if(is_array($value))
	{
		$data_type='array';
		$value=serialize($value);
	}
	elseif(is_object($value))
	{
		$data_type='object';
		$value=serialize($value);
	}

	$data=array(
		'option_name'=>$name,
		'option_value'=>$value,
		'option_type'=>$data_type,
	);
	$query=$CI->db->select('*')->from('tbl_option')->where('option_name',$name)->get();

	//if option already exists then update else insert new
	if($query->num_rows() < 1) return $CI->db->insert('tbl_option',$data);
	else		  return $CI->db->update('tbl_option',$data,array('option_name'=>$name));
}

function get_option($name)
{
	$CI =& get_instance();
	$CI->load->database();
	$query=$CI->db->select('*')->from('tbl_option')->where('option_name',$name)->get();
	//option not found
	if($query->num_rows() < 1) return false; 	 	$option=$query->row();

	if('text'==$option->option_type)
		$value=$option->option_value;
	elseif('array'==$option->option_type || 'object'==$option->option_type)
		$value=unserialize($option->option_value);

	return $value;
}

function delete_option($name)
{
	$CI =& get_instance();
	$CI->load->database();
	return $CI->db->delete('tbl_option',array('option_name'=>$name));
}

If you have found it useful, please comment below. Any bug report or suggestions are most welcome.