Php 如何创建一个;“真正可扩展”;班
我已经阅读了很多关于开发类的文章(我正在使用php),其中包含以下标记行: “可扩展、健壮、可维护和可扩展” 但作为一名初学者,我一直在创建用我的话来说“只是抽象”的类。这意味着我只是将一堆或重复的代码分离出来,并将它们放在一个类中,并提供访问常见任务的方法 问题是,我找不到使我的类可扩展的方法(我知道抽象类的概念,我甚至在使用它们,但只是定义我的其他类将遵循的方法)。问题是,我总是发现自己编辑核心类只是为了添加函数 关于使我的类可扩展有什么建议吗?(我已经在谷歌上搜索过了,所有弹出的内容都是关于抽象类、接口和OOP的解释,没有关于指针的讨论,也没有关于制作可扩展类的一些技巧)Php 如何创建一个;“真正可扩展”;班,php,oop,abstraction,Php,Oop,Abstraction,我已经阅读了很多关于开发类的文章(我正在使用php),其中包含以下标记行: “可扩展、健壮、可维护和可扩展” 但作为一名初学者,我一直在创建用我的话来说“只是抽象”的类。这意味着我只是将一堆或重复的代码分离出来,并将它们放在一个类中,并提供访问常见任务的方法 问题是,我找不到使我的类可扩展的方法(我知道抽象类的概念,我甚至在使用它们,但只是定义我的其他类将遵循的方法)。问题是,我总是发现自己编辑核心类只是为了添加函数 关于使我的类可扩展有什么建议吗?(我已经在谷歌上搜索过了,所有弹出的内容都是关
哦,顺便说一句,对我放松点,我9个月前就开始了“实际”的oop编程(我所在的大学让我学习oop理论,但他们让我们循序渐进地工作,因为它更快,而且符合该死的项目截止日期,这持续了4年,直到我毕业).您不需要编辑核心类来添加功能,您可以覆盖子类中的方法,例如:
class A {
public function filter_string($str){
return str_replace ('foo', 'bar', $str);
}
}
class B extends A {
public function filter_string($str){
return str_replace ('machin', 'chose', parent::filter_string ($str));
}
}
$a = new A;
echo $a->filter_string('foo machin'); // echoes 'bar machin'
$b = new B;
echo $b->filter_string('foo machin'); // echoes 'bar chose'
你应该看看这本书 正如您所发现的,创建可扩展类的问题是将系统分解为有用的和可重用的对象 这项任务很困难,因为有很多因素在起作用:封装、粒度、依赖性、灵活性、性能、演化、可重用性等等 您是在尝试对真实场景建模,还是在关注应用程序内部的通信/协作和依赖关系 这里有一个例子,我想这可以说明你在寻找什么。当然还有更多更好的例子: 我想开发一个缓存系统,为我的开发人员提供一个简单、规范化的API,无论他们在缓存什么/在哪里。在缓存系统中我想要什么(在基本级别)
- 我希望能够缓存某些内容(设置)
- 我希望能够检索到那个东西(get)
- 我希望能够使缓存无效(删除)
abstract class MyNs_Cache
{
abstract public function Set($key, $data, $ttl);
abstract public function Get($key);
abstract public function Delete($key, $ttl);
}
这是我的可扩展基类。然后我得到了三个缓存类MyNs\u Cache\u Fs
,MyNs\u Cache\u Apc
和MyNs\u Cache\u Memcache
class MyNs_Cache_Fs
{
...
public function Set($key, $data, $ttl)
{
// here I use fopen/fwrite/etc. to create the cached data
}
public function Get($key)
{
// here I retrieve the file from the filesystem (if it exists)
}
public function Delete($key) { ... }
}
这相当直截了当。它以文件系统的形式实现缓存。它没有提供任何超过我原来课程的东西
class MyNs_Cache_Apc
{
...
public function Set($key, $data, $ttl)
{
return apc_add($key, $data, $ttl); // NOT A FILESYSTEM CALL
}
public function Get($key) { ... } // you get the idea.
// This is specific to APC, so I add the functionality HERE
// NOT in my main Caching class.
public function PurgeCache()
{
return apc_clear_cache();
}
}
我的APC缓存在缓存系统(set/get/delete)中实现了我想要的所有功能,但它还提供了清除整个缓存的能力(这对于我的文件系统缓存来说是没有用的,使用memcached是不可能的)
现在我知道我总是可以得到一个缓存对象,只要使用$obj->get('some_key'),我就会得到一个结果
同样,我也可以访问特定于我当前尝试使用的功能
class MyNs_Cache_Memcache
{
// Memcached needs a pool of servers. APC and filesystem don't.
private $servers = array(..);
// It also uses a memcached object.
private $conn;
public function __construct()
{
$this->conn = new Memcached;
foreach ($this->$servers as $server)
$this->AddServer($server);
}
... // we do all the standard stuff using memcached methods
// We also want to be able to manage our connection pool
public function AddServer($server)
{
$this->conn->addServer(...);
}
// And in some cases, we use inc/dec from memcached
// APC doesn't have this, and it makes little sense in a filesystem
public function Increment($key) { ... }
}