巧用PHP中__get()魔术方法
PHP中的魔术方法有很多,这些魔术方法可以让PHP脚本在某些特定的情况下自动调用。比如 __construct() 每次实例化一个类都会先调用该方法进行初始化。这里我们讲一下__get() 魔术方法的使用。读取不可访问属性的值时,__get() 会被调用。也就是,当想要获取一个类的私有属性,或者获取一个类并为定义的属性时。该魔术方法会被调用。
下面有段代码:
class Model
{ //不存在的成员属性自动调用
function __get($name)
{
//自动加载数据库
if(substr($name, 0,2) =='db'){
$config = strtolower(substr($name, 2));
if(empty($this->objDb)){
$this->objDb = new LibDatabase($config);
}else{
$this->objDb->config($config);
}
return $this->objDb;
} // 自动加载redis
if(substr($name, 0,5) =='redis'){
$config = strtolower(substr($name, 5));
if(empty($this->objRedis)){
$this->objRedis = new LibRedis($config);
}else{
$this->objRedis->config($config);
}
return $this->objRedis;
} //自动加载excel插件
if(substr($name, 0,5) =='excel'){
if(empty($this->objExcel)){
$this->objExcel = new LibExcel();
}
return $this->objExcel;
}
throw new LinkException("变量{$name}不被支持,请预先Model中定义",EXCEPT_CORE);
}
} ?>
首先,该Model类有只有一个__get() 方法,没有定义其他属性,所有只要是访问这个Model类的属性,都会来调用这个__get() 方法。而传入的参数$name就是想要调用Model类的属性。
其次,__get() 方法里有3个判断,分别用于返回一个LibDatabase数据库类和一个LibRedis缓存类和一个LibExcel 的Excel插件类的实例。
假设$mod 是Model的一个对象。我们来分析以下三中情况:
1、$mod->dbconfsys->getAll($sql);
2、$mod->redisconfsys->get($key);
3、$mod->excel->export($data);
第一个:访问Model类的dbconfsys属性。但是Model类中并没有该属性。所以 __get() 的第一个判读成立,那么会返回LibDatabase(‘confsys’)的实例。这里confsys其实是一个数据库的配置。如果有多个数据库的配置比如confadmin、conftest等,都可以使用dbconfadmin和dbconftest来实例化该数据库的一个连接对象。当然连接的处理以及数据处理是在LibDatabase里实现的。最后调用该实例的getAll方法执行sql语句。
第二个:访问Model类的redisconfsys属性,同理,此时 __get() 的第二个判断成立。返回的是LibRedis(‘confsys’)的实例。这里的confsys则是一个redis的配置。像数据库实例一样,如果有多个配置,也是同样的处理方式。最后调用该实例的get方法获取某个键的值。
第三个:访问Model类的excel 属性,此时__get() 的第三个判断成立。返回的是LibExcel()的实例。最后调用export方法导出数据。
这个Model类可以作为基础的底层模型。然后系统中所有数据表的模型或者每个模块功能的模型都继承Model,同样可以使用该Model的功能,这里需要注意的是每种对象的调用都需要先早Model中做好判断处理。
巧用PHP中__get()魔术方法的更多相关文章
- PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toStr
PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep ...
- PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep
PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep ...
- __set()与__get() 魔术方法
在面向对象编程的过程中,对于类当中的各个成员变量,都有不同的访问属性,比如公有的(public)属性,在类内部和类外部都可直接调用:而私有的(private)和受保护的(protected),在类外不 ...
- PHP中的面向对象OOP中的魔术方法
一.什么是魔术方法: PHP为我们提供了一系列用__开头的函数,这些函数无需自己手动调用,会在合适的时机自动调用,这类函数称为魔术函数.例如: function __construct(){} 在ne ...
- PHP中的魔术方法和关键字
PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep ...
- PHP常用魔术方法(__set、__get魔术方法:)
__set.__get魔术方法: //文件名:Object.php <?phpnamespace IMooc;class Object{ protected $array = array(); ...
- 126-PHP类__get()魔术方法
<?php class ren{ //定义人类 //定义成员属性 private $name='Tom'; private $age=15; //定义__get()魔术方法 public fun ...
- PHP中的魔术方法:__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone and __autoload
1.__get.__set 这两个方法是为在类和他们的父类中没有声明的属性而设计的: __get( $property ) 当调用一个未定义的属性时访问此方法: __set( $property, $ ...
- PHP中的魔术方法总结:__construct,__destruct ,__call,__callStatic,__get,__set,__isset, __unset ,__sleep,__wakeup,__toString,__set_state,__clone,__autoload
1.__get.__set这两个方法是为在类和他们的父类中没有声明的属性而设计的__get( $property ) 当调用一个未定义的属性时访问此方法__set( $property, $value ...
随机推荐
- 【原创】大数据基础之Logstash(4)高可用
logstash高可用体现为不丢数据(前提为服务器短时间内不可用后可恢复比如重启服务器或重启进程),具体有两个方面: 进程重启(服务器重启) 事件消息处理失败 在logstash中对应的解决方案为: ...
- uitramon 安装包
链接地址 密码:kkkk displayfintion :https://blog.csdn.net/JianJuly/article/details/80559933 密码:gn8p
- spring5.0.2.RELEASE源码环境构建
Spring5 源码下载注意事项 首先你的JDK 需要升级到1.8 以上.Spring3.0 开始,Spring 源码采用github 托管,不再提供官网下载链接.大家可自行去github 网站下载, ...
- python3与mysql交互
1.安装pymysql模块 pip3 install pymysql3 2.pymysql的简单使用: # /usr/bin/env python3 import pymysql class Mysq ...
- IIS+Tomcat功能iis端口2
之前写过IIS桥接Tomcat是通过isapi_redirect.dll,组件方式实现共用端口的,但是在Windows2012服务器 iis8.0版本中,配置完成后没有效果,比较抓狂,分析发现如下信息 ...
- 大数据ssh疑点跟踪
相信运维的对ssh免密登陆应该是对这个再清楚不过的吧,由于我们大数据对于安全这方便管控的很严格,单独找一台物理机作为跳板机,其他的机器都必须要从这个跳板机免密登陆,由于机器比较的多,其中dn30这个域 ...
- Python数据分析-知识宝藏
0.SQL数据库 1. python基础知识 2. 重点工具掌握:数据解析核心技巧 - Numpy| Pandas| Matplotlib 3. 数据特征分析:分布| 对比| 统计| 帕累托| 正态| ...
- 做IT,必备的安全知识!
以前的认知 以前刚接触IT行业,而我身为运维,我以为我所需要做的安全就是修改服务器密码为复杂的,ssh端口改为非22,还有就是不让人登录服务器就可以保证我维护的东西安全. 现在的认知 工作也好几年了, ...
- Tomcat 配置文件server.xml详解
前言 Tomcat隶属于Apache基金会,是开源的轻量级Web应用服务器,使用非常广泛.server.xml是Tomcat中最重要的配置文件,server.xml的每一个元素都对应了Tomcat中的 ...
- [enum]enum的用法
ENUM概况 enum枚举类型是C/C++中的一种数据类型,与struct和class一样是用户自定义的类型,其特点在于enum类型的变量取值是有限的,是可以一一列举出来的. ENUM定义 C++ e ...