ホームページ >バックエンド開発 >PHPチュートリアル >高度な PHP V5 オブジェクトの研究_PHP チュートリアル
高级PHP V5 对象研究
本文介绍了PHP V5一些更高级的面向设计的特性。其中包括各种对象类型,它们允许将系统中的组件相互分离,创建可重用、可扩展、可伸缩的代码。
领会暗示
首先介绍一下对象类型和类型提示的优点。一个类定义一种类型。从该类实例化的任何对象属于该类定义的类型。所以,使用 Car 类创建 Car 对象。如果 Car 类继承 Vehicle 超类,则 Car 对象还将是一个 Vehicle 对象。这反映了我们在现实世界中分类事物的方法。但正如您将看到的,类型不仅仅是分类系统元素的有用方法。类型是面向对象编程的基础,因为类型是良好一致的行为的保证。许多设计技巧来自该保证。
“开始了解 PHP V5 中的对象”展示对象为您保证了接口。当系统传递 Dictionary 对象时,您可以确定它具有 $translations 数组和 summarize() 方法。相反,关联数组不提供相同级别的确定性。要利用类提供的清晰接口,需要知道您的对象实际上是 Dictionary 的一个实例,而不是某个 imposter。可以用 instanceof 操作符来手动验证这一点,该操作符是 PHP V5 引入的介于对象实例和类名之间的一个便捷工具。
instanceof Dictionary
如果给定对象是给定类的实例,则 instanceof 操作符解析为真。在调用方法中第一次遇到 Dictionary 对象时,可以在使用它之前检查它的类型。
if ( $en instanceof Dictionary ) {
print $en->summarize();
}
但是,如果使用 PHP V5 的话,可以将对象类型检查构建到类或方法声明中。
在“开始了解 PHP V5 中的对象”中,重点介绍两个类:Dictionary,它存储术语和翻译, DictionaryIO,它将 Dictionary 数据导出(导入)自(至)文件系统。这些特性使得将 Dictionary 文件发送到第三方翻译器变得容易,第三方翻译器可以使用自己的软件来编辑数据。然后,您可以重新导入已处理的文件。清单 1 是 Dictionary 类的一个版本,它接受一个 DictionaryIO 对象,并将其存储以备将来使用。
清单 1. 接受 DictionaryIO 对象的 Dictionary 类的一个版本
class Dictionary {
public $translations = array();
public $type ="En";
public $dictio;
function addDictionaryIO( $dictio ) {
$this->dictio=$dictio;
}
function export() {
if ( $this->dictio ) {
$this->dictio->export( $this );
}
}
}
class DictionaryIO {
function export( $dict ) {
print "exporting dictionary data "."($dict->type)
";
}
}
$en = new Dictionary();
$en->addDictionaryIO( new DictionaryIO() );
$en->export();
// output:
// dumping dictionary data (En)
DictionaryIO 类具有单个方法 export(),它接受一个 Dictionary 对象,并使用它来输出假消息。现在,Dictionary 具有两个新方法:addDictionaryIO(),接受并存储 DictionaryIO 对象; export(),使用已提供的对象导出 Dictionary 数据 —— 或者是在完全实现的版本中。
您可能会疑惑为什么 Dictionary 对象不仅实例化自己的 DictionaryIO 对象,或者甚至在内部处理导入导出操作,而根本不求助于第二个对象。一个原因是您可能希望一个 DictionaryIO 对象使用多个 Dictionary 对象,或者希望存储该对象的单独引用。另一个原因是通过将 DictionaryIO 对象传递给 Dictionary,可以利用类切换或 多态性。换句话说,可以将 DictionaryIO 子类(比如 XmlDictionaryIO)的实例传递给 Dictionary,并更改运行时保存和检索数据的方法。
图 1 显示了 Dictionary 和 DictionaryIO 类及其使用关系。
示されているように、エンコーダーが完全にランダムなオブジェクトを addDictionaryIO() に渡すことを妨げるものは何もありません。 export() を実行するときにのみ同様のエラーが発生し、$dictio に既に格納されているオブジェクトに実際には export() メソッドがないことがわかります。 PHP V4 を使用する場合、この例のパラメーターの型をテストして、エンコーダーが正しい型のオブジェクトを渡しているかどうかを完全に確認する必要があります。 PHP V5 を使用する場合、パラメーター ヒントをデプロイしてオブジェクト タイプを強制できます。リスト 2 に示すように、必要なオブジェクト型のみをメソッド宣言のパラメーター変数に追加します。
リスト 2. メソッド宣言のパラメーター変数にオブジェクト型を追加しますfunction addDictionaryIO( DictionaryIO $dictio ) {
$this->dictio=$dictio;
}
if ( $this->dictio ) {
$this->dictio->export( $this );
}
}
addDictionaryIO() が正しいオブジェクト型を取得することは保証されていますが、そのメソッドが最初に呼び出されるという保証はありません。 export() メソッドは、export() メソッド内の $dictio 属性の存在をテストして、エラーを回避します。ただし、より厳密にして、DictionaryIO オブジェクトをコンストラクターに渡すことを要求して、$dictio が常に埋められるようにすることもできます。
オーバーライドメソッドを呼び出す
リスト 3 では、XmlDictionaryIO は DictionaryIO を統合しています。 DictionaryIO はシリアル化されたデータの書き込みと読み取りを行いますが、XmlDictionaryIO は XML 上で動作し、サードパーティ アプリケーションと共有できます。 XmlDictionaryIO は、その親メソッド (import() および export()) をオーバーライドすることも、独自の実装 (path()) を提供しないことを選択することもできます。クライアントが XmlDictionaryIO オブジェクトの path() メソッドを呼び出すと、DictionaryIO に実装された path() メソッドが呼び出されます。
実際には、両方の方法を同時に使用することもできます。メソッドをオーバーライドして親実装を呼び出すことができます。この目的のために、新しいキーワードparentを使用します。スコープ解決演算子と問題のメソッドの名前を指定してparentを使用します。たとえば、XmlDictionaryIO が現在の作業ディレクトリ内の xml というディレクトリを使用する必要があるとします (使用可能な場合)。それ以外の場合は、リスト 3 に示すように、親 DictionaryIO クラスによって生成されたデフォルトのパスを使用する必要があります。
リスト 3. xml ディレクトリまたは DictionaryIO クラスによって生成されたデフォルトのパスを使用した XmlDictionaryIO
クラス XmlDictionaryIO は DictionaryIO を拡張します {
関数 path(Dictionary $dictionary, $ext) {
$sep = DIRECTORY_SEPARATOR; if ( is_dir( ".{$sep}xml" ) ) {
return ".{$sep}xml{$sep}{$dictionary ->getType()}.$ext";
}
returnparent::path( $dictionary, $ext );
}
// ...
ご覧のとおり、このメソッドはローカルの xml ディレクトリをチェックします。テストが失敗した場合、そのテストは、parent キーワードを使用して親メソッドに割り当てられます。
3
サブクラスとコンストラクターメソッド
コンストラクターメソッドでは、parentキーワードが特に重要です。子クラスでコンストラクターを定義しない場合は、代わりに親コンストラクターが明示的に呼び出されます。サブクラスにコンストラクタメソッドが作成されていない場合。次に、リスト 4 に示すように、親クラスのコンストラクターを呼び出してパラメーターを渡すのはユーザーの責任です。
リスト 4. 親クラスのコンストラクターの呼び出し
class SpecialDictionary extends Dictionary {
function __construct( $type, DictionaryIO $dictio, $Additional ですが、これは最も適切なアプローチではない可能性があります。まず、サブクラスの作成者に頼って、壊れた状態でクラスを作成するには import() と export() を実装する必要があることを理解する必要があります。また、DictionaryIO クラスは実際には親子ではなく兄弟です。 XmlDictionaryIO は DictionaryIO の特殊なケースではなく、代替実装です。
PHP V5 では部分的に実装されたクラスの定義が可能で、その主な役割はその子のコアインターフェイスを指定することです。このようなクラスは抽象として宣言する必要があります。
abstract class DictionaryIO {}
抽象クラスはインスタンス化できません。サブクラス化 (つまり、それを継承するクラスの作成) し、そのサブクラスのインスタンスを作成する必要があります。リスト 5 に示すように、標準メソッドと抽象メソッドは抽象クラスで宣言できます。抽象メソッド
http://www.bkjia.com/PHPjc/532425.html
www.bkjia.com
本当