我正在努力提高我对PHP中OOP的认识,并且一直在研究抽象类和接口。
我学到了什么
我认为这包括了基本知识。如果你认为我错过了什么,请再加一句。
我想知道的是,是否有实现这些类的真实示例,特别是接口类。有谁知道有什么开源应用程序使用它们,我可以浏览,以更好地理解它们,看看它们何时何地被有效使用?我遇到过一些使用动物的书籍例子,它们未能证明这些课程的重要性。
发布于 2011-01-13 10:19:55
这不是一个真实的例子,而是一个设计模式,您通常会遇到接口和抽象类,这就是指挥模式。例如,请参阅链接代码。
一般来说,“针对接口的编程”被认为是很好的OO实践,因为它解耦了具体的实现,并且让您更容易地将它们更改为其他实现,例如,而不是请求一个特定的类。
public function fn(ConcreteClass $obj)
{
$obj->doSomething()
}您只需问它提供了一组特定的方法
public function fn(MyInterface $obj)
{
$obj->doSomething()
}接口还有助于分解大型继承结构。因为PHP只支持单一继承,所以通常会看到如下层次结构:
BaseClass -> Logger -> Auth -> User其中每一个都包含在这些类中使用的特定方面。有了接口,你就可以
User implements Loggable, Authenticable然后通过策略模式或组合/聚合来包含特定的代码,这些代码最终更易于维护。
有关PHP中预定义接口的列表,请参阅我对以下内容的答复:
发布于 2011-01-13 10:18:20
PHP附带默认预定义的几个接口:http://www.php.net/manual/en/reserved.interfaces.php
PHP还包含标准PHP库(SPL),它定义了更多内容:
也是使用这些概念的一个很好的例子。http://framework.zend.com/
发布于 2011-01-13 10:25:48
final关键字防止类被其他类扩展,例如:
class Parent
{
}
class Mother extends Parent
{
}
final class Brother extends Mother /* - This class cannot be extended - */
{
}
class Pet extends Brother
{
}宠物类将抛出一个错误,声明:Fatal error: Class Pet may not inherit from final class (Brother)
这也适用于方法,因此,如果不希望继承方法,则导致子类具有相同的方法作为覆盖。
http://php.net/manual/en/language.oop5.final.php
Yo用过,你想要一些真实的例子来说明接口可以用来做什么,一个数据库抽象层。
您有一个基类,它提供了迭代数据库数据的基本方法,但是它将为数据库类型使用一个子类,例如MySql、MsSql等,每个数据库类型都有自己的类,但是对于基类,以确保它有这些方法--它们都将实现相同的接口。
示例
interface IDatabaseLayer
{
public function connect();
public function query();
public function sanitize();
//...
}因此,基类知道MySql和MsSql具有上述方法,从而减少了错误,并且更有组织。
当将对象传递给类时,您希望确保对象是特定类型的,PHP5允许您定义应该以params形式传递给方法的对象类型。
假设你有3门课
DatabaseCredentialsDatabaseConnectionDatabaseQuery您可以在DatabaseConnection的构造中明确定义需要如下所示的DatabaseCredentials类:
class DatabaseConnection implements Connectable
{
public function __construct(DatabaseCredentials $ConnectionDetails)
{
$this->Connect($ConnectionDetails->BuildDSN());
}
}一个真正开始的好方法是在这里阅读:
您可能希望查看的PHP5的另一个功能是名称空间,这将使您能够保持代码的组织,具有多个同名对象,使自动加载更加高效。
小例子:
namespace Database\MySql
{
class Database{}
}
namespace Database\MsSql
{
class Database{}
}你可以用这样的方法:
use Database;
$Database = new MySql\Database();https://stackoverflow.com/questions/4678889
复制相似问题