使用不同的共享方法和属性扩展PHP类

I have the following three objects which includes the following methods and properties:

$obj1
 - $prop1
 - $prop2
 - $prop3
 - $prop4
 - method1()
 - method2()
 - method3()
 - method4()

$obj2
 - $prop2
 - $prop3
 - $prop4
 - $prop5
 - method2()
 - method3()
 - method4()
 - method5()

$obj3
 - $prop1
 - $prop3
 - $prop4
 - $prop5
 - method1()
 - method3()
 - method4()
 - method5()

All properties and methods of a given name utilize identical script to create them.

One possible script to create these objects is as follows:

class class1 { 
  var $prop1=123, $prop2=array(), $prop3, $prop4;
  public method method1($x) {echo('hello '.$x;}
  public method method2($x) {echo('goodby '.$x;}
  public method method3($x) {echo('hey '.$x;}
  public method method4($x) {echo('seeya '.$x;}
}

class class2 { 
  var $prop2=array(), $prop3, $prop4, $prop5=555,;
  public method method2($x) {echo('goodby '.$x;}
  public method method3($x) {echo('hey '.$x;}
  public method method4($x) {echo('seeya '.$x;}
  public method method5($x) {echo('latter '.$x;}
}

class class3 { 
  var $prop1=123,  $prop3, $prop4, $prop5=555,;
  public method method1($x) {echo('hello '.$x;}
  public method method3($x) {echo('hey '.$x;}
  public method method4($x) {echo('seeya '.$x;}
  public method method5($x) {echo('latter '.$x;}
}

How can I create these three objects without duplicating the script used to create the properties and methods?

Untested and not positive it will work. Also, concerned it will be difficult to maintain.

trait trait_1{
  var $prop1=123;
  public method method1($x) {echo('hello '.$x;}
}
trait trait_2{
  $prop2=array();
  public method method2($x) {echo('goodby '.$x;}
}
trait trait_5{
   $prop5=555;
  public method method5($x) {echo('latter '.$x;}
}

trait trait_3_4{
  var $prop3, $prop4;
  public method method3($x) {echo('hey '.$x;}
  public method method4($x) {echo('seeya '.$x;}
}

class class1 { 
  use trait_1, trait_2,  trait_3_4;
}
class class2 { 
  use trait_2,  trait_3_4, trait_5;
}
class class3 { 
  use trait_1,  trait_3_4, trait_5;
}

Well looks like they all use methods 4 and 3

So you only need to define the methods in one class, the other classes can then extend it.

The other methods could be handled by traits but its a bit messy 'cause you'd need to have a trait per method

The same applies to the properties.

class class1 { 
  use Method1,Method2;
  public method method3($x) {echo('hey '.$x;}
  public method method4($x) {echo('seeya '.$x;}
}

class class2 extends class1{ 
  use Method2,Method5;
}

class class3 extends class1{ 
  use Method1,Method5;      
}

trait Method1 {
  public method method1($x) {echo('hello '.$x;}
} 

trait Method2 {
  public method method2($x) {echo('goodby '.$x;}
} 

trait Method5 {
  public method method5($x) {echo('latter '.$x;}
} 

EDIT

I just realized that all the classes would end up with a method 1 and 2 as they extend class1 which uses them, so.. I guess you'd be better to have all the methods in separate traits and add them with use as required and not bother with extends

I still don't much care for it though