细心,谨慎!只有坚持不懈的努力,才有成功的荣誉!

【PHP面向对象(OOP)编程入门教程】17.克隆对象__clone()方法

有的时候我们需要在一个项目里面,使用两个或多个一样的对象,如果你使用“new”关键字重新创建对象的话,再赋值上相同的属性,这样做比较烦琐而且也容易出错,所以要根据一个对象完全克隆出一个一模一样的对象,是非常有必要的,而且克隆以后,两个对象互不干扰。

在PHP4中我们使用“clone”这个关键字克隆对象;

<?php
class Person {
    // 下面是人的成员属性
    var $name;  // 人的名子
    var $sex;   // 人的性别
    var $age;   // 人的年龄
 
    // 定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值
    function __construct($name = "", $sex = "", $age = "") {
        $this->name = $name;
        $this->sex = $sex;
        $this->age = $age;
    }
 
    // 这个人可以说话的方法,说出自己的属性
    function say() {
        echo "我的名子叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this->age . "<br>";
    }
}
 
$p1 = new Person("张三", "男", 20);
 
// 使用“clone”克隆新对象p2,和p1对象具有相同的属性和方法。
$p2=clone $p1;
$p2->say();
?>

PHP4定义了一个特殊的方法名“__clone()”方法,是在对象克隆时自动调用的方法,用“__clone()”方法将建立一个与原对象拥有相同属 性和方法的对象,如果想在克隆后改变原对象的内容,需要在__clone()中重写原本的属性和方法, “__clone()”方法可以没有参数,它自 动包含$this和$that两个指针,$this指向复本,而$that指向原本;

<?
class Person {
    // 下面是人的成员属性
    var $name;  // 人的名子
    var $sex;   // 人的性别
    var $age;   // 人的年龄
 
    // 定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值
    function __construct($name = "", $sex = "", $age = "") {
        $this->name = $name;
        $this->sex = $sex;
        $this->age = $age;
    }
 
    // 这个人可以说话的方法, 说出自己的属性
    function say() {
        echo "我的名子叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this->age . "<br>";
    }
 
    // 对象克隆时自动调用的方法, 如果想在克隆后改变原对象的内容,需要在__clone()中重写原本的属性和方法
    function __clone() {
        // $this指的复本p2, 而$that是指向原本p1,这样就在本方法里,改变了复本的属性。
        $this->name = "我是假的 $that->name";
        $this->age = 30;
    }
}
 
$p1 = new Person("张三", "男", 20);
$p2 = clone $p1;
$p1->say();
$p2->say();
?>

上例输出:

我的名子叫:张三 性别:男 我的年龄是:20
我的名子叫:我是假的张三 性别:男 我的年龄是:30
  1. plaisse说道:

    https://hcialischeapc.com/ - cialis buy

  2. Seiniodia说道:

    Comprar Levitra Sin Receta Ordips cialis cheapest online prices Sagenada Buy Clomid Made In Usa

  3. buy cialis online india说道:

    Amoxicillin No Prescription Ordips https://artsocialist.com/ - where to buy cialis online safely Sagenada Necesita Receta Comprar Propecia Injupe buy cialis on line Nedsteakelak Buy Viagra Cheapest

  4. cialis online说道:

    Vente Viagra France Pas Cher Ordips https://ascialis.com/# - Cialis Sagenada Cialis Oder Levitra Injupe Cialis Nedsteakelak Cialis E Coumadin

  5. ToKereeda说道:

    Folliculitis Against Amoxicillin https://bbuycialisss.com/ - Buy Cialis Buy Doxycycline Online No Prescription Cialis Animal Amoxicillin 50mg Bmp 193

  6. Ellbrar说道:

    Misoprostal 200 Mcg Buy Propecia .2 Dose buy generic cialis On Sale Dutasteride Buy Amoxicillin Antibiotics Online Canada Genuine Brand Name Cialis

  7. Kellype说道:

    Zithromax No Prescription Overnight Shipping Tadalista Vente Baclofen En Canada propecia germany ??? Find Secure Ordering Generic Pyridium Online Ups With Free Shipping Orlistat Order Online Canada Amoxicillin Clavulanic Suspension Dosage

  8. Ellbrar说道:

    Buy Xenical Over The Counter Cialis Cheap From India viagra online Conseguir Viagra Espana Legally Levaquin Where To Buy Discount Overnight Shipping Propecia Grageas

发表评论

电子邮件地址不会被公开。 必填项已用*标注