面向对象编程之玩转重载

版权声明:俗世凡人行(释) QQ:748507607 https://blog.csdn.net/weixin_41887155/article/details/86257243

目录

一: 重载

二: PHP中的重载

1.概念

2.魔术方法之属性重载

3.属性重载的意义

4.魔术方法之方法重载

5.总结


一: 重载

1. 重载:重新加载;

2. overload;在面向对象中,指的是一个方法(函数)有不同的参数或者返回值时,存在的多种形式,允许同名函数的存在。

3. 在PHP中,不允许同名函数的存在,所以PHP不支持这种重载

class  Yuangong
{
  Public string function working(普通员工)
  {
     echo ‘都地主’;return ‘很嗨’;
  }

  Public string function working(主管)
  {
     echo ‘炸金花’;return ‘真嗨’
  }

  Public string function working(经理)
  {
     echo ‘打麻将’;return ‘嗨翻天类’;
  };
}

二: PHP中的重载

1.概念

       在PHP中不支持传统意义上的重载,在一个文件(类)中不允许有同名函数的存在,指的是在类的外部操作一个不存在的或者权限不够的属性或者方法时,会自动触发相应的魔术方法,这种机制就叫做PHP的重载;

       重载分为属性重载和方法重载。

2.魔术方法之属性重载

     =>在类的外部访问权限不够的属性时,会报错;

     =>魔术方法:

     => __get(属性名称)当访问一个不存在或者权限不够的属性时,自动调用的方法;

<?php
  //重载
  class Person
  {
  	public $name = "张三";
  	protected $sex = "男";
  	private $money = 200;

  	//当访问不存在或者权限不够的属性时自动触发的方法
  	public function __get($name)
  	{
  		echo "您访问的属性".$name."权限不够或者不存在";
  	}

  }

  $p = new Person();
  echo $p->name;  
  echo "<br />";
  echo $p->sex; //受保护的不能直接访问
  echo "<br />";
  echo $p->money;  //私有的不能直接访问

效果:

张三
您访问的属性sex权限不够或者不存在
您访问的属性money权限不够或者不存在

     =>  __set(属性名称,值),当设置(修改)一个不存在或者权限不够的属性时,会自动调用的方法;

<?php
  //重载
  class Person
  {
  	public $name = "张三";
  	protected $sex = "男";
  	private $money = 200;

  	//当访问不存在或者权限不够的属性时自动触发的方法
  	public function __set($name,$value)
  	{
  		echo "您设置的属性".$name."权限不够或者不存在";
  	}

  }

  $p = new Person();
  echo $p->name="刘备";  //可以设置
  echo "<br />";
  echo $p->sex = "女";   //权限不够
  echo "<br />";
  echo $p->money = 100;//权限不够
  echo "<br />";
  echo $p->study = 5;//不存在
  echo "<br />";
  var_dump($p);

效果图:

刘备
您设置的属性sex权限不够或者不存在女
您设置的属性money权限不够或者不存在100
您设置的属性study权限不够或者不存在5
object(Person)#1 (3) { ["name"]=> string(6) "刘备"
 ["sex":protected]=> string(3) "男" ["money":"Person":private]=> int(200) }

     =>  __isset(属性名称): 当在类的外部使用isset来判断一个权限不够或者不存在的属性是否存在时,自动调用的方法

<?php
  //重载
  class Person
  {
  	public $name = "张三";
  	protected $sex = "男";
  	private $money = 200;

  	/**当在类的外部使用isset来判断一个权限不够或者不存在属性是否存在时,
  	 *自动调用的额方法
  	 */
  	public function __isset($name)  //属性名称
  	{
  		return isset($this->$name);
  	}

  }

  $p = new Person();
  var_dump(isset($p->username)); //bool(false) 
  echo "<br />";
  var_dump(isset($p->name));  //bool(true) 
  echo "<br />";
  var_dump(isset($p->sex));  //bool(true) 
  echo "<br />";
  var_dump(isset($p->money));  //bool(true)

效果:

bool(false) 
bool(true) 
bool(true) 
bool(true)

     =>  __unset(),当在类的外部使用unset函数删除某个不存在或者权限不够的属性时自动调用的方法

<?php
  //重载
  class Person
  {
  	public $name = "张三";
  	protected $sex = "男";
  	private $money = 200;

  	/**
  	 *当在类的外部删除一个不存在或者权限不够的属性时自动触发的方法
  	 */
  	public function __unset($name)  //属性名称
  	{
  		// unset($this->$name);
  		echo "删除的属性是".$name;
  	}

  }

 $p = new Person();
 unset($p->name); //可以删除
 echo "<br />";
 unset($p->sex);  //权限不够
 echo "<br />";
 unset($p->money); //权限不够
 echo "<br />";
 unset($p->username);//不存在的属性
 echo "<br />";
 var_dump($p);

效果:


删除的属性是sex
删除的属性是money
删除的属性是username
object(Person)#1 (2) { ["sex":protected]=> string(3) "男" ["money":"Person":private]=> int(200) }

3.属性重载的意义

  1).在外部进行设置时,可以无限的增加对象的属性,会破坏对象的结构;

  2).如果操作这些不存在或者权限不够的属性时会报错,容错性不好;

  3).加上相应的魔术方法后,可以增加类的容错性,可以保证对象结构的完整,可以根据需求自己控制哪些属性是我们操作。

4.魔术方法之方法重载

     =>  __call()  当在类的外部访问一个不存在或者权限不够的方法(非静态)时,会自动调用的方法;

     => __callStatic()  当在类的外部访问一个不存在或者权限不够的静态方法时,会自动调用的方法;

5.总结

重载的意义,就是增加容错,防止在类的外部访问不存在或者权限不够的属性或者方法时报错,影响后续程序的执行。保证代码的健全

猜你喜欢

转载自blog.csdn.net/weixin_41887155/article/details/86257243
今日推荐