PHP中静态类的原理是什么-创新互联

PHP中静态类的原理是什么?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

创新互联建站主要从事成都做网站、成都网站制作、网页设计、企业做网站、公司建网站等业务。立足成都服务汉台,十多年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:13518219792

什么是静态类


所谓静态类指的是无需实例化成对象,直接通过静态方式调用的类。代码如下:


复制代码 代码如下:


class Math
{
    public static function ceil($value)
    {
        return ceil($value);
    }

    public static function floor($value)
    {
        return floor($value);
    }
}

?>

此时类所扮演的角色更像是命名空间,这或许是很多人喜欢使用静态类最直接的原因。

静态类的问题

本质上讲,静态类是面向过程的,因为通常它只是机械的把原本面向过程的代码集合到一起,虽然结果是以类的方式存在,但此时的类更像是一件皇帝的新衣,所以可以说静态类实际上是披着面向对象的壳儿,干着面向过程的事儿。

面向对象的设计原则之一:针对接口编程,而不是针对实现编程。这有什么不同?打个比方来说:抛开价格因素,你喜欢独立显卡的电脑还是集成显卡的电脑?我想绝大多数人会选择独立显卡。独立显卡可以看做是针对接口编程,而集成显卡就就可以看做是针对实现编程。如此说来针对实现编程的弊端就跃然纸上了:它丧失了变化的可能性。

下面杜撰一个文章管理系统的例子来具体说明一下:


复制代码 代码如下:


class Article
{
    public function save()
    {
        ArticleDAO::save();
    }
}

?>

Article实现必要的领域逻辑,然后把数据持久化交给ArticleDAO去做,而ArticleDAO是一个静态类,就好像焊在主板上的集成显卡一样难以改变,假设我们为了测试代码可能需要Mock掉ArticleDAO的实现,但因为调用时使用的是静态类的名字,等同于已经绑定了具体的实现方式,Mock几乎不可能,当然,实际上有一些方法可以实现:


复制代码 代码如下:


class Article
{
    private static $dao = 'ArticleDAO';

    public static funciton setDao($dao)
    {
        self::$dao = $dao;
    }

    public static function save()
    {
        $dao = self::$dao;

        $dao::save();
    }
}

?>

有了变量的介入,可以在运行时设定具体使用哪个静态类:


复制代码 代码如下:


Article::setDao('MockArticleDAO');

Article::save();

?>

虽然这样的实现方式看似解决了Mock的问题,但是首先它修改的原有的代码,违反了开闭原则,其次它引入了静态变量,而静态变量是共享的状态,有可能会干扰其它代码的执行,所以并不是一个完美的解决方案。

补充说明,利用动态语言的特性,其实可以简单的通过require一个不同的类定义文件来实现Mock,但这样做同样有弊端,设想我们在脚本里需要多次变换实现方式,但实际上我们只有一次require的机会,否则就会出现重复定义的错误。


对象的价值

如果放弃静态类,转而使用对象,应该如何实现文章管理系统的例子?代码如下:


复制代码 代码如下:


class Article
{
    private $dao;

    public function __construct($dao = null)
    {
        if ($dao === null) {
            $dao = new ArticleDAO();
        }

        $this->setDao($dao);
    }

    public function setDao($dao)
    {
        $this->dao = $dao;
    }

    public function save()
    {
        $this->dao->save();
    }
}

?>

实际上,这里用到了人们常说的依赖注入技术,通过构造器或者Setter注入依赖的对象:


复制代码 代码如下:


$article = new Article(new MockArticleDAO());

$article->save();

?>



看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注创新互联行业资讯频道,感谢您对创新互联网站建设公司,的支持。


分享题目:PHP中静态类的原理是什么-创新互联
本文地址:http://ybzwz.com/article/dhhehj.html