Maison >développement back-end >tutoriel php >PHP好的方法书写不同名但方法相同的类。

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

WBOY
WBOYoriginal
2016-06-06 20:35:291004parcourir

比如说:

<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>
Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn