第十八章 面向对象的特性
学习要点:
1.OOP 的封装
2.OOP 的继承
3.OOP 的多态
面向对象的三个主要特性是封装、继承和多态。
一.OOP的封装
隐藏对象的字段和实现细节,仅对外公开接口,控制在程序中字段的读和修改的访问级
别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与
操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。
字段的作用域
1.public 公共的(类外可以访问)
2.private 私有的(类内可以访问)
3.protected 受保护的(类内和子类可以访问,类外不可访问)
创建使用了私有的字段,这样外部就无法访问了
<span>class</span><span> Computer { </span><span>//</span><span>类的字段(成员)</span> <span>private</span> <span>$_name</span> = '联想120'<span>; </span><span>private</span> <span>$_model</span> = 'LX'<span>; }</span>
通过一个公共方法作为入口,访问私有字段,而必须使用$this关键字。
<span>class</span><span> Computer { </span><span>//</span><span>类的字段(成员)</span> <span>private</span> <span>$_name</span> = '联想120'<span>; </span><span>private</span> <span>$_model</span> = 'LX'<span>; </span><span>//</span><span>通过公共方法来访问私有字段</span> <span>function</span><span> run() { </span><span>echo</span> <span>$this</span>-><span>_name; } } </span><span>$computer</span>->run ();
属性操作(私有字段的赋值与取值)
可以设计两个公共方法,一个方法为setName(),用于赋值;一个方法为getName(),
用于取值。
<span>class</span><span> Computer { </span><span>//</span><span>类的字段(成员)</span> <span>private</span> <span>$_name</span><span>; </span><span>private</span> <span>$_model</span><span>; </span><span>//</span><span>赋值</span> <span>function</span> setName(<span>$_name</span><span>) { </span><span>$this</span>->_name = <span>$_name</span><span>; } </span><span>//</span><span>取值</span> <span>function</span><span> getName() { </span><span>return</span> <span>$this</span>-><span>_name; } } </span><span>$computer</span> = <span>new</span><span> Computer (); </span><span>$computer</span>->setName ( 'IBM'<span> ); </span><span>echo</span> <span>$computer</span>->getName ();
如果有十个字段那么就必须要二十个方法才能够赋值和取值,那么有没有更简便的方法
呢?PHP内置两个方法(拦截器)专门用于取值与赋值:__set(),__get()。
<span>class</span><span> Computer { </span><span>//</span><span>类的字段(成员)</span> <span>private</span> <span>$_name</span><span>; </span><span>private</span> <span>$_model</span><span>; </span><span>//</span><span>所有字段的赋值都在这里进行</span> <span>function</span> __set(<span>$_key</span>, <span>$_value</span><span>) { </span><span>$this</span>-><span>$_key</span> = <span>$_value</span><span>; } </span><span>//</span><span>所有字段的取值都在这里进行</span> <span>function</span> __get(<span>$_key</span><span>) { </span><span>return</span> <span>$this</span>-><span>$_key</span><span>; } } </span><span>$computer</span> = <span>new</span><span> Computer (); </span><span>$computer</span>->_model = 'LX'<span>; </span><span>echo</span> <span>$computer</span>->_model;
方法私有:有些使用类里面的方法并不需要对外公开,只是里面运作的一部分,这个时
候可以将方法也封装起来。
<span>class</span><span> Computer { </span><span>//</span><span>类的字段(成员)</span> <span>private</span> <span>$_name</span><span>; </span><span>private</span> <span>$_model</span><span>; </span><span>//</span><span>私有方法</span> <span>private</span> <span>function</span><span> getEcho() { </span><span>echo</span> '我是私有化的方法'<span>; } </span><span>//</span><span>公共方法一般是对外的入口</span> <span>public</span> <span>function</span><span> run() { </span><span>$this</span>-><span>getEcho (); } } </span><span>$computer</span> = <span>new</span><span> Computer (); </span><span>$computer</span>->run ();
建议:方法前面如果没有修饰符,那么就是外部可访问的公共方法,但为了让程序更加
的清晰,建议在前面加上public。
常量(constant)
在类中可以定义常量,用来表示不会改变的值。对于从该类实例化的任何对象来说,常
量值在这些对象的整个生命周期中都保持不变。
<span>class</span><span> Computer { </span><span>const</span> <span>PI</span> = 3.1415926<span>; } </span><span>echo</span> Computer::<span>PI</span>;
静态类成员
有时候,可能需要创建供所有类实例共享的字段和方法,这些字段和方法与所有的类实
例有关,但不能由任何特定对象调用。
<span>class</span><span> Computer { </span><span>public</span> <span>static</span> <span>$_count</span> = 0<span>; } </span><span>echo</span> Computer::<span>$_count</span>;
一般来说,必须将字段做成私有化。所以可能需要这么做:
<span>class</span><span> Computer { </span><span>private</span> <span>static</span> <span>$_count</span> = 0<span>; </span><span>public</span> <span>static</span> <span>function</span><span> setRun() { self</span>::<span>$_count</span> ++<span>; } </span><span>public</span> <span>static</span> <span>function</span><span> getRun() { </span><span>return</span> self::<span>$_count</span><span>; } } Computer</span>::<span>setRun (); </span><span>echo</span> Computer::getRun ();
Instanceof关键字
PHP5有一个instanceof关键字,使用这个关键字可以确定一个对象是类的实例、类的
子类,还是实现了某个特定接口,并进行相应的操作。
<span>class</span><span> Computer { } </span><span>$computer</span> = <span>new</span><span> Computer (); </span><span>echo</span> (<span>$computer</span> instanceof Computer);
二.OOP继承
继承是从一个基类得到一个或多个类的机制。
继承自另一个类的类被称为该类的子类。这种关系通常用父类和孩子来比喻。子类将继
承父类的特性。这些特性由属性和方法组成。子类可以增加父类之外的新功能,因此子类也
被称为父类的“扩展”。
在PHP中,类继承通过extends关键字实现。继承自其他类的类成为子类或派生类,子
类所继承的类成为父类或基类。(PHP只支持单继承,PHP不支持方法重载)。
<span>class</span><span> Computer { </span><span>private</span> <span>$_name</span> = '联想120'<span>; </span><span>private</span> <span>function</span> __get(<span>$_key</span><span>) { </span><span>return</span> <span>$this</span>-><span>$_key</span><span>; } </span><span>public</span> <span>function</span><span> run() { </span><span>echo</span> '我是父类'<span>; } } </span><span>class</span> NoteBookComputer <span>extends</span><span> Computer { } </span><span>$notebookcomputer</span> = <span>new</span><span> NoteBookComputer (); </span><span>$notebookcomputer</span>-><span>run (); </span><span>echo</span> <span>$notebookcomputer</span>->_name;
字段和方法的重写(覆盖)
有些时候,并不是特别需要父类的字段和方法,那么可以通过子类的重写来修改父类的
字段和方法。
<span>class</span><span> Computer { </span><span>public</span> <span>$_name</span> = '联想120'<span>; </span><span>protected</span> <span>function</span><span> run() { </span><span>echo</span> '我是父类'<span>; } } </span><span>class</span> NoteBookComputer <span>extends</span><span> Computer { </span><span>public</span> <span>$_name</span> = 'IBM'<span>; </span><span>public</span> <span>function</span><span> run() { </span><span>echo</span> '我是子类'<span>; } }</span>
子类调用父类的字段或方法
为了安全,我们一般将父类的方法封装了起来,这样,外部就无法调用,只能被继承它
的子类所看到。这个时候,就需要通过子类操作来调用父类了。
<span>class</span><span> Computer { </span><span>protected</span> <span>$_name</span> = '联想120'<span>; </span><span>protected</span> <span>function</span><span> run() { </span><span>echo</span> '我是父类'<span>; } } </span><span>class</span> NoteBookComputer <span>extends</span><span> Computer { </span><span>public</span> <span>function</span><span> getName() { </span><span>echo</span> <span>$this</span>-><span>_name; } </span><span>public</span> <span>function</span><span> getRun() { </span><span>echo</span> <span>$this</span>-><span>run (); } }</span>
通过重写调用父类的方法
有的时候,我们需要通过重写的方法里能够调用父类的方法内容,这个时候就必须使用
语法:父类名::方法() 或者parent::方法()即可调用。
<span>class</span><span> Computer { </span><span>protected</span> <span>function</span><span> run() { </span><span>echo</span> '我是父类'<span>; } } </span><span>class</span> NoteBookComputer <span>extends</span><span> Computer { </span><span>public</span> <span>function</span><span> run() { </span><span>echo</span> Computer::<span>run (); } }</span>
final关键字可以防止类被继承,有些时候只想做个独立的类,不想被其他类继承使用,
那么就必须使用这个关键字。建议只要是单独的类,都加上这个关键字。
<span>final</span> <span>class</span><span> Computer { </span><span>//</span><span>无法继承的类</span> <span>final</span> <span>public</span> <span>function</span><span> run() { } </span><span>//</span><span>无法被继承的方法</span> <span>} </span><span>class</span> NoteBookComputer <span>extends</span><span> Computer { </span><span>//</span><span>会报错</span> }
抽象类和方法(abstract)
抽象方法很特殊,只在父类中声明,但在子类中实现。只有声明为abstract的类可以声
明抽象方法。
规则:
1.抽象类不能被实例化,只能被继承。
2.抽象方法必须被子类方法重写。
<span>abstract</span> <span>class</span><span> Computer { </span><span>abstract</span> <span>function</span><span> run(); } </span><span>final</span> <span>class</span> NotebookComputer <span>extends</span><span> Computer { </span><span>public</span> <span>function</span><span> run() { </span><span>echo</span> '我实现了'<span>; } }</span>
接口(interface)
接口定义了实现某种服务的一般规范,声明了所需的函数和常量,但不指定如何实现。
之所以不给出实现的细节,是因为不同的实体可能需要用不同的方式来实现公共的方法定
义。关键是要建立必须实现的一组一般原则,只要满足了这些原则才能说实现了这个接口。
规则:
1.类全部为抽象方法(不需要声明abstract)
2.接口抽象方法必须是public
3.成员(字段)必须是常量
<span>interface</span><span> Computer { </span><span>const</span> NAME = '联想120'<span>; </span><span>public</span> <span>function</span><span> run(); } </span><span>final</span> <span>class</span> NotebookComputer <span>implements</span><span> Computer { </span><span>public</span> <span>function</span><span> run() { </span><span>echo</span> '实现了接口的方法'<span>; } } </span><span>$notebookcomputer</span> = <span>new</span><span> NoteBookComputer (); </span><span>$notebookcomputer</span>-><span>run (); </span><span>echo</span> Computer::NAME;
子类可以实现多个接口
<span>interface</span><span> Computer { </span><span>const</span> NAME = '联想120'<span>; </span><span>public</span> <span>function</span><span> run(); } </span><span>interface</span><span> Notebook { </span><span>public</span> <span>function</span><span> book(); } </span><span>final</span> <span>class</span> NotebookComputer <span>implements</span> Computer,<span> Notebook { </span><span>public</span> <span>function</span><span> run() { </span><span>echo</span> '实现了接口的方法'<span>; } </span><span>public</span> <span>function</span><span> book() { </span><span>echo</span> '实现了接口的方法'<span>; } }</span>
三.多态
多态是指OOP 能够根据使用类的上下文来重新定义或改变类的性质或行为,或者说接
口的多种不同的实现方式即为多态。把不同的子类对象都当作父类来看,可以屏蔽不同子类
对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。
<span>interface</span><span> Computer { </span><span>public</span> <span>function</span><span> version(); </span><span>public</span> <span>function</span><span> work(); } </span><span>class</span> NotebookComputer <span>implements</span><span> Computer { </span><span>public</span> <span>function</span><span> version() { </span><span>echo</span> '联想120'<span>; } </span><span>public</span> <span>function</span><span> work() { </span><span>echo</span> '笔记本正在随时携带运行!'<span>; } } </span><span>class</span> desktopComputer <span>implements</span><span> Computer { </span><span>public</span> <span>function</span><span> version() { </span><span>echo</span> 'IBM'<span>; } </span><span>public</span> <span>function</span><span> work() { </span><span>echo</span> '台式电脑正在工作站运行!'<span>; } } </span><span>class</span><span> Person { </span><span>public</span> <span>function</span> run(<span>$type</span><span>) { </span><span>$type</span>-><span>version (); </span><span>$type</span>-><span>work (); } } </span><span>$person</span> = <span>new</span><span> Person (); </span><span>$desktopcomputer</span> = <span>new</span><span> desktopComputer (); </span><span>$notebookcomputer</span> = <span>new</span><span> NoteBookComputer (); </span><span>$person</span>->run ( <span>$notebookcomputer</span> );
注:文章出自李炎恢PHP视频教程,本文仅限交流使用,不得用于商业用途,否则后果自负。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。

PHPは、電子商取引、コンテンツ管理システム、API開発で広く使用されています。 1)eコマース:ショッピングカート機能と支払い処理に使用。 2)コンテンツ管理システム:動的コンテンツの生成とユーザー管理に使用されます。 3)API開発:RESTFUL API開発とAPIセキュリティに使用されます。パフォーマンスの最適化とベストプラクティスを通じて、PHPアプリケーションの効率と保守性が向上します。

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7
