调用父类方法

Ali*_*xel 5 php oop overloading class

编辑问题以更好地反映我的需求.


请看以下示例:

class Base
{
    public $Text = null;

    public function __construct()
    {
        $this->Text = new Base_Text();
    }
}

class Base_Text extends Base
{
    public $Is = null;

    public function __construct()
    {
        $this->Is = new Base_Text_Is();
    }

    public function CammelCase($string)
    {
        return trim(str_replace(' ', '', ucwords($string)));
    }
}

class Base_Text_Is extends Base_Text
{
    public function CammelCase($string)
    {
        return ($string === $this->CammelCase($string)); // doesn't work
    }
}
Run Code Online (Sandbox Code Playgroud)

如何Base_Text_Is::CammelCase()不静态调用Base_Text类的情况下修复该方法(不使用parent::Base_Text::)?

我为这种情况提出的唯一解决方案是创建一个像这样的单例函数:

function Base()
{
    static $instance = null;

    if (is_null($instance) === true)
    {
        $instance = new Base();
    }

    return $instance;
}
Run Code Online (Sandbox Code Playgroud)

并将Base_Text_Is::CammelCase()方法更改为:

return ($string === Base()->Text->CammelCase($string));
Run Code Online (Sandbox Code Playgroud)

并且为了避免创建Base类的两个对象实例,而不是:

$base = new Base();
$base->Text->Is->CammelCase('MethodOverloading'); // true
Run Code Online (Sandbox Code Playgroud)

我只是做:

Base()->Text->Is->CammelCase('MethodOverloading'); // true
Run Code Online (Sandbox Code Playgroud)

这是一个好习惯吗?还有其他解决方案吗?

zom*_*bat 7

你问题的核心在于:

Son :: B()如何非静态地调用Dad :: A()方法(不使用父或爸爸)?

答案很简单,它不可以.你超越Dad::A()Son::A().A()Son对象现在唯一的概念就是它自己的概念A().您必须静态地调用父方法,或者在完全不同的Dad对象实例上调用父方法.

最重要的是,如果你想调用父A()方法,为什么还要先打扰它?

你的结构也没有任何意义.为什么你想要一个电话$dad->A()把它传递给$dad->son->A(),然后再拨打电话$dad->son->B(),然后再根据你的要求$dad->A()再次拨打电话?这是一个无限循环.

除了确保不实例化多个父对象之外,你的单例方法似乎没有提供任何真正的优势,但事实是你仍然在实例化一个完全独立的对象来执行听起来应该在里面的逻辑班级,而不是外面.

如果没有看到实际的逻辑和你想要完成的事情,很难知道应该推荐什么来避免这种循环依赖.但是,我想您可能想要分析您尝试使用这些方法做什么,并可能重新设计继承的工作方式.

编辑

我认为你的继承权已经太多了.你没有理由这样做:

$base = new Base();
$base->Text->Is->CammelCase('MethodOverloading'); // true
Run Code Online (Sandbox Code Playgroud)

如果所有功能都在子类中,则不应该实例化Base该类.它应该是这样的:

$text = new Text();
$text->isCamelCase('someString');
Run Code Online (Sandbox Code Playgroud)

您的代码可以大大简化,删除所有循环父/子实例化,并将特定功能下推到子类:

class Base
{
    //don't put anything related to child classes here,
    //unless it is going to provide specific functionality
}

class Text extends Base
{
    public function CamelCase($string)
    {
        return trim(str_replace(' ', '', ucwords($string)));
    }

    public function isCamelCase($string)
    {
        return ($string === $this->CamelCase($string));
    }
}
Run Code Online (Sandbox Code Playgroud)