PHP中设计模式以及魔术方法
程序员文章站
2022-06-28 20:49:06
1.设计模式 1.1单例模式 口诀:三私一公 实现: 1.2工厂模式: 特点:传递不同的参数获取不同的对象 1.3策略模式: 特点:传递不同的参数调用不同的策略(方法) 2.魔术方法: 2.1__tostring()、__invoke() __tostring():将对象当成字符串使用的时候自动调用 ......
1.设计模式
1.1单例模式
口诀:三私一公
1、私有的静态属性用来保存对象的单例 2、私有的构造方法用来阻止在类的外部实例化 3、私有的__clone阻止在类的外部clone对象 4、公有的静态方法用来获取对象的单例
实现:
<?php //三私一公 class db { //静态的属性用来保存对象的单例 private static $instance; //私有的构造方法阻止在类的外部实例化 private function __construct() { } //私有的__clone()阻止在类的外部clone对象 private function __clone() { } public static function getinstance() { //保存的值不属于db类的类型就实例化 if(!self::$instance instanceof self) self::$instance=new self(); return self::$instance; } }
1.2工厂模式:
特点:传递不同的参数获取不同的对象
<?php class productsa { } class productsb { } //工厂模式 class productsfactory { public function create($num) { switch($num) { case 1: return new productsa; case 2: return new productsb; default: return null; } } }
1.3策略模式:
特点:传递不同的参数调用不同的策略(方法)
<?php class walk { public function way() { echo '走着去<br>'; } } class bus { public function way() { echo '坐车去<br>'; } } //策略模式 class student { public function play($obj) { $obj->way(); } }
2.魔术方法:
2.1__tostring()、__invoke()
__tostring():将对象当成字符串使用的时候自动调用
__invoke():将对象当成函数使用的时候自动调用
<?php class student { //把对象当成字符串使用的时候自动执行 public function __tostring() { return '这是一个对象,不是字符串<br>'; } //把对象当成函数使用的时候自动执行 public function __invoke() { echo '这是一个对象,不是函数<br>'; } }
2.2__set()、__get()、__isset()、__unset()
__set($k,$v):给无法访问的属性赋值的时候自动执行 __get($k):获取无法访问的属性值的时候自动调用 __isset($k):判断无法访问的属性是否存在自动调用 __unset($k):销毁无法访问的属性的时候自动执行
<?php class student { private $name; private $sex; private $age; //给无法访问的属性赋值的时候自动执行 public function __set($k,$v) { $this->$k=$v; } //获取无法访问的属性值的时候自动调用 public function __get($k) { return $this->$k; } //判断无法访问的属性是否存在自动调用 public function __isset($k) { return isset($this->$k); } //销毁无法访问的属性的时候自动执行 public function __unset($k) { unset($this->$k); } }
2.3__call()、__callstatic()
__call():调用无法访问的方法时自动执行 __callstatic():调用无法访问的静态方法时自动执行
<?php class student { /** *作用:调用无法访问的方法时自动执行 *@param $fn_name string 方法名 *@param $fn_args array 参数数组 */ public function __call($fn_name,$fn_args) { echo "{$fn_name}不存在<br>"; } //调用无法访问的静态方法时自动执行 public static function __callstatic($fn_name,$fn_args) { echo "{$fn_name}静态方法不存在<br>"; } }
2.4__sleep()、__wakeup()
__sleep():当序列化的时候自动调用 __wakeup():当反序列化的时候自动调用
<?php class student { private $name; private $sex; private $add='中国'; public function __construct($name,$sex) { $this->name=$name; $this->sex=$sex; } /** *序列化的时候自动调用 *@return array 序列化的属性名 */ public function __sleep() { return array('name','sex'); } //反序列化的时候自动调用 public function __wakeup() { $this->type='学生'; } }
上一篇: C#基础之访问修饰符