Heim >Backend-Entwicklung >PHP-Tutorial >PHP好的方法书写不同名但方法相同的类。
比如说:
<code>class A { private $value = null; public function __construct() { $this->value = 1; } } class B { private $differentValue = null; public function __construct() { $this->differentValue = 1; } } </code>
A和B的作用完全不同, 他们两个没有办法合并。
<code>class C extends A { public function display() { echo "OK"; } } class D extends B { public function display() { echo "OK"; } } </code>
C和D的内容又完全相同, 这样的情况有没有什么好的方法把C和D的内容只写一遍?
因为要向下兼容5.3的, 所以trait不能用~~~
比如说:
<code>class A { private $value = null; public function __construct() { $this->value = 1; } } class B { private $differentValue = null; public function __construct() { $this->differentValue = 1; } } </code>
A和B的作用完全不同, 他们两个没有办法合并。
<code>class C extends A { public function display() { echo "OK"; } } class D extends B { public function display() { echo "OK"; } } </code>
C和D的内容又完全相同, 这样的情况有没有什么好的方法把C和D的内容只写一遍?
因为要向下兼容5.3的, 所以trait不能用~~~
<code>class A { private $value = null; public function __construct() { $this->value = 1; } } class B { private $differentValue = null; public function __construct() { $this->differentValue = 1; } } /** * @method void display() */ class C extends A { private $handler = null; public function __construct() { parent::construct(); $this->handler = new E(); } public function __call($name, $params) { if ( method_exists($this->handler, $name) ) { return call_user_func_array(array($this->handler, $name), $params); } else { throw new Exception('Method "'.$name.'" does not exists.'); } } } /** * @method void display() */ class D extends B { private $handler = null; public function __construct() { parent::construct(); $this->handler = new E(); } public function __call($name, $params) { if ( method_exists($this->handler, $name) ) { return call_user_func_array(array($this->handler, $name), $params); } else { throw new Exception('Method "'.$name.'" does not exists.'); } } } Class E { public function display() { echo "OK"; } } </code>
http://3v4l.org/ns6q7
<code><?php class A { public $name = 'a'; private $value = null; public function __construct() { $this->value = 1; } } class B { public $name = 'b'; private $differentValue = null; public function __construct() { $this->differentValue = 1; } } class CD { private $parent = null; public function __construct($parent) { $this->parent = new $parent; } public function __call($name, $params) { if ( is_callable(array($this->parent, $name)) ) { return call_user_func_array(array($this->parent, $name), $params); } else { throw new Exception('Method "'.$name.'" should be callable.'); } } public function __get($property_name){ if(isset($this->$property_name)) { return $this->$property_name; } elseif (isset($this->parent->$property_name)) { return $this->parent->$property_name; } else { return null; } } public function display() { echo "OK"; } } $c = new CD(new B); var_dump($c->name); </code>