2011-06-25 142 views
3

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

比方说,我有一个类,做事情A(而且它是一个单身人士)。即使B类与A类并不真正相关,但是它使用了很多方法,可以将它扩展到另一个B类吗?或者我应该创建一个新班级?

+0

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

回答

0

例如,如果要通过这两个类访问私有变量,则应该使用扩展。 如果你能展示你的作品,我们可以告诉你你应该做什么/不应该做什么。

+0

这真的是很多代码:)基本上A类是网站的核心。它从数据库中获取文章(数据库有自己的类),并在屏幕上显示模板等。B类为边栏创建内容(类似于WordPress中的Widget) – Alex

+0

你是否认为你需要扩展A级B级? – genesis

+0

我不确定。但我认为从'B调用类的方法'''this-> do_stuff()'而不是'A :: getInstance() - > do_stuff()'看起来更好 – Alex

4

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

例子:class自行车扩展汽车

不好的例子:汽车类扩展自行车(可以共享类似的方法,但是这并没有真正意义)

2

确保您创建一个新的静态成员,用于存储单例实例并超载getInstance()方法。如果不是,那么即使您致电B::getinstance(),您也将最终访问A实例,因为这两个类都只有一个静态成员。

5

当谈到面向对象的编程时,通常一个类会执行特定的任务,如保存用户信息或输入/输出控制。

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

中,我们使用了过来,这是通过将一组任务的成团的类/对象,例如一个办法:

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

    public function _send(){} 
} 

输出类显然有更多的方法,但仅方法有关ouputting内容,如头部等,而不是内容的操作,那么你会碰到这样的:

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

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