前端学PHP之面向对象系列第五篇——对象操作

对象克隆

  对象复制,又叫对象克隆,可以通过 clone 关键字来完成

  在多数情况下,我们并不需要完全复制一个对象来获得其中属性。但有一个情况下确实需要:如果你有一个窗口对象,该对象持有窗口相关的资源。你可能会想复制一个新的窗口,保持所有属性与原来的窗口相同,但必须是一个新的对象(因为如果不是新的对象,那么一个窗口中的改变就会影响到另一个窗口)。还有一种情况:如果对象 A 中保存着对象 B 的引用,当你复制对象A时,你想其中使用的对象不再是对象 B 而是 B 的一个副本,那么你必须得到对象 A 的一个副本

<?php
    class Person{
        private $name;
        private $sex;
        private $age;
        function __construct($name="",$sex="",$age=1){
            $this->name= $name;
            $this->sex = $sex;
            $this->age = $age;
        }
        function say(){
            echo "我的名字:" .$this->name.",性别:".$this->sex.",年龄:".$this->age."<br>";
        }
    }
    $p1 = new Person(‘张三‘,‘男‘,‘20‘);
    $p2 = clone $p1;
    $p1->say();//我的名字:张三,性别:男,年龄:20
    $p2->say();//我的名字:张三,性别:男,年龄:20
?>

对象比较

  当使用比较运算符(==)比较两个对象变量时,比较的原则是:如果两个对象的属性和属性值都相等,而且两个对象是同一个类的实例,那么这两个对象变量相等< $o = new Flag(); $p = new Flag();>

  而如果使用全等运算符(===),这两个对象变量一定要指向某个类的同一个实例(即同一个对象)《$q = $o;》

<?php
function bool2str($bool)
{
    if ($bool === false) {
        return ‘FALSE‘;
    } else {
        return ‘TRUE‘;
    }
}
function compareObjects(&$o1, &$o2)
{
    echo ‘o1 == o2 : ‘ . bool2str($o1 == $o2) . "\n";
    echo ‘o1 != o2 : ‘ . bool2str($o1 != $o2) . "\n";
    echo ‘o1 === o2 : ‘ . bool2str($o1 === $o2) . "\n";
    echo ‘o1 !== o2 : ‘ . bool2str($o1 !== $o2) . "\n";
}
class Flag
{
    public $flag;
    function Flag($flag = true) {
        $this->flag = $flag;
    }
}
class OtherFlag
{
    public $flag;
    function OtherFlag($flag = true) {
        $this->flag = $flag;
    }
}

$o = new Flag();
$p = new Flag();
$q = $o;//如果写出 $q = clone $o的话 === 为fasle
$r = new OtherFlag();
/*
Two instances of the same class
o1 == o2 : TRUE
o1 != o2 : FALSE
o1 === o2 : FALSE
o1 !== o2 : TRUE
 */
echo "Two instances of the same class\n";
compareObjects($o, $p);
/*
Two references to the same instance
o1 == o2 : TRUE
o1 != o2 : FALSE
o1 === o2 : TRUE
o1 !== o2 : FALSE
 */
echo "\nTwo references to the same instance\n";
compareObjects($o, $q);
/*
Instances of two different classes
o1 == o2 : FALSE
o1 != o2 : TRUE
o1 === o2 : FALSE
o1 !== o2 : TRUE
 */
echo "\nInstances of two different classes\n";
compareObjects($o, $r);
?>

对象串行化

  对象是一种在内存中存储的数据类型,它的寿命通常随着生成该对象的程序终止而终止。有时候可能需要将对象的状态保存下来,需要时再将对象恢复。对象通过写出描述自己状态的数值来记录自己,这个过程称对象的串行化(Serialization)。以下两种情况需要将对象串行化:1、对象需要在网络中传输时,将对象串行化成二进制串即可;2、对象需要持久保存时,将对象串行化后写入文件或数据库

serialize()

  serialize() -- 串行化,返回一个包含字节流的字符串

unserialize()

  unserialize() -- 反串行化,能够重新把字符串变回php原来的对象值

  串行化一个对象将会保存对象的所有属性变量和类名信息,但是不会保存对象的方法

<?php
// classa.inc:
  class A {
      public $one = 1;
      public function show_one() {
          echo $this->one;
      }
  }

// page1.php:
  include("classa.inc");
  $a = new A;
  $s = serialize($a);
  // 把变量$s保存起来以便文件page2.php能够读到
  file_put_contents(‘store‘, $s);

// page2.php:
  include("classa.inc");
  $s = file_get_contents(‘store‘);
  $a = unserialize($s);
  // 现在可以使用对象$a里面的函数 show_one()
  $a->show_one();
?>

json

json_encode

string json_encode ( mixed $value [, int $options = 0 [, int $depth = 512 ]] )

  json_encode()方法对变量进行 JSON 编码

<?php
$arr = array (‘a‘=>1,‘b‘=>2,‘c‘=>3,‘d‘=>4,‘e‘=>5);
echo json_encode($arr);//{"a":1,"b":2,"c":3,"d":4,"e":5}
?>

json_decode

mixed json_decode ( string $json [, bool $assoc = false [, int $depth = 512 [, int $options = 0 ]]] )

  json_decode()方法对 JSON 格式的字符串进行解码,接受一个 JSON 编码的字符串并且把它转换为 PHP 变量,当assoc参数为 TRUE 时,将返回 array 而非 object

<?php
$json = ‘{"a":1,"b":2,"c":3,"d":4,"e":5}‘;
/*
object(stdClass)#1 (5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}
 */
var_dump(json_decode($json));

/*
array(5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}
 */
var_dump(json_decode($json, true));
?>

时间: 2024-10-12 13:39:17

