2012-02-21 1 views
-1

この方法でクラスを別のクラスに連結するにはどうしたらいいですか?PHP:互いにクラスを連結

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

は、私はいつも早めに連結される必要があり、クラス内のすべてを知っているので、一般化は問題ではないことに注意してください。

+0

だと仮定すると一緒に2つのオブジェクトを連結します。正しい方法を得る方法を理解するには、「デザインパターン」を参照してください。 –

+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

Person__toString()メソッドを記述します。

3

あなたが要求している操作は意味をなさない。

.は、PHPでは、の文字列連結操作です。 A Personオブジェクトには多種多様なメンバが存在する可能性がありますが、そのうちのいくつかは文字列形式では意味がないかもしれません(別のオブジェクトへの参照?データベースハンドル?)。あなたは(そのような存在する場合)文字列人間が読める形式Personを連結することを意図している場合

は、あなたがPerson__toString()メソッドを追加することができ、およびに連結された戻り値を入れ、$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)); 

... 

何とか何とか...私はちょっとわめき散らしますよ。これは多かれ少なかれ改善の余地がある概念です。私の主張は、あなたはこのような方法でオブジェクトを結合することができるということです。

2つのクラスの各プロパティに文字列で加算演算子を適用して、Personオブジェクトの迷惑なバージョンを出力する場合は、そのための関数を作成することができます。 $person3 = $person1 + $person2;と同じくらい美しい。代わりに$person3 = add($person1,$person2);のように見えるかもしれません。