note 87008 deleted from language.oop5.overloading by cmb
| From: | cmb@php.net | Date: | Sun, 18 Dec 2016 10:02:38 +0000 |
| Subject: | note 87008 deleted from language.oop5.overloading by cmb | ||
| References: | 1 | Groups: | php.notes |
| Request: | Send a blank email to php-notes+get-208653@lists.php.net to get a copy of this message | ||
Note Submitter: erick2711 at gmail dot com
----
<?php
/*
Here folows a little improvement of the 'strafvollzugsbeamter at gmx dot de' code,
allowing each node to hold both 'parameters' and 'child nodes', and
differentiate $s->A->B->C ('FOO') from $s->A (same 'FOO', but
shouldn't exist) and from $s-A->B (idem).
This allows the class, using the interesting suggested syntax
($root->dad->child->attribute, in which 'dad's and 'child's names are
dynamically generated), to do something actually useful, like implementing a n-tree data structure
(a menu, for instance).
It was tested under PHP 5.2.6 / Windows.
I know that must there be something better which already do this (probably in the DOM Model
classes, or something like), but it was fun to develop this one, for the sake of studying the
"magic" methods.
Its a compressed version of the code (no comments, too short variable names, almost no
identation). I had to compress it in order to add the note. If anyone cares about the full version,
just email me.
[]s
erick2711 at gmail dot com
*/
class nodoMenu{
protected $p = array();
protected $c = array();
public function __construct($t = '', $uri = '', $css = null, $n = 0, $i=0){
$this->p['t'] = $t;$this->p['uri'] =
$uri;$this->p['css'] = $css;$this->p['n'] = $n;$this->p['i']
= $i;$this->p['q'] = 0;return $this;
}
public function add($cn, $ct = '', $cl = '', $css = null){
$nc = new nodoMenu($ct, $cl, $css, $this->p['n'] + 1,
$this->p['q']);$this->c[$cn] = $nc;$this->p['q'] += 1;return
$this->c[$cn];
}
private function isParameter($pn){
return array_key_exists($pn, $this->p);
}
public function __isset($pn){
if ($this->isParameter($pn)){return(!is_null($this->p[$pn]));}
else{return(array_key_exists($pn, $this->c));}
}
public function remove($cn){
if (array_key_exists($cn, $this->c)){$this->p['q'] -=
1;unset($this->c[$cn]);}
}
public function __unset($pn){
if ($this->isParameter($pn)){$this->p[$pn] = null;}
else{$this->remove($pn);}
}
public function __set($pn, $v){
$r = null;
if ($this->isParameter($pn)){$this->p[$pn] = $v;$r = $v;}
else{if (array_key_exists($pn, $this->c)){$this->c[$pn] = $v;$r = $this->c[$pn];}
else{$r = $this->add($pn);}}
return $r;
}
public function __get($pn){
$v = null;
if ($this->isParameter($pn)){$v = $this->p[$pn];}
else{if (array_key_exists($pn, $this->c)){$v = $this->c[$pn];}
else{$v = $this->add($pn);}}
return $v;
}
public function hasChilds(){
return(isset($this->c[0]));
}
public function child($i){
return $this->c[$i];
}
public function strPrint($bm = ''){ //Just to show, replace with something better.
$m = '';$r = '';$n = $this->p['n'];
if ($n > 0){switch($n){case 0:case 1: $qs = 0; break;case 2: $qs = 2; break;case 3: $qs =
6; break;case 4: $qs = 12; break;case 5: $qs = 20; break;case 6: $qs = 30; break;case 7: $qs = 42;
break;case 8: $qs = 56; break;}
$tab = str_repeat(' ', $qs);$r .= $tab;
if ($bm <> ''){$m = $bm.'.';}
$im = $this->p['i'] + 1;$m .= $im;$r .= $m.' ';$r .=
$this->p['t']."<br>\n";
}
foreach ($this->c as $child){$r .= $child->strPrint($m);}
return $r;
}
public function __toString(){
return $this->strPrint();
}
}
?>