从另一个类调用时限制类的方法

时间:2012-08-08 17:41:37

标签: php class

abstract class User
{
  protected $content; // $content object will be assigned here


}

class Member extends User
{

}


abstract class Content
{
 function create()
 {
  //create some content
 }
}

class Text extends Content
{

}

class Image extends Content
{
}

Abstract User可以基于可自定义的卷扩展到其他类。每个卷具有使用Content类的不同权限,以及它的子类方法。我可以手动编写每个方法的每个权限,但我想动态地这样做。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

<强>更新

在第二次阅读你的问题时,我只想到了另一种更适合你需要的方式。虽然php不支持多重继承,并且traits需要php&gt; = 5.4,但您可能需要考虑添加第二个“generation”(另一个级别的子级)。抽象类仅包含所有可用的方法,最好使用final关键字,或者在某个地方只有1个变体(在这种情况下,删除final关键字并覆盖成员函数)。

正如我之前所说的那样,我在解释这些内容方面并不是那么好,所以我继续提出一个关于你的课程看起来如何的例子:

abstract class User
{
    public function __construct()
    {
        echo get_class($this).'<br/>';
    }
    final function forAll()
    {
        echo 'access for all';
    }
}
class TxtGroup extends User
{
    public function __construct()
    {
        parent::__construct();
    }
    public function abstr()
    {
        echo 'TxtGroup specific';
    }
}
class ImgGroup extends User
{
    public function __construct()
    {
        echo 'Same, but different for ImgGroup<br/>';
        parent::__construct();
    }
    public function abstr()
    {
        echo 'ImgGroup specific';
    }
}
class inst1 extends TxtGroup
{
    public function __construct()
    {
        parent::__construct();
        if ($this instanceof TxtGroup)
        {
            echo 'Child member of: TxtGroup<br/>';
        }
        if ($this instanceof inst1)
        {
            echo 'Child instance of inst1 (itself)<br/>';
        }
        if ($this instanceof User)
        {
            echo 'grand-Child of User<br/>';
        }
    }
    public function objSpecific()
    {
        echo 'self explanatory<br/>';
    }
}
class inst2 extends ImgGroup
{
    public function __construct()
    {
        parent::__construct();
        if ($this instanceof ImgGroup)
        {
            echo 'Child member of: ImgGroup<br/>';
        }
        if ($this instanceof inst2)
        {
            echo 'Child insance of inst2 (itself)<br/>';
        }
        if ($this instanceof User)
        {
            echo 'grand-Child of User<br/>';
        }
    }
}
$foo = new inst1();
$bar = new inst2();

明白我的意思?输出:

  

INST1
  子成员:TxtGroup
  inst1的子实例(本身)
  用户的孙子   ImgGroup相同但不同   INST2
  儿童成员:ImgGroup
  inst1的儿童意图(本身)
  用户的孙子


如果您使用的是最新版本的PHP,那么您就具备了这些特性。有很多方法可以检查哪个类正在调用memberfunction。最简单的IMO是通过检查get_class($this);

的值来启动方法
abstract class Foo
{
    public function who()
    {
        echo get_class($this);
    }
}
class bar extends Foo
{
    public function __construct()
    {
        $this->who();
    }
}
$f = new bar();

echo的bar,因此您可以更改抽象方法,并在必要时抛出异常。

可以使用相同的构造来重载某些方法,例如这个(可怕的)示例(试图显示/)显示:

abstract class Foo
{
    public function who()
    {
        $child =  explode('_',get_class($this));
        if (end($child) === 'whoExec')
        {
            return $this->whoExec();
        }
        echo 'this isn\'t for bar the bar instance';
        return $this;
    }
    private function whoExec()
    {
        if(!strstr('whoExec',get_class($this)))
        {
            return $this->who();
        }
        echo 'This methods mimics overloading -sort of';
        return $this;
    }
}
class bar_whoExec extends Foo
{
    public function __construct()
    {
        $this->who();
    }
}
$f = new bar();