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中设计模式以及魔术方法的更多相关文章

  1. PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结

      前  言  OOP  学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1  PHP中的抽象 ...

  2. Python的程序结构[1] -> 方法/Method[3] -> 魔术方法 __getattr__ 与代理模式

    __getattr__ 方法 __getattr__ 方法当对象调用内部属性(包括方法等)且未找到对应属性的时候会调用的特殊方法.利用这一特性,可是对函数实现一个代理模式. __getattr__方法 ...

  3. Java开发中的23中设计模式详解(一)工厂方法模式和抽象工厂模式

    一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接 ...

  4. day24:多态&魔术方法__new__&单态模式

    目录 1.多态 2.__new__魔术方法 2.1 关于魔术方法__new__ 2.2 基本语法 2.3 __new__ 触发时机快于构造方法 2.4 __new__ 和 __init__ 参数一一对 ...

  5. 032.Python魔术方法__new__和单态模式

    一 __new__ 魔术方法 1.1 介绍 触发时机:实例化类生成对象的时候触发(触发时机在__init__之前) 功能:控制对象的创建过程 参数:至少一个cls接受当前的类,其他根据情况决定 返回值 ...

  6. Python魔术方法-Magic Method

    介绍 在Python中,所有以"__"双下划线包起来的方法,都统称为"Magic Method",例如类的初始化方法 __init__ ,Python中所有的魔 ...

  7. java中的23中设计模式(转)

    设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  8. Java中的GOF23(23中设计模式)--------- 单例模式(Singleton)

    Java中的GOF23(23中设计模式)--------- 单例模式(Singleton) 在Java这这门语言里面,它的优点在于它本身的可移植性上面,而要做到可移植的话,本身就需要一个中介作为翻译工 ...

  9. java开发中的23中设计模式详解--大话设计模式

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

随机推荐

  1. koa2 从入门到进阶之路 (六)

    之前的文章我们介绍了一下 koa post提交数据及 koa-bodyparser中间件,本篇文章我们来看一下 koa-static静态资源中间件. 我们在之前的目录想引入外部的 js,css,img ...

  2. java高并发系列 - 第20天:JUC中的Executor框架详解2之ExecutorCompletionService

    这是java高并发系列第20篇文章. 本文内容 ExecutorCompletionService出现的背景 介绍CompletionService接口及常用的方法 介绍ExecutorComplet ...

  3. 简单的PHP上传图片实例

    分享一个简单的PHP上传图片实例,本实例主要介绍了上传图片的一些限制判断和上传图片的方法. 首先我们在form表单加上上传附件#file,上传按钮#imgbut,记得给form 表单加上multipa ...

  4. windows 下安装beego

    好久没写博客了,最近忙于一些杂事,看见有几个博友留言了,未能及时回复,稍后晚点回复诸位博友.不多说了,windows安装beego(请先确保git环境已安装并设置了git环境变量.这个简单网上很多教程 ...

  5. Dynamics CRM - js中用webapi基于fetchxml查询遇到的问题 -- Invalid URI: The Uri scheme is too long.

    最近用WebApi做基于Fetchxml的查询的时候,遇到一个很蛋疼的报错:Invalid URI: The Uri scheme is too long. 检查了整个URL,也没发现有什么问题. - ...

  6. 北航软件学院Java历届期末考题整理

    文章目录 abstract static Thread finally package Exception I/O 子类和父类 关键字 标识符 垃圾收集 数据类型 环境配置 网路编程 initial ...

  7. 微信小程序如何做金额输入限制

    引言:金额输入时,需求如下: 1)首位不能出现0或者小数点(.) 2)仅保留两位小数 3)仅保留一个小数点(.),不允许出现多个. 1.wxml核心代码: <!-- 1.adjust-posit ...

  8. linux kernel下输入输出console如何实现【转】

    转自:https://blog.csdn.net/skyflying2012/article/details/41078349 最近工作在调试usb虚拟串口,让其作为kernel启动的调试串口,以及u ...

  9. May 26th, 2019. Week 22nd, Sunday

    A real loser is somebody that's so afraid of not winning, they don't even try. 真正的失败者,是那些因为害怕不能成功,就连 ...

  10. Windows下Python虚拟环境

    python的虚拟环境在windows和linux下的配置是不一样的 主要解决开发应用程序的时候Python依赖包的版本问题 虚拟环境 virtualenv 安装 pip install virtua ...