gpt4 book ai didi

php - 调用父类方法

转载 作者:可可西里 更新时间:2023-11-01 13:51:54 25 4
gpt4 key购买 nike

已编辑问题以更好地反射(reflect)我的需求。


举个例子:

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

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

对于这种情况,我想到的唯一解决方案是创建一个像这样的单例函数:

function Base()
{
static $instance = null;

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

return $instance;
}

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

return ($string === Base()->Text->CammelCase($string));

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

$base = new Base();
$base->Text->Is->CammelCase('MethodOverloading'); // true

我只是这样做:

Base()->Text->Is->CammelCase('MethodOverloading'); // true

这是一个好的做法吗?还有其他解决方案吗?

最佳答案

你的问题的核心在于:

How can Son::B() call the Dad::A() method non-statically (without using parent or Dad)?

答案很简单,不能。你用 Son::A() 覆盖了 Dad::A()。 Son 对象现在拥有的唯一 A() 概念是它自己的 A()。您将不得不静态调用父方法,或者在完全不同的 Dad 对象实例上调用。

底线是,如果你想调用父 A() 方法,你为什么要首先覆盖它?

您的结构也没有任何意义。为什么要将对 $dad->A() 的调用传递给 $dad->son->A(),后者又会调用 $dad->son->B(),然后根据您的要求再次调用 $dad->A()?这是一个无限循环。

除了确保不实例化多个 dad 对象之外,您的单例方法似乎没有提供任何真正的优势,但事实是您仍在实例化一个完全独立的对象来执行听起来像这样的逻辑应该在类内而不是类外。

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

编辑

我认为您继承的东西太多了。您没有理由这样做:

$base = new Base();
$base->Text->Is->CammelCase('MethodOverloading'); // true

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

$text = new Text();
$text->isCamelCase('someString');

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

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

关于php - 调用父类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2032270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com