هل تم تجاوز نطاق خاصية PHP عن طريق التمرير كمرجع؟

StackOverflow https://stackoverflow.com/questions/69564

  •  09-06-2019
  •  | 
  •  

سؤال

في PHP، إذا قمت بإرجاع مرجع إلى خاصية محمية/خاصة إلى فئة خارج نطاق الخاصية، فهل يتجاوز المرجع النطاق؟

على سبيل المثال

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

}

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

هل هذا صحيح وهل يتم تمرير شريط المصفوفة حسب المرجع؟

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

المحلول

حسنًا، نموذج التعليمات البرمجية الخاص بك ليس PHP، ولكن نعم، إذا قمت بإرجاع مرجع إلى متغير محمي، فيمكنك استخدام هذا المرجع لتعديل البيانات خارج نطاق الفصل الدراسي.هنا مثال:

<?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>

عند تنفيذ هذا الكود، print_r() سوف تظهر النتائج أن البيانات المخزنة في $testObj->fooInstance تم تعديله باستخدام المرجع المخزن في $testObj->barReference.ومع ذلك، المهم هو أنه يجب تعريف الدالة على أنها ترجع حسب المرجع، ويجب أن يطلب الاستدعاء أيضًا مرجعًا.أنت في حاجة إليها على حد سواء!إليك الصفحة ذات الصلة من دليل PHP حول ذلك:

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

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