前端学PHP之面向对象系列第五篇——对象操作的相关文章

前端学PHP之面向对象系列第四篇-----关键字

public public表示公有,它具有最大的访问权限,被定义为公有的类成员可以在任何地方被访问 如果属性用 var 定义,则被视为公有,如果方法没有设置关键字,则该方法默认为公有 <?php class demo{ public $public = 1; function test($var){ echo "{$var}000"; } } $d1 = new demo; $d1->test($d1->public);//1000 ?> protected p

前端学PHP之面向对象系列第二篇——魔术方法

显示目录 目录 [1]构造方法 [2]析构方法 [3]不可访问属性[4]对象复制[5]字符串[6]对象不存在[7]自动加载类[8]串行化[9]函数调用 前面的话 php在面向对象部分有很多相关的魔术方法,这些方法为面向对象实现提供了便利,本文将详细介绍魔术方法 构造方法 大多数类都有一种称为构造函数的特殊方法.当创建一个对象时,它将自动调用构造函数,通常用它执行一些有用的初始化任务 构造函数的声明与其它操作的声明一样,只是其名称必须是两个下划线__construct( ).这是PHP5中的变化:

互联网神经学系列第五篇:研究大脑中的谷歌,脸书和华为思科路由,脑互联网生理学

本文是互联网神经学系列第五篇-"大脑中的类互联网应用和结构,脑互联网生理学" 一.人类大脑研究的困境 大脑的秘密一直是科学皇冠上最明亮的宝石之一,但在两千年前,人们确连它的重要意义还不知道,例如著名的亚里士多德(Aristotle,公元前384-前322)认为神智在心,是心控制着我们的思想,情绪.大约公元前5世纪,地中海科斯岛上托名希波克拉底(Hippocrates)的一群医生被认为是最早发现了脑是神智的载体,在希波克拉底著作中有如下一段话."人们应当认识到:我们的愉悦.欢乐

前端工程师技能之photoshop巧用系列第五篇——雪碧图

显示目录 目录 [1]定义 [2]应用场景 [3]合并[4]实现[5]维护 前面的话 前面已经介绍过,描述性图片最终要合并为雪碧图.本文是photoshop巧用系列第五篇--雪碧图 定义 css雪碧图(sprite)是一种网页图片应用处理方式,它允许将一个页面涉及到的所有零星图片都包含到一张大图中.使用雪碧图的处理方式可以实现两个优点: [1]减少http请求次数 [2]减少图片大小,提升网页加载速度 (多张图片加载速度小于拼合成的图片的加载速度) 凡事都不完美,实现优点的同时也带来了缺点,即提

Python学习系列(五)(文件操作及其字典)

Python学习系列(五)(文件操作及其字典) Python学习系列(四)(列表及其函数) 一.文件操作 1,读文件 在以'r'读模式打开文件以后可以调用read函数一次性将文件内容全部读出,也可以指定每次read读多少字节,例如: 1 #coding:utf-8 2 fn='test1.py' 3 fp=open(fn,'r') #以读的方式打开文件,文件必须首先存在和,.文件在同一目录下py 4 print 'reading pos:',fp.tell() 5 r=fp.read(20) #

javascript面向对象系列第三篇——实现继承的3种形式

前面的话 学习如何创建对象是理解面向对象编程的第一步,第二步是理解继承.开宗明义,继承是指在原有对象的基础上,略作修改,得到一个新的对象.javascript主要包括类式继承.原型继承和拷贝继承这三种继承方式.本文是javascript面向对象系列第三篇——实现继承的3种形式 类式继承 大多数面向对象的编程语言都支持类和类继承的特性,而JS却不支持这些特性,只能通过其他方法定义并关联多个相似的对象,如new和instanceof.不过在后来的ES6中新增了一些元素,比如class关键字,但这并不

javascript面向对象系列第四篇——选项卡的实现

前面的话 面向对象的应用并非只是读几本书那么容易,需要有大量的工程实践做基础才能真正理解并学会使用它.本文将用面向对象的技术来制作一个简单的选项卡 图示说明 由图示结果看到,这是一个非常简单的选项卡.三个控制按钮利用点击事件分别控制三张不同的选项卡.选项卡用文字和背景颜色区分,控制按钮用轮廓outline区分 HTML代码 [1]使用行间样式来引入CSS的扩展性不高,需要根据实际情况谨慎使用 [2]在a标签中使用javascript:;来阻止默认的页面跳转行为 [3]给最外层div元素设置id属

【Windows编程】系列第五篇:GDI图形绘制

上两篇我们学习了文本字符输出以及Unicode编写程序,知道如何用常见Win32输出文本字符串,这一篇我们来学习Windows编程中另一个非常重要的部分GDI图形绘图.Windows的GDI函数包含数百个API可供我们使用,本篇把最常用的GDI绘图做一个讲解.GDI可以绘制点.直线曲线.填充封闭区域.位图以及文本,其中文本部分已经在上一篇中将了,请参考[Windows编程]系列第三篇:文本字符输出. 跟前面的GDI对象一样,本篇的这些绘图函数也必须要设备上下文句柄(HDC)作为函数参数,从前文我

前端学HTTP之报文系列第一篇——起始行

前面的话 如果说HTTP是因特网的信使,那么HTTP报文就是它用来搬东西的包裹了.HTTP报文是在HTTP应用程序之间发送的简单的格式化数据块,每条报文都包含一条来自客户端的请求,或者一条来自服务器的响应.它们由三个部分组成:由起始行.首部和实体的主体部分.本文是HTTP报文系列第一篇——起始行 报文语法 所有的HTTP报文都可以分为两类:请求报文(request message)和响应报文(response message).请求报文会向Web服务器请求一个动作,响应报文会将请求的结果返回给客