zoukankan      html  css  js  c++  java
  • php 对象的一些特性

    class person
    {
        private $name;
        private $age = 2;
        public function __construct($name,$age)
        {
            $this->name = $name;
            $this->age = $age;
        }
    }
    
    
    $p1 = new person('gxw',12);
    $p2 = new person('gxw',12);
    
    
    if($p1 == $p2){
        echo "p1 == p2";
    }else{
        echo "p1 != p2";
    } //echo p1 == p1
    
    
    if($p1 === $p2){
        echo "p1 == p2";
    }else{
        echo "p1 != p2";
    } //echo p1 != p2
    

    ‘== ’  用于判断两个对象实例的所有属性是否都相等。

    ‘===’  用于判断两个变量是否是同一个对象的引用。

    $p3 = $p1;
    if($p3 === $p1){
        echo 'p3 == p1';
    }else{
        echo 'p3 != p1';
    }//echo 'p3 == p1'
    
    $p3->name = 'www';
    if($p3 == $p1){
        echo 'p3 == p1';
    }else{
        echo 'p3 != p1';
    } //echo p3==p1
    

      p3 为p1 的引用,更改p3同时影响到p1,  可以说p3为p1的浅拷贝。这种情况经常出现在函数传参

    $p1 = new person('gxw',12);
    function change($tmp){
        $tmp->name ='tmp';
    }
    
    change($p1);
    echo $p1->name;
    //echo tmp
    
    $str = 'hello';
    
    function zero($tmp){
        $tmp = '';
    }
    zero($str);
    echo $str; //echo hello
    

      

    可以看出php对函数传参进行过特殊处理,在传 类对象实例时,传得是引用。 而在传字符串类型及其他基础类型时,会先进行copy。

    通过clone 关键字(注意是关键字,不是方法) 来进行对象的深拷贝

    $p4 = clone $p1;
    $p4->name = 'hello';
    if($p1 == $p4){
        echo 'p1 == p4';
    }else{
        echo 'p1 != p4';
    } //echo p1 != p4
    

    看到p1 的name 并没有因为p4的name的改变而改变,说明p4 为p1的深拷贝.

    我们还可以重载clone 方法,达到一些特定的复制效果。

    class hand
    {
        public $size = 5;
    }
    
    class person
    {
        public $name;
        public $age = 2;
        public $hand;
        public function __construct($name,$age)
        {
            $this->name = $name;
            $this->age = $age;
            $this->hand = new hand();
        }
    
        public function __clone()
        {
            // TODO: Implement __clone() method.
        }
    
    }
    
    
    
    
    $p1 = new person('gxw',12);
    $p2 = new person('gxw',12);
    
    if($p1->name === $p2->name){
        echo 'p1->name === p2->name';
    } 
    if($p1->hand === $p2->hand){
        echo "p1->hand === p2->hand";
    } 


    p1 和 p2 的 name 进行===判断的时候发现相同,而hand进行===判断的时候发现两者不同。

    可以看出===对 基础字符串类型的判断 和自定义对象类型的判断标准时不同的。

    $p3 = $p1;
    if($p3->hand === $p1->hand){
        echo "same";
    }else{
        echo "diff";
    }
    
    if($p3->name === $p1->name){
        echo "same";
    }else{
        echo "diff";
    }
    $p3->name = 'world';
    echo $p1->name; //echo world
    $p3->hand->size = 10;
    echo $p1->hand->size; //echo 10
    
    $p4 = clone  $p1;
    if($p4->name === $p1->name){
        echo 'same';
    }
    
    if($p4->hand === $p1->hand){
        echo "same";
    }
    $p4->name = 'hello';
    echo $p1->name; //echo 'world';
    $p4->hand->size = 6;
    echo $p1->hand->size; //echo '6'
    

     可以看出 = 赋值和clone 的区别。 p3的修改会影响p1 。 而p4中的基础类型属性(name)修改不会影响p1,而对象类型属性(hand)的修改会影响p1,引为clone关键字 默认不会对 对象类型属性进行深拷贝。

     public function __clone()
        {
            // TODO: Implement __clone() method.
            $this->hand = clone $this->hand;
        }
    

     修改__clone函数后,发现 p4 中对hand的修改不会影响到p1。

  • 相关阅读:
    MyEclipse快捷键大全
    重新整理,MyBatis3之Mapper封装
    重新整理,MyBatis3之初步,实体的增加、修改、删除、查询
    VUE学习二十,组件初步component
    SSIS探索之SSIS增量抽取数据
    VS2015 搭建.NET Core 开发环境
    用Middleware给ASP.NET Core Web API添加自己的授权验证
    后端开发都应该了解点接口的压力测试(Apache Bench版)
    基于OpenSSH+WinSCP完成Windows服务器之间的文件传输
    ASP.NET Core Authentication系列(二)实现认证、登录和注销
  • 原文地址:https://www.cnblogs.com/neverleave/p/5854874.html
Copyright © 2011-2022 走看看