سؤال

يبدو أن الكائنات في PHP مرت بالرجوع.حتى معاملات التعيين لا يبدو أن إنشاء نسخة من الكائن.

هنا بسيطة ، المفتعلة برهان:

<?php

class A {
    public $b;
}


function set_b($obj) { $obj->b = "after"; }

$a = new A();
$a->b = "before";
$c = $a; //i would especially expect this to create a copy.

set_b($a);

print $a->b; //i would expect this to show 'before'
print $c->b; //i would ESPECIALLY expect this to show 'before'

?>

سواء في شكل مطبوع أو الحالات أنا على الحصول على 'بعد'

كيف أمرر $a إلى set_b() من حيث القيمة ، ليس مرجع ؟

هل كانت مفيدة؟

المحلول

في PHP 5+ الكائنات مرت الإشارة.في PHP 4 يتم تمريرها حسب القيمة (هذا هو السبب في أنه كان وقت تمر بها المرجعية التي أصبحت إهمال).

يمكنك استخدام 'استنساخ' المشغل في PHP5 لنسخ الكائنات:

$objectB = clone $objectA;

أيضا, انها فقط الكائنات التي يتم تمريرها عن طريق الإشارة ، وليس كل شيء كما قلت في سؤالك...

نصائح أخرى

الإجابات شيوعا وجدت في جافا الكتب.

  1. الاستنساخ:إذا كنت لا تجاوز استنساخ أسلوب السلوك الافتراضي هو نسخة الضحلة.إذا الأشياء الخاصة بك فقط بدائية الأعضاء المتغيرات ، انه موافق تماما.ولكن في typeless اللغة مع كائن آخر الأعضاء المتغيرات انها الصداع.

  2. التسلسل/إلغاء التسلسل

$new_object = unserialize(serialize($your_object))

هذا يحقق نسخة عميق مع الثقيلة التكلفة اعتمادا على تعقيد الكائن.

وفقا التعليق السابق, إذا كان لديك كائن آخر عضو متغير ، القيام بما يلي:

class MyClass {
  private $someObject;

  public function __construct() {
    $this->someObject = new SomeClass();
  }

  public function __clone() {
    $this->someObject = clone $this->someObject;
  }

}

الآن يمكنك أن تفعل الاستنساخ:

$bar = new MyClass();
$foo = clone $bar;

وفقا مستندات (http://ca3.php.net/language.oop5.cloning):

$a = clone $b;

فقط لتوضيح PHP يستخدم نسخ على الكتابة ، وذلك أساسا كل شيء هو إشارة إلى تعديله ، ولكن الكائنات تحتاج إلى استخدام استنساخ و __استنساخ() طريقة سحرية في الجواب المقبول.

هذا القانون يساعد في استنساخ أساليب

class Foo{

    private $run=10;
    public $foo=array(2,array(2,8));
    public function hoo(){return 5;}


    public function __clone(){

        $this->boo=function(){$this->hoo();};

    }
}
$obj=new Foo;

$news=  clone $obj;
var_dump($news->hoo());

كنت أقوم ببعض التجارب و حصلت على هذا:

class A {
  public $property;
}

function set_property($obj) {
  $obj->property = "after";
  var_dump($obj);
}

$a = new A();
$a->property = "before";

// Creates a new Object from $a. Like "new A();"
$b = new $a;
// Makes a Copy of var $a, not referenced.
$c = clone $a;

set_property($a);
// object(A)#1 (1) { ["property"]=> string(5) "after" }

var_dump($a); // Because function set_property get by reference
// object(A)#1 (1) { ["property"]=> string(5) "after" }
var_dump($b);
// object(A)#2 (1) { ["property"]=> NULL }
var_dump($c);
// object(A)#3 (1) { ["property"]=> string(6) "before" }

// Now creates a new obj A and passes to the function by clone (will copied)
$d = new A();
$d->property = "before";

set_property(clone $d); // A new variable was created from $d, and not made a reference
// object(A)#5 (1) { ["property"]=> string(5) "after" }

var_dump($d);
// object(A)#4 (1) { ["property"]=> string(6) "before" }

?>

في هذا المثال سوف نقوم بإنشاء اي فون فئة وجعل طبق الأصل من قبل الاستنساخ

class iPhone {

public $name;
public $email;

    public function __construct($n, $e) {

       $this->name = $n;
       $this->email = $e;

    }
}


$main = new iPhone('Dark', 'm@m.com');
$copy = clone $main;


// if you want to print both objects, just write this    

echo "<pre>"; print_r($main);  echo "</pre>";
echo "<pre>"; print_r($copy);  echo "</pre>";

إذا كنت ترغب في كامل نسخ خصائص كائن في مختلف سبيل المثال ، قد ترغب في استخدام هذه التقنية:

تسلسل إلى سلمان ثم de-تسلسل مرة أخرى إلى الكائن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top