Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:其实这几个知识点, 还是很抽象的, 挺难懂的, 如果你一遍就过, 真是不简单
//定义一个基类
class A {
public static $name = '小明';
public static function sayName() {
return '我的名字叫'.static::$name;
}
}
//定义一个扩展类
class B extends A {
public static $name = '小红';
}
//客户端代码
echo B::sayName();//调用B类继承自A类的sayName方法,绑定的是B类的环境
//定义一个工作类
class SetPersonInfo {
function __construct($name, $sex, $age)
{
$this->name = $name;
$this->sex = $sex;
$this->age = $age;
}
}
//客户端代码
$p1 = new SetPersonInfo('小明', '男', 18);
echo $p1->name;
echo $p1->sex;
echo $p1->age;
echo '<br>';
$p1 = new SetPersonInfo('小红', '女', 17);
echo $p1->name;
echo $p1->sex;
echo $p1->age;
//定义一个工作类
class Person {
//定义一个私有属性:用于演示属性查询和检测拦截器
private $name;
//定义一个私有属性:用于演示属性设置和销毁拦截器
private $age;
//初始化$name属性
public function __construct($name)
{
$this->name = $name;
}
//设置属性查询拦截转发器
public function __get($property)
{
//事先约定一些方法用于处理属性访问
$method = 'get' . ucfirst($property);
//转发访问请求
return method_exists($this, $method) ? $this->$method() : null;
}
//处理属性访问的方法1
public function getName() {
return mb_substr($this->name, 0);
}
//处理属性访问的方法2
public function getAge() {
return $this->age;
}
//设置属性设置拦截转发器
public function __set($property, $value)
{
//事先约定一些方法用于处理属性设置
$method = 'set' . ucfirst($property);
//转发访问请求
return method_exists($this, $method) ? $this->$method($value) : null;
}
//处理属性设置的方法
public function setAge($value) {
$this->age = $value;
}
//设置属性检测拦截转发器
public function __isset($property)
{
//返回检测结果
return $property === 'name' ? isset($this->name) : false;
}
//设置属性销毁拦截转发器
public function __unset($property)
{
//进行销毁处理
if ($property === 'age') {
unset($this->age);
}
}
}
//客户端代码
$p1 = new Person('小明');//定义一个对象
echo $p1->name; //访问私有属性触发查询拦截转发器
$p1->age = 18; //设置私有属性触发设置拦截转发器
echo $p1->age; //访问私有属性触发查询拦截转发器
echo isset($p1->name) ? '存在' : '不存在';//检测私有属性触发检测拦截器
unset($p1->age); //删除私有属性触发删除拦截器
echo $p1->age; //访问私有属性触发查询拦截转发器,发现没有值返回
//定义一个工作类
class Person {
//定义普通方法拦截器
public function __call($name, $arguments)
{
printf('方法名: %s , 参数: [%s]', $name, implode(', ', $arguments));
}
//定义静态方法拦截器
public static function __callStatic($name, $arguments)
{
printf('静态方法名: %s , 参数: [%s]', $name, implode(', ', $arguments));
}
}
//客户端代码
$p1 = new Person();
$p1->getName('小明', '小红', '小王', '小倩');
echo '<br>';
Person::getName('小明', '小红', '小王', '小倩');