PHP扩展类

5

我有一个关于在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??
    }

}

这对我来说似乎不太符合DRY原则...

是的,你必须这样做,但你可以编写一个解决方法,将大函数拆分为单独的函数,并仅覆盖那些函数。 - Johannes Klauß
确实。采用模块化面向对象设计,这将不会是一个(非常严重的)问题。 - TaZ
3
@JohannesKlauß 不行。不行。不行。不行。 你100% 错误 - user895378
@JohannesKlauß 不,你肯定是。看看下面的答案。你只需在子类中调用 parent::methodName() 即可访问父类功能。 - user895378
1
当然,但这并不能解决问题。因为如果他想要覆盖一个对返回变量执行某些数学运算的内部算法呢?在这种情况下,parent::methodName()是无济于事的。 - Johannes Klauß
显示剩余3条评论
6个回答

5

是的,除非这1或2个东西刚好在开头或结尾。您可以通过以下方式调用父函数

parent::WithWayTooMuchCode();

你可以将其放置在子/重写方法中的任何位置。

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


你的意思是将BaseClass拆分成更小的方法还是将MyOwnClass拆分成更小的方法?无论哪种方式,你能否给我指出一个代码示例(我一直在寻找但没有找到)。非常感谢! - redconservatory
1
@redconservatory:都不是。你需要将 WithWayTooMuchCode 拆分成更小的方法;如果大部分代码在基类中,那么也将辅助方法添加到基类中。如果您不需要它们在基类中,请将它们放在派生类中。将它们尽可能“靠近”需要它们的地方。如果您不需要它们公开访问,还可以考虑将它们设置为私有。我无法向您指出示例...您所做的就是将一个大函数拆分成多个小函数。 - mpen

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

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

}

1

您可以为想要在父类中分别执行的事情编写单独的函数,然后按照您的方式调用它们。

换句话说,将需要分别执行的事情分离出来,并为它们创建一个函数。然后在子类中分别调用它们。子类中的最终函数将调用父类函数以及这些单独的函数。


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行代码"和新代码。您可以在新代码之前/之后/期间放置父级,以便根据需要进行定制。


0
除了其他答案外,我应该指出这个问题可以通过事件来解决。它们是一种确定类中可以从外部添加自己的功能点的方式。如果您掌握代码库和时间/倾向,您可能想考虑实现此功能。不幸的是,PHP并没有像C#那样直接支持它们,所以你必须做工作
如果您只在一个地方遇到此问题,我认为您不需要担心,但如果这成为一种模式,您可能需要考虑这种方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接