note 46881 deleted from language.oop5.abstract by nlopess
| From: | nlopess@php.net | Date: | Thu, 04 Nov 2004 19:50:26 +0000 |
| Subject: | note 46881 deleted from language.oop5.abstract by nlopess | ||
| References: | 1 | Groups: | php.notes |
| Request: | Send a blank email to php-notes+get-79637@lists.php.net to get a copy of this message | ||
Note Submitter: stapleton at tod+em_pord dot mps dot ohio-state dot edu
----
A couple notes:
The following will now work (even if ObjectName is a sibling or child)
$this = new ObjectName; //error
parent::parent::function(); //interesting error
This demo shows how to create a generic abstraction one class can act similarly to other classes,
and change at runtime as needed.
if a parent has function() defined, but the child does not, the following are identical:
parent::function(); //always use parents
self::function(); //use own if possible, parents otherwise
$this->function(); //same as self
Try the following:
<?
abstract class abby
{
//used when no decendant whoami is defined
public function whoami()
{
echo "I'm a child of Abby!<BR>\n";
}
//abstract --> no body/definition
abstract public function greet();
}
//Child of abby
class typea extends abby
{
//it has it's own greet, mom handles whoami
public function greet()
{
echo "<B>Hello World!</B> I'm Type 1<BR>\n";
parent::whoami();
}
}
class typeb extends abby
{
//mom still handles whoami, but implicitly
public function greet()
{
echo "<B>Hello World!</B> I'm Type 2<BR>\n";
self::whoami();
}
}
//grandchild of abby
class typec extends typeb
{
public function greet()
{
echo "<B>Hello World!</B> I'm Type 3<BR>\nMy parent
says:<BR><HR>\n";
parent::greet();
echo "<HR>When I ask my parent 'who are you?', it
says:<BR><HR>\n";
parent::whoami();
echo "<HR>I am:<BR>\n";
//implicitly calls parent's whoami
$this->whoami();
}
}
class genny extends abby
{
private $internal = 0;
public function whoami()
{
if($this->internal == 0)
echo "I'm Genni, the generic wrapper needed because you can't assign \$this to
something new, like a child or sibling<BR>\n";
else
$this->internal->whoami();
}
public function greet()
{
if($this->internal == 0)
{
echo "<B>Hello World!</B> I'm Genny, the initial class for a generic
Abby object!<BR>\n";
self::whoami(); //same as $this->whoami()
}
else
$this->internal->greet();
}
//new functions
public function morph($type)
{
switch($type)
{
case 1:
$this->internal = new typea;
break;
case 2:
$this->internal = new typeb;
break;
case 3:
$this->internal = new typec;
break;
default:
echo "I can't change into a type $type... Going to my normal
form!<BR>\n";
$this->internal = 0;
}
echo "<BR><BR>\n";
}
}
$var = new genny;
echo "Genny is here!<BR>\n";
$var->greet();
echo "Uh-oh, something weird is happening to Genny!<BR>\n";
$var->morph(1);
$var->greet();
echo "Umm, it's happening again?<BR>\n";
$var->morph(2);
$var->greet();
echo "Oh my, this Genny, she's... I mean Type A, err, Type B now...
Weird...<BR>\n";
$var->morph(3);
$var->greet();
echo "Dear me, it's trying again, something doens't look right
though...<BR>\n";
$var->morph(4);
$var->greet();
?>