zoukankan      html  css  js  c++  java
  • [学习] php对象

    php对象

    php里需要通过类来创建对象,每一个对象都有对应的类。

    php 对象clone

    对象clone的语法:

    $copy_of_object = clone $object;
    

    当对象被复制后,PHP 5 会对对象的所有属性执行一个浅复制(shallow copy)。所有的引用属性 仍然会是一个指向原来的变量的引用。

    例子:

    // php 版本5.6.9
    class SubObject
    {
        static $instances = 0;
        public $instance;
    
        public function __construct() {
            $this->instance = ++self::$instances;
        }
    
        public function __clone() {
            $this->instance = ++self::$instances;
        }
    }
    
    
    class MyCloneable
    {
        public $object1;
        public $object2;
    
        function __clone()
        {
          
            // 强制复制一份this->object, 否则仍然指向同一个对象
            $this->object1 = clone $this->object1;
        }
    }
    
    
    $obj = new MyCloneable();
    
    $obj->object1 = new SubObject(); // 类SubObject的构造函数调用,$instances为1,$instance为1
    $obj->object2 = new SubObject(); // 类SubObject的构造函数调用,$instances为2,$instance为2
    
    $obj2 = clone $obj; // MyCloneable类的__clone执行,__clone()内部又clone了SubObject的实例$object1,所以SubObject的__clone()执行,此时SubObject类的$instances为3,$obj2->object1的$instance为3。
    
    
    print("Original Object:
    ");
    print_r($obj);
    
    print("Cloned Object:
    ");
    print_r($obj2);
    

    上面例子中$obj2->object2为引用属性,和$obj->object2指向同一个对象。

    $obj2->object2->instance = 100;
    print_r($obj); // $obj->object2->instance的值也变成了100
    

    数组不是引用赋值,这点与js不同:

    // php 版本5.6.9
    // php 官方手册评论区的例子
    class MyClass {
    
        private $myArray = array();
        function pushSomethingToArray($var) {
            array_push($this->myArray, $var);
        }
        function getArray() {
            return $this->myArray;
        }
    
    }
    
    //push some values to the myArray of Mainclass
    $myObj = new MyClass();
    $myObj->pushSomethingToArray('blue');
    $myObj->pushSomethingToArray('orange');
    $myObjClone = clone $myObj;
    $myObj->pushSomethingToArray('pink');
    
    //testing
    print_r($myObj->getArray());     //Array([0] => blue,[1] => orange,[2] => pink)
    print_r($myObjClone->getArray());//Array([0] => blue,[1] => orange)
    //so array  cloned
    

    上面例子中clone对象的同时,值为数组的属性也clone了。

    php 对象比较

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

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

  • 相关阅读:
    不忘初心,方得始终
    我的博客开通了~第一个帖子奉上
    @TableLogic表逻辑处理注解(逻辑删除)
    nginx笔记
    ERROR: permission denied for relation hycom 权限被拒绝
    Mybatis-plus学习笔记
    SpringBoot学习笔记
    org.apache.ibatis.binding.BindingException原因总结(找不到映射文件)
    SpringBoot优先加载设置
    Date时间处理
  • 原文地址:https://www.cnblogs.com/fogwind/p/15204442.html
Copyright © 2011-2022 走看看