Skip to content

Instantly share code, notes, and snippets.

@chuyskywalker
Created September 24, 2013 06:21
Show Gist options
  • Save chuyskywalker/6681006 to your computer and use it in GitHub Desktop.
Save chuyskywalker/6681006 to your computer and use it in GitHub Desktop.
ENUM Experiment
<?php
namespace Enum {
abstract class Enum {
public function __toString() {
return get_called_class();
}
public static function types() {
$thisclass = get_called_class();
if (get_parent_class($thisclass) !== __CLASS__) {
throw new \Exception('You may only call types() on parent enums, not their children');
}
$children = array();
foreach (get_declared_classes() as $class) {
if (is_subclass_of($class, $thisclass)) {
$children[] = $class;
}
}
return $children;
}
}
}
namespace Enum\Gender {
use Enum;
abstract class Gender extends Enum\Enum {}
final class Male extends Gender {}
final class Female extends Gender {}
}
namespace Enum\Eyecolor {
use Enum;
abstract class Eyecolor extends Enum\Enum {}
final class Blue extends Eyecolor {}
final class Green extends Eyecolor {}
final class Yellow extends Eyecolor {}
final class Red extends Eyecolor {}
final class Brown extends Eyecolor {}
final class Orange extends Eyecolor {}
final class Pink extends Eyecolor {}
final class Black extends Eyecolor {}
final class SoulStealing extends Eyecolor {}
}
namespace Userlandcode {
use Enum;
function echoGender1(Enum\Gender\Gender $gender) {
if ($gender instanceof Enum\Gender\Male) {
echo "Hey dude! -- " . $gender . "\n";
}
elseif ($gender instanceof Enum\Gender\Female) {
echo "Hey dudette! -- " . $gender . "\n";
}
else {
echo "Hey...you.\n";
}
}
echoGender1(new Enum\Gender\Male);
echoGender1(new Enum\Gender\Female);
$male = new Enum\Gender\Male;
echoGender1($male);
function echoGender2(Enum\Gender\Gender $gender) {
switch ($gender) {
case (new Enum\Gender\Male): echo "Hey dude! -- " . $gender . "\n"; break;
case (new Enum\Gender\Female): echo "Hey dudette! -- " . $gender . "\n"; break;
default: echo "Hey...you\n"; break;
}
}
echoGender2(new Enum\Gender\Male);
echoGender2(new Enum\Gender\Female);
$male = new Enum\Gender\Male;
echoGender2($male);
echo 'Genders: ' . print_r(Enum\Gender\Gender::types(), 1);
echo 'Eye colors: ' . print_r(Enum\Eyecolor\Eyecolor::types(), 1);
try {
echo 'Lol, nope: ' . print_r(Enum\Eyecolor\Green::types(), 1);
} catch (\Exception $e){
echo "Exception: " . $e->getMessage() . "\n";
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment