案例介绍
下面是一个模拟狼人杀的综合案例,用构造方法建立一个对象,每次建立对象所有玩家的职业随机生成,然后利用拦截器限制修改删除和查看其他人的身份,只有当自己的身份是’先知’时才可以查看所有人的身份.
最后利用后期静态绑定以查询构造器的形式一步完成修改自己的身份为’先知’并查看所有人的身份.
代码
<?php
abstract class smode
{
public static function myclass($data)
{
return new static($data);
}
abstract protected function show();
abstract protected function print_p($text);
}
class mode extends smode
{
private $id = ['狼人', '女巫', '平民', '先知', '猎人'];
private $player = ['张三', '李四', '王五', '赵六', '钱七'];
private $array;
private $name;
protected function print_p($text)
{
printf('<pre>%s</pre><hr>', print_r($text, true));
}
public function __construct($name)
{
shuffle($this->id);
$this->array = array_combine($this->player, $this->id);
$this->name = $name;
}
protected function show()
{
$key = array_search('先知', $this->array);
if ($key == $this->name) :
foreach ($this->array as $key => $value) {
$b .= ($key . ':' . $value . '<br>');
}
echo $b.'<hr>';
else :
echo '你不是先知不能查看.<hr>';
endif;
}
public function __set($name, $value)
{
if (in_array($name, $this->player) && $name === $this->name) :
$this->array[$name] = $value;
echo $name . '将自己的身份修改成' . $value . '<hr>';
else :
echo '您无权修改其他人身份.<hr>';
endif;
}
public function __get($name)
{
if (in_array($name, $this->player) && $name === $this->name) :
return $name . ' 的身份是:' . $this->array[$name] . '<hr>';
else :
return '您无权查看其他人身份.<hr>';
endif;
}
public function __isset($name)
{
if (in_array($name, $this->player) && $name === $this->name) :
return isset($this->array[$name]);
endif;
return false;
}
public function __unset($name)
{
if (in_array($name, $this->player) && $name === $this->name) :
unset($this->array[$name]);
echo '删除了' . $name . '的所有信息<hr>';
else :
echo '你无权删除其他人信息<hr>';
endif;
}
public function __call($fun, $data=null)
{
if ($fun == 'show') $this->show();
}
public function setID($id)
{
if (in_array($this->name, $this->player)) :
$this->array[$this->name] = $id;
endif;
return $this;
}
}
$a = '张三';
$b = '李四';
echo '生成一个自己('.$a.')的身份<hr>';
$mode = new mode($a);
echo '查看自己的身份<br>';
echo $mode->$a;
echo '查看别人的身份<br>';
echo $mode->$b;
echo '查看所有人的身份<br>';
$mode->show();
echo '修改自己的身份<br>';
$mode->$a = '先知';
echo '修改别人的身份<br>';
$mode->$b = '先知';
echo '查看所有人的身份<br>';
$mode->show();
echo '删除自己的信息<br>';
unset($mode->$a);
echo '删除别人的信息<br>';
unset($mode->$b);
echo '查看所有人的身份(因为自己的信息被删除所以不能查看所有人)<br>';
$mode->show();
echo "将自己的身份修改成先知并查看所有人身份<br>";
mode::myclass('张三')
->setID('先知')
->show();