2008-09-16 7 views
0

PHP'de, korumalı/özel bir mülke başvuruyu mülkün kapsamı dışındaki bir sınıfa döndürürseniz, başvuru kapsamı geçersiz kılar mı?PHP mülkünün kapsamı referans olarak geçerek geçersiz kılındı ​​mı?

örn.

class foo 
{ 
    protected bar = array(); 
    getBar() 
    { 
    return &bar; 
    } 

} 

class foo2 
{ 
    blip = new foo().getBar(); // i know this isn't php 
} 

Bu doğru ve dizi çubuk referans ile bu geçirilen?

+0

böyle yapıyorsun neden yardım ancak merak ediyorum, ya da hatta iyi bir fikir olup olmadığını ... –

+0

Bağışlayın ama kullanımı Bir kamu değişkeni ve korunan bir değişkene "kesmek" ihtiyacını kaybeder mi? Yaptığınız şey oldukça kötü bir fikir gibi görünüyor ... Belki de neyi başarmaya çalıştığınızı daha çok anlatırsanız, bunun hakkında iyi bir yol bulabiliriz ... –

+0

Bu, ihtiyacım olan çok özel bir durumdur. Bu özelliğe erişmek için (db'nin flatfile içeriğiyle ilgili olarak normalleştirilmesi için). Diğer 99/100 kez bu özellik erişilebilir, özel olmak daha iyidir. – Karan

cevap

3

Örnek kodunuz PHP değil, ancak, korumalı bir değişkene bir başvuru döndürdüğünüzde, bu başvuruyu sınıfın kapsamı dışındaki verileri değiştirmek için kullanabilirsiniz. Burada bir örnek verilmiştir:

<?php 
class foo { 
    protected $bar; 

    public function __construct() 
    { 
    $this->bar = array(); 
    } 

    public function &getBar() 
    { 
    return $this->bar; 
    } 
} 

class foo2 { 

    var $barReference; 
    var $fooInstance; 

    public function __construct() 
    { 
    $this->fooInstance = new foo(); 
    $this->barReference = &$this->fooInstance->getBar(); 
    } 
} 
$testObj = new foo2(); 
$testObj->barReference[] = 'apple'; 
$testObj->barReference[] = 'peanut'; 
?> 
<h1>Reference</h1> 
<pre><?php print_r($testObj->barReference) ?></pre> 
<h1>Object</h1> 
<pre><?php print_r($testObj->fooInstance) ?></pre> 

bu kod yürütüldüğünde, print_r() sonuç $testObj->fooInstance saklanan veriler $testObj->barReference depolanan referans kullanarak değiştirilmiş olduğu gösterir. Bununla birlikte, yakalama, fonksiyonun referans ile geri dönüş olarak tanımlanması gerektiğidir VE çağrı aynı zamanda bir referans talep etmelidir. Onlara ihtiyacın var! İşte o PHP kılavuzun dışarı ilgili sayfa var:

http://www.php.net/manual/en/language.references.return.php

+0

Teşekkürler, kafamın karıştığı notasyondu (* her ikisi de referans etiketlerine ihtiyaç duyuyor) – Karan