اذهب إلى المحتوى
  • 0

كيفية دمج كائنين Objects معًا في كائن واحد في PHP؟

Emad Saif

السؤال

لدي صنفين MyClassA وMyClassB وأقوم بعمل كائن جديد من كلٍ منهما، على النحو التالي:

<?php

class MyClassA {
	public $a = "a";
	public $b = "b";
}

class MyClassB {
	public $c = "c";
	public $d = "d";
}

$obj1 = new MyClassA();
$obj2 = new MyClassB();

echo $obj1->a;
echo $obj1->b;

echo $obj2->c;
echo $obj2->d;



هل توجد طريقة لدمج الكائن obj1 وobj2 معًا في كائن واحد جديد وليكن باسم newObj؟ بحيث يمكن إستخدامه كما يلي:

<?php

echo $newObj->a;
echo $newObj->b;

echo $newObj->c;
echo $newObj->d;

كيف أقوم بدمج الكائنين معًا في PHP؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

يمكن باستخدام تحويل النوع الصريح لتحويل كلا الكائنين إلى مصفوفة ترابطية associative عبر النوع array كالتالي:

 

<?php

(array) $obj1; // ["a" => "a", "b" => "b"]
(array) $obj2; // ["c" => "c", "d" => "d"]

ثم نستفيد من التابع array_merge لدمج المصفوفتين الناتجتين في مصفوفة واحدة كالتالي:

<?php

array_merge((array) $objectA, (array) $objectB); // ["a" => "a", "b" => "b", "c" => "c", "d" => "d"]

ثم يمكن تحول المصفوفة الناتجة إلى كائن مجددًا عبر النوع object كالتالي:

<?php

$newObj = (object) array_merge((array) $objectA, (array) $objectB);

echo $newObj->a; // a
echo $newObj->b; // b
echo $newObj->c; // c
echo $newObj->d; // d

لكن هذا النوع من الدمج محدود ويقوم بدمج الخصائص العامة فقط ولا يدمج التوابع

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

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

<?php 
// كائن أول
$x = new stdClass();
// كائن ثاني
$y = new stdClass();

// استنساخ أول كائن لكتئن جديد
$z = clone $x;

// المرور على الكائن الثاني و قراءة الثنائيات و إسنادها ل الكائن الجديد
foreach($y as $k => $v) {$z->$k = $v;}

كما يمكننا عمل كائن جديد فيه خاصيتين كل منها عبارة عن كائنات مراد دمجها، وبتخصيص دالة get__ يمكننا إعادة الخاصية من الكائن الجديد من إحدى خاصيتيه

<?php
// تعريف صنف جديد
class Compositor {
  // كل خاصية عبارة عن كائن مراد دمجه
  private $obj_a;
  private $obj_b;

  // الدالة البانية تسند غرضين لخواص الكائن
  public function __construct($obj_a, $obj_b) {
    $this->obj_a = $obj_a;
    $this->obj_b = $obj_b;
  }

  // من خلال الدالة السحرية 
  public function __get($attrib_name) {
    // في حال كلنت الخاصية من أول كائن نعيدها
    if ($this->obj_a->$attrib_name) {
       return $this->obj_a->$attrib_name;  
    } 
    // وإلا ستكون في الثاني
    else {
       return $this->obj_b->$attrib_name;
    }
  }
}

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...