欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

PHP好的方法书写不同名但方法相同的类。

程序员文章站 2022-05-04 17:52:31
...
比如说:
class A {
    private $value = null;
    public function __construct() {
        $this->value = 1;
    }
}

class B {
    private $differentValue = null;
    public function __construct() {
        $this->differentValue = 1;
    }
}

A和B的作用完全不同, 他们两个没有办法合并。

class C extends A {
    public function display() {
        echo "OK";
    }
}

class D extends B {
    public function display() {
        echo "OK";
    }
}

C和D的内容又完全相同, 这样的情况有没有什么好的方法把C和D的内容只写一遍?

因为要向下兼容5.3的, 所以trait不能用~~~

回复内容:

比如说:

class A {
    private $value = null;
    public function __construct() {
        $this->value = 1;
    }
}

class B {
    private $differentValue = null;
    public function __construct() {
        $this->differentValue = 1;
    }
}

A和B的作用完全不同, 他们两个没有办法合并。

class C extends A {
    public function display() {
        echo "OK";
    }
}

class D extends B {
    public function display() {
        echo "OK";
    }
}

C和D的内容又完全相同, 这样的情况有没有什么好的方法把C和D的内容只写一遍?

因为要向下兼容5.3的, 所以trait不能用~~~

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";
}
}

http://3v4l.org/ns6q7

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);
相关标签: php