Php соединить два объекта

Каков наилучший метод слияния двух объектов PHP?

У нас есть два объекта PHP5, и мы хотели бы объединить содержимое одного из них со вторым. Между ними нет понятия подклассов, поэтому решения, описанные в следующей теме, неприменимы.

//We have this: $objectA->a; $objectA->b; $objectB->c; $objectB->d; //We want the easiest way to get: $objectC->a; $objectC->b; $objectC->c; $objectC->d;
  • Это объекты, а не классы.
  • Объекты содержат довольно много полей, поэтому foreach будет довольно медленным.
  • Пока что мы рассматриваем преобразование объектов A и B в массивы, затем объединяем их с помощью array_merge() перед повторным преобразованием в объект, но мы не можем сказать, что гордимся этим.

если объекты содержат только поля (не методов), это работает:

$obj_merged = (object) array_merge((array) $obj1, (array) $obj2);

Это на самом деле работает, когда объекты имеют методы. (проверено на PHP 5.3 и 5.6)

Если ваши объекты содержат только поля (без методов), это работает:

$obj_merged = (object) array_merge((array) $obj1, (array) $obj2);

Вы можете создать другой объект, который перенаправляет вызовы магических методов базовым объектам. Вот как вы будете обрабатывать `__get’, но чтобы это работало в полной мере, вам придется переопределить все соответствующие магические методы. Возможно, вы найдете синтаксические ошибки, так как я ввел это просто из головы.

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; > > >
foreach($objectA as $k => $v) $objectB->$k = $v;

Я понимаю, что используя общие объекты [stdClass()] и бросая их как массивы отвечает на вопрос, но я думал, что композитор был отличный ответ. Но я чувствовал, что это могло использовать некоторые дополнительные функции, и могут быть полезны для кого-то другого.

  • Указать ссылку или Клон
  • Указать первую или последнюю запись взять верх
  • Множественные (более двух) объекта слияния с сходство синтаксиса array_merge
  • Связывание метода: параметр obj-&$ГТ;Ф1()->Ф2()->Ф3().
  • Динамические композиты: параметр obj-&$ГТ;слияние(. ) / работу здесь / параметр obj-&$ГТ;слияние(. )
class Compositor < protected $composite = array(); protected $use_reference; protected $first_precedence; /** * __construct, Constructor * * Used to set options. * * @param bool $use_reference whether to use a reference (TRUE) or to copy the object (FALSE) [default] * @param bool $first_precedence whether the first entry takes precedence (TRUE) or last entry takes precedence (FALSE) [default] */ public function __construct($use_reference = FALSE, $first_precedence = FALSE) < // Use a reference $this->use_reference = $use_reference === TRUE ? TRUE : FALSE; $this->first_precedence = $first_precedence === TRUE ? TRUE : FALSE; > /** * Merge, used to merge multiple objects stored in an array * * This is used to *start* the merge or to merge an array of objects. * It is not needed to start the merge, but visually is nice. * * @param object[]|object $objects array of objects to merge or a single object * @return object the instance to enable linking */ public function & merge() < $objects = func_get_args(); // Each object foreach($objects as &$object) $this->with($object); // Garbage collection unset($object); // Return $this instance return $this; > /** * With, used to merge a singluar object * * Used to add an object to the composition * * @param object $object an object to merge * @return object the instance to enable linking */ public function & with(&$object) < // An object if(is_object($object)) < // Reference if($this->use_reference) < if($this->first_precedence) array_push($this->composite, $object); else array_unshift($this->composite, $object); > // Clone else < if($this->first_precedence) array_push($this->composite, clone $object); else array_unshift($this->composite, clone $object); > > // Return $this instance return $this; > /** * __get, retrieves the psudo merged object * * @param string $name name of the variable in the object * @return mixed returns a reference to the requested variable * */ public function & __get($name) < $return = NULL; foreach($this->composite as &$object) < if(isset($object->$name)) < $return =& $object->$name; break; > > // Garbage collection unset($object); return $return; > >
$obj = new Compositor(use_reference, first_precedence); $obj->merge([object $object [, object $object [, object $. ]]]); $obj->with([object $object]);
$obj1 = new stdClass(); $obj1->a = 'obj1:a'; $obj1->b = 'obj1:b'; $obj1->c = 'obj1:c'; $obj2 = new stdClass(); $obj2->a = 'obj2:a'; $obj2->b = 'obj2:b'; $obj2->d = 'obj2:d'; $obj3 = new Compositor(); $obj3->merge($obj1, $obj2); $obj1->c = '#obj1:c'; var_dump($obj3->a, $obj3->b, $obj3->c, $obj3->d); // obj2:a, obj2:b, obj1:c, obj2:d $obj1->c; $obj3 = new Compositor(TRUE); $obj3->merge($obj1)->with($obj2); $obj1->c = '#obj1:c'; var_dump($obj3->a, $obj3->b, $obj3->c, $obj3->d); // obj1:a, obj1:b, obj1:c, obj2:d $obj1->c = 'obj1:c'; $obj3 = new Compositor(FALSE, TRUE); $obj3->with($obj1)->with($obj2); $obj1->c = '#obj1:c'; var_dump($obj3->a, $obj3->b, $obj3->c, $obj3->d); // obj1:a, obj1:b, #obj1:c, obj2:d $obj1->c = 'obj1:c';

Источник

Читайте также:  Исходные коды ботов дискорд python

Как объединить объекты в PHP 4 мин для чтения

Favorite

Добавить в избранное

Полный список функций файловой системы PHP 5

Х отя встроенной функции нет, в PHP есть несколько способов объединения объектов. Например, новый объект можно создать, добавив свойства двух или более объектов с помощью цикла. В качестве альтернативы требуемые объекты можно преобразовать в массивы, которые можно объединить с помощью array_merge() или array_merge_recursively(), а затем повторно преобразовать в объект.

В этой статье мы покажем вам, как использовать вышеуказанные методы для объединения объектов в PHP.

Пример 1: объединение объектов с помощью цикла for

Чтобы следовать этому руководству, создайте файл PHP со следующим скриптом. Здесь объявлен класс Account. Account содержит метод display() для печати назначенных значений объекта класса. Объявлена настраиваемая функция Merge_Object() для объединения двух объектов класса Account с помощью цикла for. Два цикла for используются для объединения значений объектов и сохранения их в другом объекте класса Account. Объект $ acc_obj1 используется для назначения трех значений свойств класса Account, а объект $acc_obj2 используется для присвоения двух значений свойств. Эти переменные будут переданы в качестве аргументов функции Merge_Object().

// Определить класс
class Account

public function display ( $object )
<
echo « Имя: » . $object — > name. «
» ;
echo « Электронная почта: » . $object — > email. «
» ;
echo « Тип учетной записи: » . $object — > acc_type. «
» ;
echo « Начальное сальдо: » . $object — > openning_balance. «
» ;
echo « Текущее сальдо: » . $object — > current_balance;
>

// Определить функцию для объединения объектов
function Merge_Object ( $object1 , $object2 )

// Создать новый объект класса
$merge_object = new Account ( ) ;

// Присваиваем значения первого объекта новому объекту
foreach ( $object1 as $property = > $value ) <
$merge_object — > $property = $value ;
>

// Добавляем значения второго объекта в новый объект
foreach ( $object2 as $property = > $value ) <
$merge_object — > $property = $value ;
>

echo « Значения объединенного объекта:

» ;

// Вызов функции для печати значений объединенного объекта
$merge_object — > display ( $merge_object ) ;
>

// Создаем первый объект и присваиваем значения свойствам
$acc_obj1 = new Account ( ) ;
$acc_obj1 — > name = » andreyex» ;
$acc_obj1 — > email = «andreyex@gmail.com» ;
$acc_obj1 — > acc_type = «Saving» ;

// Создаем второй объект и присваиваем значения свойствам
$acc_obj2 = new Account ( ) ;
$acc_obj2 — > openning_balance = 40000 ;
$acc_obj2 — > current_balance = 50000 ;

// Вызов функции для объединения обоих объектов
Merge_Object ( $acc_obj1 , $acc_obj2 ) ;

Следующий вывод будет произведен после запуска вышеуказанного скрипта с веб-сервера. В выходных данных отображаются значения свойств переменной объединенного объекта.

Пример 2: объединить объекты с помощью функции array_merge()

Функция array_merge() используется для объединения двух или более массивов. Чтобы следовать этому примеру, создайте файл PHP со следующим скриптом. Здесь класс Account используется для печати значений объединенного объекта. Объекты $ acc_obj1 и $ acc_obj2 создаются в сценарии. Три значения свойств назначаются с помощью $ acc_obj1, а два значения свойств назначаются с помощью $ acc_obj2. Эти два объекта преобразуются в два массива и передаются в качестве аргументов функции array_merge(). Выходные данные функции array_merge() преобразуются в объект для получения $ merge_object. Затем $merge_object передается в качестве аргумента методу display() класса Account.

// Определить класс
class Account

public function display ( $object )
<
echo « Имя: » . $object — > name. «
» ;
echo « Электронная почта: » . $object — > email. «
» ;
echo « Тип учетной записи: » . $object — > acc_type. «
» ;
echo « Начальное сальдо:» . $object — > openning_balance. «
» ;
echo « Текущее сальдо: » . $object — > current_balance;
>

// Создайте первый объект и назначьте значения свойств
$acc_obj1 = new Account ( ) ;
$acc_obj1 — > name = «Destroyer» ;
$acc_obj1 — > email = «Destroyer@gmail.com» ;
$acc_obj1 — > acc_type = «Current» ;

// Создайте второй объект и назначьте значения свойств
$acc_obj2 = new Account ( ) ;
$acc_obj2 — > openning_balance = 500000 ;
$acc_obj2 — > current_balance = 450000 ;

// Слияние объектов с помощью array_merge ( )
$merge_object = ( object ) array_merge ( ( array ) $acc_obj1 , ( array ) $acc_obj2 ) ;

echo « Значения объединенного объекта:

» ;

foreach ( $merge_object as $property = > $value ) <
echo $property . » => « . $value . «
» ;
>
? >

Следующий результат будет получен при запуске вышеуказанного скрипта с веб-сервера. В выходных данных отображаются значения свойств переменной объединенного объекта.

Пример 3: объединить объекты с помощью функции array_merge_recursive()

Объекты также можно объединять с помощью встроенной функции array_merge_recursive(), которая используется для объединения вложенных массивов. Следовательно, если какой-либо массив содержит внутри себя другой массив, эта функция вернет объединенный массив путем объединения значений вложенного массива.

Чтобы следовать этому примеру, создайте файл PHP со следующим скриптом. Здесь определен класс Student, который возвращает объединенный объект с помощью метода Merge_Objects(). Объекты $ obj1 и $ obj2 объявлены для хранения свойств id и mark. Свойство mark содержит другой объект для хранения значений других свойств. Затем $ obj1 и $ obj2 передаются в качестве аргументов функции Merge_Objects(), которая использует функцию array_merge_recursive().

// Определите класс
class Student

//Объедините два объекта с помощью array_merge_recursive ( )
public function Merge_Objects ( $object1 , $object2 )
<
$Obj1 = ( array ) $object1 ;
$Obj2 = ( array ) $object2 ;
$merged = array_merge_recursive ( $Obj1 , $Obj2 ) ;
return ( object ) $merged ;
>
>

// Определите объект класса
$student = new Student ( ) ;

// Объявите первый объект
$obj1 = ( object ) [
‘id’ = > ‘423456’ ,
‘marks’ = > ( object ) [
‘CSE101’ = > 87
]
] ;

// Объявите второй объект
$obj2 = ( object ) [
‘marks’ = > ( object ) [
‘CSE204’ = > 94 ,
‘CSE306’ = > 75
]
] ;

// Вызовите функцию для слияния первого и второго объектов
$merged_object = $student — > Merge_Objects ( $obj1 , $obj2 ) ;

//Печать з начения объединенного объекта
echo «

» ; 
print_r ( $merged_object ) ;
echo «

» ;

Следующий результат будет получен при запуске вышеуказанного скрипта с веб-сервера. В выходных данных отображаются значения свойств переменной объединенного объекта.

Заключение

В этой статье мы покажем вам три различных способа объединения объектов в PHP. В первом примере объекты объединяются с помощью цикла for, а в двух других примерах используются встроенные функции для объединения массивов.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Источник

Оцените статью