PHP面向对象核心(一)——序列化与魔术方法
PHP面向对象核心(一)
(原创内容,转载请注明来源,谢谢)
一、对象存储——serialize与unserialize
对象是存储类的属性的键值对,类似于数组的键值对。
对象在进行serialize(序列化)时,会连带类名、属性值、属性占用长度一并存储,当使用unserialize(反序列化)时可以还原对象。但是反序列化需要包含类原先定义的代码,否则还原后无法执行对象所属类的方法。
作用:将对象序列化,以便于将对象以字符串的形式存储在文件或数据库中。
示例如下:
//定义一个水果类
class fruit{
private $shape;
private $color;
public function __construct($shape,$color){
$this->shape =$shape;
$this->color =$color;
}
public function eatMethod($hasPeel){
echo ‘反序列化成功’;
}
}
//定义苹果对象
$apple = newfruit(‘round’, ‘red’);
$strApple =serialize($apple);
echo $strApple;
//运行结果:O:5:"fruit":2:{s:12:"fruitshape";s:5:"round";s:12:"fruitcolor";s:3:"red";}
//还原apple对象方式:反序列化
$objApple =unserialize($strApple);//$objApple==$apple
二、魔术方法
魔术方法是PHP的“语法糖”,都是以两个下划线开头的方法,在面向对象中具有重要作用。魔术方法在类中定义,当对于把类实例化的对象进行一些特定操作时,会触发相应的魔术方法。
1、__construct与__destruct
__construct称为构造函数,在每个类被实例化的时候,该函数会自动被调用。PHP不同于java,构造函数无法被重写。
构造函数通常用于实例化类时对类的属性进行赋值,还有进行数据库连接等操作。具体用法在上面水果类的定义中已经提到。
__destruct称为析构函数,与构造函数相对应,这个函数是在某个对象的所有引用被删除,或者对象被显示销毁时,自动调用的。该函数也不能重写。
析构函数通常用于释放存储空间、断开数据库连接等操作。
2、__get与__set
当要对一个类定义的private属性进行获取或者赋值的操作时,如果没有在类中定义__get、__set,PHP会爆出Fatal错误。但是,如果定义了方法,会自动执行方法。
这两个方法主要是对于操作类的私有方法时,可以进行更为灵活的处理,再避免报错增强程序健壮性的同时,又可以根据设置得到想要的结果,保证程序是可控的。
根据面向对象的封装性的思想,通常是不建议对象直接操控类的属性。这两个方法就可以对操作属性进行把控。
示例如下:
class testControlProp{
private $propArray;
public function__get($name){
if(!property_exists($this,$name)){
return'无此属性<br />';
}else{
return$this->$name.'<br />';
}
}
public function__set($name, $val){
if(!property_exists($this,$name)){
echo'无此属性<br />';
}else{
if(!is_array($val)){
echo'对属性的设置不合法<br />';
}else{
$this->$name= $val;
echo'success<br />';
}
}
}
}
$test = new testControlProp();
$test->propArray = 'a1';//返回结果是对属性设置不合法
$test->propArray = array(1, 2);//返回success
echo $test->prop;//返回无此属性
echo $test->propArray;//返回array
上述方法实现把控对象对其属性的操作,保证设置的属性都是想要的格式或内容,保证获取的属性都是有效的经过处理的。
3、__toString
当echo类的实例时,会自动调用该方法,如果没有定义该方法,则会报错。
__toString方法可以自定义echo的内容,让输出更人性化。
因此,可以使用此方法自定义需要输出的结果,以起到自定义serialize的作用,更加节约存储空间。
4、__call、__callStatic
当调用类没有定义的方法时,如果类中没有定义__call则会报错(__callStatic则是调用没有定义的static方法)。
__call方法具有重要作用,可以实现动态创建和延迟绑定功能。
下面实现数据库查询条件where的动态绑定功能。
结果如下:
PHP源码如下:
<?php
class Db{
private$server; //数据库服务器名称
private $username; // 连接数据库用户名
private $password; // 连接数据库密码
private $database; // 数据库的名字
private$conn;//数据库连接
private$sql;
publicfunction __construct($server='localhost', $username='root', $password='root',$database='test'){
$this->server= $server;
$this->username= $username;
$this->password= $password;
$this->database= $database;
$dbConnection= new PDO('mysql:host=127.0.0.1;dbname=test','root','root');
//$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
//$dbConnection->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$this->conn= $dbConnection;
}
//动态查询数据:
//格式:get_tablename_by_condintions1_conditions2(val1,val2)
publicfunction __call($name, $args){
$arrName= explode('_', $name);
$this->sql= ' select * from '.$arrName[1];
if(count($arrName)<3){
return$this->conn->query($this->sql);
}else{
$this->sql.= ' where ';
$arrCond= array();
for($i=3;$i<count($arrName);$i++){
$this->sql.= ' '.$arrName[$i].' = :'.$arrName[$i].' ';
if($i<count($arrName)-1){
$this->sql.= ' and ';
}
$arrCond[$arrName[$i]]= $args[$i-3];
}
$pre= $this->conn->prepare($this->sql);
$pre->execute($arrCond);
return$pre;//注意:需要return pre,而不是execute的结果,否则报错
}
}
}
$db = new DB();
$result = $db->get_mytable();
echo '不带查询条件:<br />';
foreach($result as $val){
print_r($val);
echo'<br / >';
}
echo '<br />带查询条件<br/>' ;
$result =$db->get_mytable_by_name_status('a', 1);
//var_dump($result);die();
foreach ($result as $val) {
print_r($val);
echo'<br / >';
}
——written by linhxx 2017.06.20
- ASP.NET AJAX(8)__Microsoft AJAX Library中异步通信层的使用什么是异步通信层Micorsoft AJAX Library异步通信层的组成WebRequestExec
- ASP.NET AJAX(7)_Microsoft AJAX Library扩展客户端组件继承时需要注意的问题扩展类型如何修改已有类型
- ASP.NET AJAX(6)__Microsoft AJAX Library中的面向对象类型系统命名空间类类——构造函数类——定义方法类——定义属性类——注册类类——抽象类类——继承类——调用父类方
- 设计模式专题(四)——代理模式
- Array数组函数(一)
- ASP.NET AJAX(5)__JavaScript原生类型以及Microsoft AJAX Library什么是Microsoft AJAX LibraryObject原生类型Object.pro
- 使用 Octave 来学习 Machine Learning(一)
- ASP.NET AJAX(4)__客户端访问WebService服务器端释放WebService方法客户端访问WebService客户端访问PageMethod错误处理复杂数据类型使用基础客户端代理的
- 讲真,你该做备份的有效性校验了
- memcache安装方法
- 设计模式专题(五)——工厂方法模式
- ASP.NET AJAX(11)__ScriptManagerUpdatePanel的支持成员功能控制成员脚本控件支持成员ScriptMode和ScriptPathLoadScriptsBeforeU
- SQL Server 2016新特性:动态数据屏蔽(DDM)
- ASP.NET AJAX(12)__浏览器兼容功能判断浏览器的类型和版本Sys.Browser针对DOM元素的兼容操作针对DOM事件的兼容操作
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC