在进行一个大网站开发时,我们会碰到这种情况(我们调用同样的方法名,但是想实现不同的效果。),为了解决这种情况可以使用抽象类来解决。
举个例子:在某个网站中涉及到缓存,首先一部分数据我想以缓存文件的形式保存到服务器上,而另一部分数据我只想是以key-value的形式保存到服务器上。
如果按平常的思路来解决问题:
1、定义生成缓存文件的类:
class FileCache(){ public function readCache(){ } } // 调用读取缓存文件的数据并得到结果 $read = new FileCache(); $read ->readCache();
2、定义缓存类
class MemCache(){ public function readCache(){ } } //调用读取缓存文件的数据并得到结果 $read = new MemCache(); $read ->readCache();
总结:我们在每次调用不同的方法时,都要对应的实例化相应类。
3、我们定义一个抽象类
abstract class Cache(){ private static $cacheArr; //利用反射进行类的实例化 static function creatCache($name){ $cacheClass = new ReflectionClass ($name ); self::$cacheArr[$name] = $cacheClass->newInstance(); return self::$cacheArr[$name]; } //定义抽象方法,没有实体 abstract function readCache($key, $group = null, $outTime = 0); class FileCache extends Cache(){ //方法实体 public function readCache(){ } } class MemCache extends Cache(){ //方法实体 public function readCache(){ } } //这样我们调用时 $name = 'File'; $cacheobj = Cache::creatCache($name); $cacheobj->readCache('userdata');
总结:这样会省略大部分的代码,提高了代码的重用性