2012-02-21 4 views
-1

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

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

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

+0

Вы не можете сцепить. см. «Шаблоны проектирования», чтобы понять, как получить правильный путь. –

+0

Я думаю, вы хотите объединить объекты, но почему, если они одни и те же объекты? –

+1

Я заинтригован (и немного обеспокоен) Что бы вы на самом деле ожидали, что ваш $ p3 будет содержать? Или это будет класс детей? –

ответ

1

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

<?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" 
} 
*/ 
2

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

3

Операция, которую вы запрашиваете, не имеет смысла.

. есть, в PHP, строка операция конкатенации. Объект Person может иметь большое количество членов, некоторые из которых могут даже не иметь смысла в строковой форме (ссылка на другой объект? Ручка базы данных?).

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

0

Вам не повезло - PHP не позволяет перегружать операторы, например, C.

+2

C тоже. Вероятно, вы имеете в виду C++ или C#. – cHao

1

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);.

Смежные вопросы