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中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结
前 言 OOP 学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1 PHP中的抽象 ...
- Python的程序结构[1] -> 方法/Method[3] -> 魔术方法 __getattr__ 与代理模式
__getattr__ 方法 __getattr__ 方法当对象调用内部属性(包括方法等)且未找到对应属性的时候会调用的特殊方法.利用这一特性,可是对函数实现一个代理模式. __getattr__方法 ...
- Java开发中的23中设计模式详解(一)工厂方法模式和抽象工厂模式
一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接 ...
- day24:多态&魔术方法__new__&单态模式
目录 1.多态 2.__new__魔术方法 2.1 关于魔术方法__new__ 2.2 基本语法 2.3 __new__ 触发时机快于构造方法 2.4 __new__ 和 __init__ 参数一一对 ...
- 032.Python魔术方法__new__和单态模式
一 __new__ 魔术方法 1.1 介绍 触发时机:实例化类生成对象的时候触发(触发时机在__init__之前) 功能:控制对象的创建过程 参数:至少一个cls接受当前的类,其他根据情况决定 返回值 ...
- Python魔术方法-Magic Method
介绍 在Python中,所有以"__"双下划线包起来的方法,都统称为"Magic Method",例如类的初始化方法 __init__ ,Python中所有的魔 ...
- java中的23中设计模式(转)
设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- Java中的GOF23(23中设计模式)--------- 单例模式(Singleton)
Java中的GOF23(23中设计模式)--------- 单例模式(Singleton) 在Java这这门语言里面,它的优点在于它本身的可移植性上面,而要做到可移植的话,本身就需要一个中介作为翻译工 ...
- java开发中的23中设计模式详解--大话设计模式
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
随机推荐
- IT兄弟连 HTML5教程 CSS3揭秘 CSS3属性5
9 透明属性 元素透明也是我们常用的样式,在CSS2中使用滤镜属性opacity实现透明效果.现在有了CSS3的rgba属性,就不用这么麻烦了,当然这也得要浏览器支持才行.通常我们定义颜色都是用十六 ...
- linux安装GD库
首先我们检查GD库是否安装 php -i | grep -i --color gd 安装GD库 yum install php-gd* 安装完成之后配置php.ini文件 extension=gd.s ...
- 多线程十 Timer
定时/计算在java中主要使用的是Timer对象,他的内部依然是采用多线程方式进行处理 它有四个构造方法 方法名 作用 Timer() 空参 Timer(String name) 指定名字 Timer ...
- Django入门必知必会操作
一.Django基础必备三件套 HttpRseponse 内部传入一个字符串参数,返回给浏览器. 在app目录下的views.py添加函数,添加函数之前必须在urls.py添加函数对应关系,否则访问不 ...
- (十六)c#Winform自定义控件-文本框哪里去了?-HZHControls
官网 http://www.hzhcontrols.com 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kww ...
- NetCore的Docker部署
NetCore的Docker部署 一.NetCore与Docker Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或 ...
- JMeter资源监控插件PerfMon的使用
1.插件下载 首先下载jmeter的插件管理工具,下载地址:jmeter-plugins.org 如英文说明,把下载后的jar包放到jmeter的安装目录lib/ext文件夹下,重启jmeter,就会 ...
- PDF转换成DXF文件?PDF转DXF的操作方法
在CAD工作中,经常就需要将绘制完成的图纸文件的格式进行转换,那怎么将PDF文件转换成DXF格式的呢?具体要怎么来进行操作呢?本编教程小编就来教教大家具体操作方法,具体操作如下: 一.工具转换 推荐指 ...
- CodeForces - 722C(思维+倒着并查集)
题意 https://vjudge.net/problem/CodeForces-722C 给你一个由n个非负整数组成的数列 a1 ,a2 ,...,an . 你将要一个一个摧毁这个数列中的数. ...
- scipy中的coo_matrix函数
推荐直接看官方文档:https://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.coo_matrix.html#scipy.sp ...