扩展PHP类

3

我还在学习如何使用类,想知道何时应该使用extends关键字(扩展一个类)。

假设我有一个执行A操作的类(它是单例)。如果将其扩展到执行B操作的另一个类中,即使B类与A类没有真正的关联,但它使用了许多A类的方法,这样做是否可以?或者我应该创建一个新的类?


你能解释一下在什么情况下需要扩展单例类吗?也许还有其他的设计方法... 你听说过依赖注入模式吗? - Frederic Bazin
4个回答

5

在面向对象编程中,一个类通常执行特定的任务,比如保存用户信息或者控制输入/输出。

当你有一个用于控制输出的对象时,你可以在该对象中设置一个方法来控制输出类型,或者处理每个特定内容的方式,但这意味着该对象的唯一目的已经被打破,因为它现在不仅发送内容,而且还根据其类型操纵内容。

我们使用的一种方法是将一组任务分组到一组类/对象中,例如:

abstract class Output
{
    public $content_type = 'text/plain';

    public function _send(){}
}

输出类显然会有更多的方法,但只涉及输出内容的方法,例如标题等,而不是内容的操作,那么你会得到以下内容:

class HTMLOutput extends Output
{
     public $content_type = 'text/html';
}

并且用于内容的操纵:

class CSSOutput extends Output
{
    public $content_type = 'text/css';

    public _send()
    {
         if($_SERVER['APP']['Settings']['CSSCompress'] == '1')
         {
             $this->_compress_css();
         }

         parent::_send();
    }

    private function _compress_css()
    {
         $this->content = ; //Some compression lib
    }
}

这是我在创建和组织许多分组类/对象时遵循的主要架构要点。

4

在面向对象编程中,如果一个类是特定类型的另一个类,并且具有更具体的用途,则该类通常应该扩展另一个类。

例如:class Bike extends Automobile

不好的例子:class Car extends Bike(可能共享类似的方法,但这并没有什么意义)


2

请确保为存储单例实例创建新的静态成员并重载getInstance()方法。否则,即使您调用B::getinstance(),也会访问A实例,因为两个类只有一个静态成员。


0

如果你想让两个类都能够访问私有变量,那么应该使用继承。如果你能展示你的工作,我们就可以告诉你应该做什么或不应该做什么。


基本上,A类是网站的核心。它从数据库获取文章(数据库有自己的类),并将模板显示到屏幕上等。B类为侧栏创建内容(类似于WordPress中的小部件)。 - Alex
你个人认为是否需要通过类B扩展类A? - genesis
我不确定,但我认为像 $this->do_stuff() 这样从 B 调用 A 类方法,而不是 A::getInstance()->do_stuff() 更加美观。 - Alex
在PHP(以及大多数其他面向对象的语言)中,“private”成员只能被实现它们的类访问。通常它们之所以是“private”,是有原因的。这被称为封装,请去了解一下。 - antichris

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