PHP: объединить классы друг с другом - PullRequest
0 голосов
/ 21 февраля 2012

Как я могу таким образом объединить класс в другой класс?

class Person { }
$p1 = new Person();
$p2 = new Person();
$p3 = $p1 . $p2;

Имейте в виду, что я всегда буду знать все в классе, которое необходимо объединить заранее, поэтому обобщение не будетвопрос.

Ответы [ 5 ]

3 голосов
/ 21 февраля 2012

Запрашиваемая вами операция не имеет смысла.

. - это в PHP операция объединения string .У объекта Person может быть множество элементов, некоторые из которых могут даже не иметь смысла в строковой форме (ссылка на другой объект? Дескриптор базы данных?).

Если вы намеревались объединить строковая читабельная форма из Person (если есть), вы можете добавить __toString() метод к Person и вызвать его на $p1 и $p2, поместив объединенныевозвращаемое значение в $p3.

2 голосов
/ 21 февраля 2012

Запишите __toString() метод для Person.

1 голос
/ 23 февраля 2012

Это объединит два объекта вместе, предполагая, что они одного типа

<?php

function combine_objects($obj1, $obj2) {
  if (get_class($obj1) !== get_class($obj2)) {
    throw new Exception('Class mismatch');
  }

  $className = get_class($obj1);
  $newObject = new $className;
  foreach(get_object_vars($obj1) as $key => $value) {
    $newObject->$key = $obj1->$key . $obj2->$key;
  }

  return $newObject;
}

class Person {
  public $first;
  public $last;
  public $id;
}

$john = new Person;
$john->first = 'John';
$john->last = 'Smith';
$john->id = 1;


$mary = new Person;
$mary->first = 'Mary';
$mary->last = 'York';
$mary->id = 5;

$p3 = combine_objects($john, $mary);

var_dump($p3);

/*
object(Person)#3 (3) {
  ["first"]=>
  string(8) "JohnMary"
  ["last"]=>
  string(9) "SmithYork"
  ["id"]=>
  string(2) "15"
}
*/
1 голос
/ 21 февраля 2012

PHP не позволяет вам перегружать операторы (за исключением нескольких небольших исключений). При этом вы всегда можете создать обходной путь:

class Person { ... }

class People 
{ 
    // Array of Person objects
    private static $_people = Array();

    // Add person object to people object
    public function add(Array $persons)
    {
        foreach($persons as $person)
        {
           self::_people[] = $person;
        }
    }
}

$person1 = new Person;
$person2 = new Person;

$people = new People();
$people->add( Array($person1,$person2) );

...

Бла-бла ... Я вроде ругаю. Это просто концепция более или менее с большим количеством возможностей для совершенствования. Я хочу сказать, что вы можете комбинировать объекты таким образом, как этот.

Если ваша цель состоит в том, чтобы буквально применить оператор сложения к каждому свойству в двух классах и вывести непонятную версию объекта Person, вы можете создать функцию, которая сделает это за вас ... это просто не будет довольно как $person3 = $person1 + $person2;. Вместо этого это может выглядеть как $person3 = add($person1,$person2);.

0 голосов
/ 21 февраля 2012

Вам не повезло - PHP не позволяет перегружать операторы, как это делает С.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...