Moving…
April 28, 2010
Comments off
This is a great day for me! I’m moving this blog, until I’ll get my own domain, to http://criss-dev.com/kos/blog/.
Hope to see you all there
Categories: Global
Protect class’s properties
March 28, 2010
Comments off
The following class can be used to extend your existent class(es) when you want them to disallow run-time properties instantiation.
class SafeObject
<?php
/**
* base class SafeObject
*
* @description: This base class protects other classes from having properties instantiated at run-time
* @author: Costin Trifan
* @date: 28.03.2010
* @version: 1.0
* @status: release
*/
class SafeObject
{
/**
* The list of public properties that can be set to this class
* @type array
* @access private
* @see __get(), __set(), AllowedProperties()
*/
private $properties = array();
/**
* Whether or not to restrict access to class's properties.
* @type bool
* @access private
* @see RestrictedAccess()
*/
private $restricted = true;
/**
* PRIVATE METHODS
*-------------------------------------------
*/
private function __clone()
{
exit('<br/>Error: You are not allowed to use method [__clone] in class: '.get_class($this));
}
private function __sleep()
{
exit('<br/>Error: You are not allowed to use method [__sleep] in class: '.get_class($this));
}
private function __wakeup()
{
exit('<br/>Error: You are not allowed to use method [__wakeup] in class: '.get_class($this));
}
/**
* PUBLIC METHODS
*-------------------------------------------
*/
public function __construct(){}
public function __destruct(){}
public function __unset( $var )
{
if ($this->restricted)
{
exit('<br/>Error: You are not allowed to use method [__unset] in class: '.get_class($this));
}
unset($var);
}
public function __isset( $name )
{
return isset($this->properties[$name]);
}
public function __toString()
{
$str = '';
foreach($this->properties as $key=>$value)
{
$str .= $key . ' = '. $value. '<br/>';
}
return $str;
}
final public function __get( $name )
{
if ($this->restricted)
{
if (array_key_exists($name, $this->properties)) {
return $this->properties[$name];
}
}
else {
if ($this->__isset($name)) {
return $this->name;
}
}
exit("<br/>Error: Property: [{$name}] was not found!");
}
final public function __set( $name, $value )
{
if ($this->restricted)
{
if (array_key_exists($name, $this->properties)) {
$this->properties[$name] = $value;
}
else { exit("<br/>Error: Property: [{$name}] cannot be set!"); }
}
else { $this->name = $value; }
}
/**
* Restrict access to class's properties to only the allowed properties.
* @return $this
*/
final public function AllowedProperties( array $properties )
{
if ($this->restricted)
{
foreach( $properties as $prop )
{
$this->properties[$prop] = null;
}
}
return $this;
}
/**
* Whether or not to restrict access to class's properties.
* @return $this
*/
final public function RestrictedAccess( $value )
{
$this->restricted = $value;
return $this;
}
}
Tests
/*
* TESTS
*/
class Test extends SafeObject
{
public function DoSomething() { echo 'Doing something...'; }
public function DoSomethingElse() { echo 'Doing something else...'; }
}
$o = new Test();
$o->RestrictedAccess(true)
->AllowedProperties(array('server','username')); /* << class Test can only have these two public properties */
// ok
$o->server = 'localhost';
echo '<br/>server: ' , $o->server;
// ok
$o->username = 'costin';
echo '<br/>username: ' , $o->username;
// NOT ok
unset($o->username);
// NOT ok
$o->test = 'test';
echo '<br/>test: ' , $o->test;
// __toString()
echo '<br/>' , $o;
?>
Note:
When the RestrictedAccess function’s argument is set to FALSE then that class allows the instantiation of public properties at run-time.
Categories: PHP
PHP, protect class's properties
Recent Comments