php类知识点滴---魔术方法,系统在特定时机触发的方法

  • __get()获取私有或受保护属性时调用的方法
<?php
class coach
{
    private $chairfit = "徐晓冬";
    public function __construct()
    {
        echo "欢迎来到~必图拳馆训练~";
    }
    public function __get($chairfit)
    {
        echo $chairfit;//只打印属性名
    }
}
class xxd extends coach
{
   public function __construct()
   {
       echo "像个男人一样去战斗!"."
";
   }

}
$cj = new xxd();
$cj ->chairfit;
?>
输出结果:

像个男人一样去战斗!               #构造方法调用结果
chairfit                                  #继承自父类的__get()方法



#这样可以访问父类私有属性的值
<?php
class coach
{
private $chairfit = "徐晓冬";
public function __construct()
{
echo "欢迎来到~必图拳馆训练~";
}
public function __get($chairfit)
{
if ($chairfit=='chairfit')
{
return $this->chairfit;
}
}
}
class xxd extends coach
{
public function __construct()
{
echo "像个男人一样去战斗!"." ";
}

}
$cj = new cj();
print($cj ->chairfit);
?>
输出结果:

像个男人一样去战斗!         #构造方法调用结果
徐晓冬        #通过父类的__get()方法访问父类私有属性

 
  •  __set()对私有或受保护属性设置值
<?php
class coach
{
    protected $chairfit = "徐晓冬";
    public function __construct()
    {
        echo "欢迎来到~必图拳馆训练~";
    }
    public function __get($chairfit)
    {
        if ($chairfit=='chairfit')
        {
            return $this->chairfit;
        }
    }
}
class cj extends coach
{
   public function __construct()
   {
       echo "欢迎来到北武堂训练"."
";
   }
   public function __set($name,$value)  
#当然,这__set()方法也可以写到父类中去,这里仅仅是为了展示继承特性中子类可以实现对父类属性,方法的继承 { echo
"hello,我是".$value.",你的巴西柔术教练!"; } } $cj = new cj(); $cj ->chairfit='劲儿弟弟'; ?>

输出结果:

欢迎来到北武堂训练
hello,我是劲儿弟弟,你的巴西柔术教练!

 
  • 拓展:在__set()或者__get()中,如果涉及多个不能直接访问的属性(例如:受保护或私有属性)
<?php
class coach
{
    protected $chairfit = "徐晓冬";
    private $lover = "丁大锅";
    public function __construct()
    {
        echo "欢迎来到~必图拳馆训练~";
    }
    public function __get($chairfit)
    {
        return $this->$chairfit;
#注意;这里$chair是形参,如果写作chairfit,那么无论在实例化对象中访问设置什么属性,只会访问或修改父类中的属性
protected $chairfit

} }

class cj extends coach

{

  public function __construct()

  {

    echo "欢迎来到北武堂训练"." ";

  }

  public function __set($name,$value)

  {

    $this->$name = $value;

#注意;这里$name是形参,如果写作name,那么无论在实例化对象中访问设置什么属性,只会访问或修改父类中的属性protected $chairfit

  }

  public function whoilove($lover)

  {

    echo "我喜欢".$lover;

  }

}

$cj = new cj();

print("掌门人是:".$cj->chairfit." ");

print("我喜欢:".$cj->lover." ");

?>

输出结果:

欢迎来到北武堂训练
掌门人是:徐晓冬
我喜欢:丁大锅

 根据上面的代码,继续拓展

$cj->whoilove($cj->lover);
$cj->lover='陈培昌';   #调用了__set()方法实现对父类私有属性$lover的设置
$cj->whoilove($cj->lover)

输出结果:

我喜欢丁大锅
我喜欢陈培昌

原文地址:https://www.cnblogs.com/saintdingspage/p/10958937.html