PHP中设计模式以及魔术方法
Posted shineguang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP中设计模式以及魔术方法相关的知识,希望对你有一定的参考价值。
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=‘学生‘;
以上是关于PHP中设计模式以及魔术方法的主要内容,如果未能解决你的问题,请参考以下文章
PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结