<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->


<appendix xml:id="classobj.examples">
 &reftitle.examples;
 <para>
  In this example, we first define a base class and an extension
  of the class. The base class describes a general vegetable,
  whether it is edible or not and what is its color. The subclass
  <varname>Spinach</varname> adds a method to cook it and another to
  find out if it is cooked.
 </para>
 <para>
  <example>
   <title>classes.inc</title>
   <programlisting role="php">
<![CDATA[
<?php

// base class with member properties and methods
class Vegetable {

   var $edible;
   var $color;

   function Vegetable($edible, $color="green") 
   {
       $this->edible = $edible;
       $this->color = $color;
   }

   function is_edible() 
   {
       return $this->edible;
   }

   function what_color() 
   {
       return $this->color;
   }
   
} // end of class Vegetable

// extends the base class
class Spinach extends Vegetable {

   var $cooked = false;

   function Spinach() 
   {
       $this->Vegetable(true, "green");
   }

   function cook_it() 
   {
       $this->cooked = true;
   }

   function is_cooked() 
   {
       return $this->cooked;
   }
   
} // end of class Spinach

?>
]]>
   </programlisting>
  </example>
 </para>
 <para>
 We then instantiate 2 objects from these classes and print out
 information about them, including their class parentage.
 We also define some utility functions, mainly to have a nice printout
 of the variables.
 </para>
 <para>
  <example>
   <title>test_script.php</title>
   <programlisting role="php">
<![CDATA[
<pre>
<?php

include "classes.inc";

// utility functions

function print_vars($obj) 
{
foreach (get_object_vars($obj) as $prop => $val) {
    echo "\t$prop = $val\n";
}
}

function print_methods($obj) 
{
$arr = get_class_methods(get_class($obj));
foreach ($arr as $method) {
    echo "\tfunction $method()\n";
}
}

function class_parentage($obj, $class) 
{
if (is_subclass_of($GLOBALS[$obj], $class)) {
    echo "Object $obj belongs to class " . get_class($$obj);
    echo " a subclass of $class\n";
} else {
    echo "Object $obj does not belong to a subclass of $class\n";
}
}

// instantiate 2 objects

$veggie = new Vegetable(true, "blue");
$leafy = new Spinach();

// print out information about objects
echo "veggie: CLASS " . get_class($veggie) . "\n";
echo "leafy: CLASS " . get_class($leafy);
echo ", PARENT " . get_parent_class($leafy) . "\n";

// show veggie properties
echo "\nveggie: Properties\n";
print_vars($veggie);

// and leafy methods
echo "\nleafy: Methods\n";
print_methods($leafy);

echo "\nParentage:\n";
class_parentage("leafy", "Spinach");
class_parentage("leafy", "Vegetable");
?>
</pre>
]]>
   </programlisting>
   <para>
    One important thing to note in the example above is that
    the object <varname>$leafy</varname> is an instance of the class
    <classname>Spinach</classname> which is a subclass of 
    <classname>Vegetable</classname>,
    therefore the last part of the script above will output:
   </para>
   <screen>
<![CDATA[
   [...]
Parentage:
Object leafy does not belong to a subclass of Spinach
Object leafy belongs to class spinach a subclass of Vegetable
]]>
   </screen>
  </example>
 </para>
</appendix>

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->