2012-01-22 11 views
8

Aşağıdaki örnekte, $ instance2 ve $ instance3 tarafından yapılan tüm işlemler orijinal nesneyi değiştirir.Nesne tanımlayıcısının kopyası ve nesne tanımlayıcısının referansı - hangisinin gerçek uygulamada kullanılması gerekir?

Sorum şu:

orijinal nesne tanımlayıcı orijinal nesne tanımlayıcısı ve referans kopyası aynı işi yaparsa

. Gerçek uygulamalarda hangisi kullanılmalıdır?

Nesne tanımlayıcısının kopyasının artıları ve eksileri ve nesne tanımlayıcısına başvuru nedir?

php manual numaralı belgeyi okudum, ancak kullanım açısından farklılaşamadığından ikisi de aynı işi yapıyor.

$instance1 = new test(1); 
$instance2 = $instance1; 
$instance3 =& $instance1; 

//$instance1 -> original object identifier of the new object. 
//$instance2 -> copy of object identifier $instance1 
//$instance3 -> reference to the object identifier $instance1 

cevap

5

$instance2 nesne testine tanımlayıcı bir kopyası vardır:

$a = new stdClass(); 
$a->name = "A"; 

$b = new stdClass(); 
$b->name = "B"; 

// $x is a copy of the object identifier in $a 
$x = $a; 
// $y is a reference to $a 
$y = &$a; 

// this will not affect $a 
$x = $b; 
echo $a->name; // 'A' 

// this will affect $a 
$y = $b; 
echo $a->name; // 'B' 

da (ve işareti) referansların kullanımından kaçınılmalıdır neden bu makaleye bakın. Yani, $instance1 ile aynı içerir. $instance3, $instance1 için bir başvuru içerir. Fark şu olacaktır:

$instance1 yerine $instance3 ait değiştirilmişse aynı çıkış iade edileceği
$instance1 = new Test(); 
$instance2 = $instance1; 
$instance3 = & $instance1; 

var_dump($instance1 instanceof Test); // True 
var_dump($instance2 instanceof Test); // True 
var_dump($instance3 instanceof Test); // True 

$instance3 = new AnotherTest(); 

var_dump($instance1 instanceof AnotherTest); // True 
var_dump($instance2 instanceof AnotherTest); // False 
var_dump($instance3 instanceof AnotherTest); // True 

.

Ama şu yapsam: Yani

$instance1 = new Test(); 
$instance2 = $instance1; 
$instance3 = & $instance1; 

$instance2 = new AnotherTest(); 

var_dump($instance1 instanceof AnotherTest); // False 
var_dump($instance2 instanceof AnotherTest); // True 
var_dump($instance3 instanceof AnotherTest); // False 

: (& işlenen kullanarak) referans olarak oluşturulan geçti edilmiş bir değişken wich

Değişiklik veya başvurduğu kurup kurmadığını değişkenin Kopyalanan bir değişkenin değiştirilmesi sadece verilen değişkeni değiştirirken, her ikisini de değiştirir.

Yine, ne tutar böylece, nesnenin bir tanımlayıcı olan $instance1 unutmamak gerekir:

$instance1 = new StdClass(); 
$instance2 = $instance1; 

$instance1->my_property = 1; 
var_dump($instance2); // Output: 1 

artık daha açık Umut.

+0

Örnekler anlamlıdır, ancak 'işaretçi' sözcüğünü PHP'de kullanmamalısınız. –

+0

"Poitner" kelimesini kullandım çünkü aralarındaki temel farklar, motorun bunları nasıl işlediğidir. Bunu nasıl farklı ifade edeceğimi bilemedim. – Lumbendil

+0

Doğru terim, nesne tanımlayıcısıdır: http://php.net/manual/en/language.oop5.references.php –

0

PHP5'teki nesnelerle, tüm nesne yerine, yalnızca nesne tanımlayıcısı kopyalanır. Bu, aynı değere daha fazla başvurmanıza gerek kalmaz ve bunun yerine aynı nesneyi göstermek için tanımlayıcıyı kopyalayabilir. Bunu kendi yararınıza kullanın; ampersandlardan kurtulabilirsiniz.

Önemli bir fark, değişken referansa atanmanın orijinal değişkeni etkilemesi, kopyalanan nesne tanımlayıcısına atamanın yapmamasıdır. Sadece nesnede değişiklikler yapardı. OO'yu sezgisel bir şekilde kullanmak isterseniz, bu durum nesne başvurularını kullanmak için nedenidir. Örnek:

http://schlueters.de/blog/archives/125-Do-not-use-PHP-references.html

+0

Aralarında herhangi bir anlamlı fark var mı? kullanmıyor ve sadece bir sözdizimi faydası. Aksi halde ikisi de aynı amaca hizmet eder. –

+0

Nesne belirleyicilerinden faydalanmanın ve değişken referanslar i.c.w.'yi kullanmamanın neden iyi bir şey olduğunu açıklayan bir örnek ekledim. nesneler. –