PHP(OOP):如何在每个方法中调用一个新方法

时间:2015-02-17 09:49:00

标签: php oop

我们说我有一个班级

<?php

class MyClass extends OtherClass
{
    public function foo()
    {
    // some stuff
    }
    public function bar()
    {
    // some stuff
    }
    public function baz()
    {
    // some stuff
    }
}

现在我需要添加另一个方法,需要从其他所有方法调用。

private function run_this()
{
$mandatary = true;
return $mandatary;
}

我可以在每个方法中添加一个简单的$this->run_this(),好的,但是可以添加一些&#34;魔法&#34;收件人从此类的每个方法调用run_this()

3 个答案:

答案 0 :(得分:2)

我仍然认为你正在做某事,因为你在某个地方有设计问题(XY problem),但是如果你坚持做你所要求的,你可以装饰这个课:

class OtherClass {}

class MyClass extends OtherClass
{
    public function foo()
    {
    // some stuff
    }
    public function bar()
    {
    // some stuff
    }
    public function baz()
    {
    // some stuff
    }

    public function run_this()
    {
        $mandatary = true;
        return $mandatary;
    }
}

class MyClassDecorator
{
    private $myClass;

    public function __construct($myClass)
    {
        $this->myClass = $myClass;
    }

    public function __call($name, array $arguments)
    {
        // run the mthod on every call
        $this->myClass->run_this();

        // run the actual method we called
        call_user_func_array ([$this->myClass, $name], $arguments)
    }
}

$myClass   = new MyClass();
$decorator = new MyClassDecorator($myClass);

// will first run the `run_this` method and afterwards foo
$decorator->foo();
// etc
//$decorator->bar();

这有点难以辨别,上述作品就像你问的那样,但如前所述,这很可能不是你真正想做的事情。

答案 1 :(得分:-1)

你能否使用构造函数?

<?php

class MyClass extends OtherClass
{
    function __construct() {
       $mandatory = $this->run_this();
    }
    private function run_this()
    {
        $mandatary = true;
        return $mandatary;
    }
    public function foo()
    {
    // some stuff
        if ($this->mandatory) {
            //true
        } else {
            //false 
        }
    }
    public function bar()
    {
    // some stuff
    }
    public function baz()
    {
    // some stuff
    }
}

这是一些变化。

答案 2 :(得分:-2)

不完全确定你想要什么,但如果你想让它可用于所有子对象,我会将它作为受保护的函数放在其他类中。这样只有子对象才能访问它。

class OtherClass {
protected function run_this()
    {
    $mandatary = true;
    return $mandatary;
    }
}

class MyClass extends OtherClass
{
    public function foo()
    {
    $mandatory = $this->run_this();
    // some stuff
    }
    public function bar()
    {
    $mandatory = $this->run_this();
    // some stuff
    }
    public function baz()
    {
    $mandatory = $this->run_this();
    // some stuff
    }
}