PHP静态类的深入分析
感兴趣的小伙伴,下面一起跟随php教程的小玲来看看吧!
黑格尔有句名言:存在即合理。
这篇文章主要为大家详细介绍了PHP静态类的深入分析,具有一定的参考价值,可以用来参考一下。
感兴趣的小伙伴,下面一起跟随php教程的小玲来看看吧!
黑格尔有句名言:存在即合理。以此为论据的话,静态类的使用必然有其合理性。不过物极必反,一旦代码过于依赖静态类,其劣化的结局则不可避免。这就好比罂粟作为一种草本植物,有其在药理上的价值,但如果肆无忌惮的大量使用,它就变成了毒品。
什么是静态类
所谓静态类指的是无需实例化成对象,直接通过静态方式调用的类。代码如下:
代码如下:
<?php
/* php教程 www.512Pic.com */
class Math{ public static function ceil($value) { return ceil($value); }
public static function floor($value) { return floor($value); }}
?>
静态类的问题
本质上讲,静态类是面向过程的,因为通常它只是机械的把原本面向过程的代码集合到一起,虽然结果是以类的方式存在,但此时的类更像是一件皇帝的新衣,所以可以说静态类实际上是披着面向对象的壳儿,干着面向过程的事儿。
面向对象的设计原则之一:针对接口编程,而不是针对实现编程。这有什么不同?打个比方来说:抛开价格因素,你喜欢独立显卡的电脑还是集成显卡的电脑?我想绝大多数人会选择独立显卡。独立显卡可以看做是针对接口编程,而集成显卡就就可以看做是针对实现编程。如此说来针对实现编程的弊端就跃然纸上了:它丧失了变化的可能性。
下面杜撰一个文章管理系统的例子来具体说明一下:
代码如下:
<?php
/* php教程 www.512Pic.com */
class Article{ public function save() { ArticleDAO::save(); }}
?>
代码如下:
<?php
/* php教程 www.512Pic.com */
class Article{ private static $dao = 'ArticleDAO';
public static funciton setDao($dao) { self::$dao = $dao; }
public static function save() { $dao = self::$dao;
$dao::save(); }}
?>
代码如下:
<?php
/* php教程 www.512Pic.com */
Article::setDao('MockArticleDAO');
Article::save();
?>
补充说明,利用动态语言的特性,其实可以简单的通过require一个不同的类定义文件来实现Mock,但这样做同样有弊端,设想我们在脚本里需要多次变换实现方式,但实际上我们只有一次require的机会,否则就会出现重复定义的错误。
对象的价值
如果放弃静态类,转而使用对象,应该如何实现文章管理系统的例子?代码如下:
代码如下:
<?php
/* php教程 www.512Pic.com */
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(); }}
?>
代码如下:
<?php
/* php教程 www.512Pic.com */
$article = new Article(new MockArticleDAO());
$article->save();
?>
…
当然,静态类有好的一面,比如说很适合实现一些无状态的工具类,但多数时候,我的主观倾向很明确,多用对象,少用静态类,避免系统过早的固化。顺便说一句,希望别有人告诉我静态类比对象快之类的说教,谢谢。
注:关于PHP静态类的深入分析的内容就先介绍到这里,更多相关文章的可以留意