What both of these do is to provide an interface to an array of classes. Classes as in the HTML attribute:
Code: Select all
<div class="">You can, add, remove and parse from a string. Please note the code itself is untested.
ChoiceA
Code: Select all
class ChoiceA
{
private $_classes;
public function __get($name)
{
if ($name == 'class') {
return implode(' ', $this->_classes);
}
}
public function __set($name, $value)
{
if ($name == 'class') {
$this->_classes = preg_split('/\s+/', trim($value));
}
}
public function addClass($toAdd)
{
$this->_classes[] = removeAllWhitespace($toAdd);
}
public function removeClass($toAdd)
{
$result = array_search($toAdd, $this->_classes);
if ($result !== false) {
$this->_classes[$result] = null;
}
}
}
/**** USAGE ******/
$div = new ChoiceA;
$div->class = 'foo bar';
$div->addClass('zim');
// $div->class == 'foo bar zim';
$div->removeClass('bar');
// $div->class == 'foo zim';Code: Select all
class ChoiceB
{
private $_classes;
public function __construct()
{
$this->_classes = new HtmlClassManager;
}
public function __get($name)
{
if ($name == 'class') {
return $this->_classes;
}
}
// no __set
}
class HtmlClassManager
{
private $_classes;
public function add($class)
{
$this->_classes[] = $class;
}
public function remove($class)
{
$result = array_search($toAdd, $this->_classes);
if ($result !== false) {
$this->_classes[$result] = null;
}
}
public function set($classes) // just an alias
{
$this->parseFromString($classes);
}
public function parseFromString($classes)
{
$this->_classes = preg_split('/\s+/', trim($classes));
}
public function get()
{
return implode(' ', $this->_classes);
}
}
/**** USAGE ******/
$div = new ChoiceB;
$div->class->parseFromString('foo bar');
$div->class->add('zim');
$div->class->remove('bar');
// $div->class->get() == 'foo zim';