سؤال

أنا أدرس للحصول على شهادة Zend PHP5 ، كل شيء يبدو جيدًا ، لكن لا يمكنني العثور على أمثلة في العالم الحقيقي لتمرير أو إرجاع المتغيرات المرجعية الخاصة بي.

سيكون لطيفًا جدًا ، إذا كان لدى شخص ما مثال متى يستخدم هذا؟

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

المحلول

دعنا نقول أنك تريد كتابة وظيفة تزيل قيمًا معينة من صفيف.

function remove_elements($array, $item1, $item2, ...) {
  ...
}

يمكنك نسخ المصفوفة وإعادتها. ولكن ماذا لو كنت تريد معرفة ما إذا كان قد تمت إزالة أي شيء؟ بدلاً من ذلك تقوم بتعديل الصفيف في المكان وإعادة عدد العناصر التي تمت إزالتها. لذا:

function remove_elements(&$array) {
  // remove elements
  return $number_removed;
}

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

إن العودة بالرجوع أكثر منطقية عندما تكتب وظيفة عضو في الفصل. يمكنك إرجاع إشارة إلى عضو في البيانات ولكن هذا يمكن أن يكسر التغليف.

أخيرًا ، تجدر الإشارة إلى أنه يتم تمرير جميع الكائنات وإعادتها بالرجوع إليها افتراضيًا. يتم تمرير كل شيء آخر وإعادته بالقيمة.

نصائح أخرى

تمرير بالرجوع: وظائف مثل asort ()

$array = array(3, 2, 1);
asort($array);

يتم تمرير الكائنات في PHP5 بالرجوع بشكل افتراضي. (للحصول على وصف صحيح انظر http://docs.php.net/language.oop5.references)

تم بالفعل الإجابة على الحجج الناجحة ...

كمثال (العالم الحقيقي) لقيمة الإرجاع حسب المرجع أي واجهة بطلاقة حيث تقوم طريقة بإرجاع مرجع إلى نفس الكائن مثل السياق الخاص به ($ this). هذا لن يعمل (كما هو متوقع) إذا كانت قيمة الإرجاع نسخة/استنساخ.

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

class MyClass {  
  protected $foo = 'n/a';
  protected $bar = 'n/a';

  function foo($val) {
    $this->foo = (int)$val;
    return $this;
  }

  function bar($val) {
    $this->bar = (int)$val;
    return $this;
  }

  function __toString() {
    return 'foo='.$this->foo.' bar='.$this->bar;
  }
}

$o = new MyClass;
$o->foo(1)
  ->bar(2);
echo $o;

هذه المطبوعات foo=1 bar=2 وأعتقد أن هذه هي النتيجة التي يتوقعها المرء ، لا مفاجآت هنا. إذا تم إرجاع الطريقة $ هذا بالقيمة ، فلن تعمل بعد الآن. يمكنك اختبار ذلك عن طريق إجبار PHP على إعادة نسخة. بدلا من ال return $this استخدام الخطوط

return clone $this;

وسيكون الإخراج

foo=1 bar=n/a

(ولن أسمي تلك الواجهة بديهية ؛-))

قد يكون ذلك مفيدًا ، إذا كنت تعمل مع Chainig ، مثل:

    public function addObject(array &$someData){
$newObj = Fabric::create($someData);
$this->listOfObj[] = $newObj;
return $newObj;
}

....
$this->addObj(array('idontknow' => 'anything'))->setName('mr.knowitall')->save();

... سري. مثل Volkers :( (الواجهة بطلاقة تتسلل كما أعرفها).

الصورة لديك واجهة بطلاقة مع طريقة تحميل. استبدال واجهة التحميل أو يضيف بعض البيانات. هنا قد يكون من المفيد التصرف مع مكالمة حسب القيمة المرجعية $ النجاح لتحديد أن الحمل كان ناجحًا.

العودة بالرجوع: خذ بعض الكائنات التي تحتوي على قائمة من الصفوف. العدد. من الصفوف نقاط إلى البيانات الصحيحة لجميع الكائنات (parallesl). إذا قمت بإرجاع NR. ونقله إلى الكائن التالي ، يمكنك تخطي الصف في كائن واحد والتخطي في الآخرين أيضًا. دائما وجود حفنة فاليد من الأشياء.

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