PHP tesisin kapsamı referans olarak ileterek geçersiz?

3 Cevap php

Eğer mülkiyet kapsamı dışında bir sınıfa korumalı / özel mülkiyet için bir başvuru döndürmek eğer PHP, referans kapsamını geçersiz kılıyor?

e.g.

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

}

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


Bu doğru mudur ve dizi bar başvuru tarafından geçirilen ediliyor?

3 Cevap

Peki, örnek kod PHP değil, korumalı bir değişken için bir başvuru döndürmek evet, sen sınıfının kapsam dışında verileri değiştirmek için bu başvuruyu kullanabilirsiniz. İşte bir örnek:

<?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 çalıştırıldığında, print_r () sonuçlarını veri depolanan olduğunu gösterecektir $ testObj-> fooInstance $ testObj-> barReference saklanan referans kullanarak modifiye edilmiştir. Ancak, yakalama fonksiyonu referans ile dönen olarak tanımlanmalıdır VE çağrı da bir referans istemek zorunda olmasıdır. Sen ikisini gerekiyor! İşte bu konuda PHP kılavuzun dışında ilgili sayfası:

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

Beni affedin, ama bir ortak değişken kullanımı ve korunan bir değişkene erişim "hack" için ihtiyaç kaybetmek? Ne yapıyorsun sen bize gerçekleştirmek için çalıştığınız şeyin daha söyledim Belki de, biz bu konuda gitmek için iyi bir yol bulabiliriz ... Oldukça kötü bir fikir gibi görünüyor ...

Ben aynı C / C + + veya herhangi bir dil işaretçiler sahip olacağını düşünüyorum.