4

我有一个关于在 PHP 中扩展类的问题。

我在 php 网站上看到的示例在方法中只有 1 行代码...如果该方法有大量代码,是否相同?

如果这是基类:

class BaseClass {

    public function WithWayTooMuchCode {
      // like 100 lines of code here
    }

}

如果我想使用相同的方法,我是否必须复制所有代码,但只更改 1 或 2 件事?

class MyOwnClass extends BaseClass {
     public function WithWayTooMuchCode {
      // like 100 lines of code here

     // do I have to copy all of the other code and then add my code??
    }

}

这对我来说似乎有点不干燥......

4

6 回答 6

4

是的,除非这 1 或 2 件事恰好在开头或结尾。您可以通过调用父函数

parent::WithWayTooMuchCode();

您可以将其放置在子/覆盖方法中的任何位置。

如果感觉不 DRY,请考虑将函数拆分为更小的方法。

于 2012-05-11T15:20:30.373 回答
4

如果我想使用相同的方法,我是否必须复制所有代码,但只更改 1 或 2 件事?

不,您不必复制所有代码,假设您要添加到函数中而不是删除它的一部分。

所以它如下:

class BaseClass {

    public function WithWayTooMuchCode {
      // like 100 lines of code here
    }

}

class MyOwnClass extends BaseClass {

    public function WithWayTooMuchCode { 
        parent::WithWayTooMuchCode();
        //additionally, do something else
    }

}

$moc = new MyOwnClass();
$moc->WithWayTooMuchCode();
于 2012-05-11T15:20:44.410 回答
2

您可以使用 parent::WithWayTooMuchCode() 来执行父方法,然后您可以添加代码。它看起来像这样:

class MyOwnClass extends BaseClass {
     public function WithWayTooMuchCode {
      parent::WithWayTooMuchCode()

     // do I have to copy all of the other code and then add my code??
    }

}
于 2012-05-11T15:24:50.430 回答
1

您可以为要在父类中单独执行的操作编写一个单独的函数,然后以您的方式调用。

换句话说,把你需要做的事情分开,然后为它们创建一个函数。并在子类中分别调用它们。子类中的最终函数将调用父类函数以及那些单独的函数。

于 2012-05-11T15:25:44.097 回答
1

你有几个选择。假设;

class BaseClass {

    public function WithWayTooMuchCode {
      // like 100 lines of code here
       }
    }

你可以做

class MyOwnClass extends BaseClass {
     public function AnotherFunction() {
         // put other code here
    }

}

这允许您执行 MyOwnClass->AnotherFunction() 和 MyOwnClass->WithWayTooMuchCode()

或者你可以做

class MyOwnClass extends BaseClass {
     public function WithWayTooMuchCode() {
         // put new code here
    }

}

这将允许您运行 MyOwnClass->WithWayTooMuchCode() 并且只会运行“新代码”,而不是“100 行”。

最后你可以做

class MyOwnClass extends BaseClass {
     public function WithWayTooMuchCode() {
         parent::WithWayTooMuchCode();
         // Do more processing
    }

}

这将允许您运行 MyOwnClass->WithWayTooMuchCode() 将运行“100 行代码”和新代码。您可以在新代码之前/之后/期间放置父级,以便您可以根据需要对其进行调整

于 2012-05-11T15:27:47.350 回答
0

除了其他答案之外,我应该指出,这个问题可以通过事件来解决。它们是一种确定类中点的方法,您可以从外部添加自己的功能。如果您可以控制代码库和时间/倾向,您可能需要考虑实现此功能。不幸的是,PHP 并不像 C# 那样直接支持它们,所以您必须自己动手

如果您只在一个地方遇到此问题,我怀疑您是否应该打扰,但如果它正在成为一种模式,您可能需要考虑这种方法。

于 2012-05-11T15:30:50.953 回答