|
|
@@ -0,0 +1,196 @@ |
|
|
<?php |
|
|
|
|
|
/** |
|
|
* A base class with getters and setters incorporated. |
|
|
*/ |
|
|
class ObjectBase { |
|
|
/** |
|
|
* Setter function for a generic attribute. |
|
|
* |
|
|
* @param string $property_name |
|
|
* Name of the attribute to set. |
|
|
* @param mixed $value |
|
|
* The value to set. |
|
|
*/ |
|
|
public function set($attribute_name, $value) { |
|
|
$this->{$attribute_name} = $value; |
|
|
} |
|
|
|
|
|
/** |
|
|
* Getter for a generic attribute. |
|
|
* |
|
|
* @param string $attribute_name |
|
|
* The name of the attribute to get. |
|
|
* @return mixed |
|
|
* The value of the attribute. |
|
|
*/ |
|
|
public function get($attribute_name) { |
|
|
return $this->{$attribute_name}; |
|
|
} |
|
|
|
|
|
/** |
|
|
* Get a dash based attribute name based on a camel cased name. |
|
|
* |
|
|
* @param string $camel |
|
|
* The camel case name. |
|
|
* @return string |
|
|
* The dash separated name. |
|
|
*/ |
|
|
private function getAttribute($camel) { |
|
|
// Make the first letter lower case. |
|
|
$camel[0] = strtolower($camel[0]); |
|
|
// Insert a dash in front of every uppercase character. |
|
|
$attribute = preg_replace('/([A-Z0-9])/', "_$1", $camel); |
|
|
// Make everything lower case. |
|
|
return strtolower($attribute); |
|
|
} |
|
|
|
|
|
/** |
|
|
* Implement the magic __call method to cath calls to undefined methods. |
|
|
*/ |
|
|
function __call($method, $args) { |
|
|
// Detect if it's a getter |
|
|
if (strpos($method, 'get') === 0 && count($args) == 0) { |
|
|
$attribute_name = $this->getAttribute(substr($method, 3)); |
|
|
return $this->get($attribute_name); |
|
|
} |
|
|
elseif (strpos($method, 'set') === 0 && count($args) == 1) { |
|
|
$attribute_name = $this->getAttribute(substr($method, 3)); |
|
|
$this->set($attribute_name, $args[0]); |
|
|
} |
|
|
else { |
|
|
// Raise an error because we don't know the method. |
|
|
throw new ErrorException("Undefined method: $method"); |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
/** |
|
|
* Bank account dummy class to demonstrate the use of the ObjectBase class. |
|
|
*/ |
|
|
class BankAccount extends ObjectBase { |
|
|
/** |
|
|
* Balance for this account. |
|
|
*/ |
|
|
protected $balance; |
|
|
/** |
|
|
* Number of credit cards registered to this account. |
|
|
*/ |
|
|
protected $credit_cards; |
|
|
/** |
|
|
* Number of transactions to display. |
|
|
*/ |
|
|
public $transactions; |
|
|
|
|
|
function __construct() { |
|
|
$this->balance = 0; |
|
|
$this->transactions = 0; |
|
|
$this->credit_cards = 0; |
|
|
} |
|
|
} |
|
|
|
|
|
$account = new BankAccount(); |
|
|
// Set some values. |
|
|
$account->setBalance(1000); |
|
|
$account->setCreditCards(2); |
|
|
$account->setTransactions(25); |
|
|
// Get some values. |
|
|
print "Balance : " . $account->getBalance() . "\n"; |
|
|
print "Transactions: " . $account->getTransactions() . "\n"; |
|
|
print "Credit Cards: " . $account->getCreditCards() . "\n"; |
|
|
|
|
|
/**************************************/ |
|
|
// Simple inheritance? No problem, do it with traits! |
|
|
trait ObjectTrait { |
|
|
/** |
|
|
* Setter function for a generic attribute. |
|
|
* |
|
|
* @param string $property_name |
|
|
* Name of the attribute to set. |
|
|
* @param mixed $value |
|
|
* The value to set. |
|
|
*/ |
|
|
public function set($attribute_name, $value) { |
|
|
$this->{$attribute_name} = $value; |
|
|
} |
|
|
|
|
|
/** |
|
|
* Getter for a generic attribute. |
|
|
* |
|
|
* @param string $attribute_name |
|
|
* The name of the attribute to get. |
|
|
* @return mixed |
|
|
* The value of the attribute. |
|
|
*/ |
|
|
public function get($attribute_name) { |
|
|
return $this->{$attribute_name}; |
|
|
} |
|
|
|
|
|
/** |
|
|
* Get a dash based attribute name based on a camel cased name. |
|
|
* |
|
|
* @param string $camel |
|
|
* The camel case name. |
|
|
* @return string |
|
|
* The dash separated name. |
|
|
*/ |
|
|
private function getAttribute($camel) { |
|
|
// Make the first letter lower case. |
|
|
$camel[0] = strtolower($camel[0]); |
|
|
// Insert a dash in front of every uppercase character. |
|
|
$attribute = preg_replace('/([A-Z0-9])/', "_$1", $camel); |
|
|
// Make everything lower case. |
|
|
return strtolower($attribute); |
|
|
} |
|
|
|
|
|
/** |
|
|
* Implement the magic __call method to cath calls to undefined methods. |
|
|
*/ |
|
|
function __call($method, $args) { |
|
|
// Detect if it's a getter |
|
|
if (strpos($method, 'get') === 0 && count($args) == 0) { |
|
|
$attribute_name = $this->getAttribute(substr($method, 3)); |
|
|
return $this->get($attribute_name); |
|
|
} |
|
|
elseif (strpos($method, 'set') === 0 && count($args) == 1) { |
|
|
$attribute_name = $this->getAttribute(substr($method, 3)); |
|
|
$this->set($attribute_name, $args[0]); |
|
|
} |
|
|
else { |
|
|
// Raise an error because we don't know the method. |
|
|
throw new ErrorException("Undefined method: $method"); |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
class BankAccountTraits { |
|
|
use ObjectTrait; |
|
|
/** |
|
|
* Balance for this account. |
|
|
*/ |
|
|
protected $balance; |
|
|
/** |
|
|
* Number of credit cards registered to this account. |
|
|
*/ |
|
|
protected $credit_cards; |
|
|
/** |
|
|
* Number of transactions to display. |
|
|
*/ |
|
|
public $transactions; |
|
|
|
|
|
function __construct() { |
|
|
$this->balance = 0; |
|
|
$this->transactions = 0; |
|
|
$this->credit_cards = 0; |
|
|
} |
|
|
} |
|
|
|
|
|
$account = new BankAccountTraits(); |
|
|
// Set some values. |
|
|
$account->setBalance(1000); |
|
|
$account->setCreditCards(2); |
|
|
$account->setTransactions(25); |
|
|
// Get some values. |
|
|
print "Balance : " . $account->getBalance() . "\n"; |
|
|
print "Transactions: " . $account->getTransactions() . "\n"; |
|
|
print "Credit Cards: " . $account->getCreditCards() . "\n"; |