PHP オブジェクト指向
PHPオブジェクト指向とは
オブジェクト指向プログラミング(英語: Object-owned programming、略称: OOP)において、オブジェクトとは情報とその情報の処理方法の記述から構成される全体のことをいいます。 、現実世界の抽象化です。
現実の世界で私たちが直面しているのは、コンピューター、テレビ、自転車などの物体です。
関連学習の推奨事項: 「PHP オブジェクト指向プログラミング (翡翠少女般若心経編)」、「MySQLi オブジェクト指向プログラミング クイック スタート」
オブジェクトの主な 3 つの特性:
-
オブジェクトの動作: オブジェクトにどのような操作を適用できるか、ライトのオン/オフは動作です。
オブジェクトの形状: これらのメソッドが適用されたときのオブジェクトの反応、色、サイズ、外観。
オブジェクトの表現: オブジェクトの表現は ID カードに相当し、特に同じ動作とステータスの違いを区別します。
たとえば、Animal は犬と羊を指定することができ、犬と羊は色の属性を持ち、書き込み、実行、その他の行動状態を持ちます。
オブジェクト指向コンテンツ
クラス - 物の抽象的な特性を定義します。クラスの定義には、データの形式とデータに対する操作が含まれます。
Object - クラスのインスタンスです。
メンバー変数 - クラス内で定義された変数。この変数の値は外部には見えませんが、クラスがオブジェクトとしてインスタンス化された後は、その変数をオブジェクトの属性と呼ぶことができます。
メンバー関数 - クラス内で定義され、オブジェクトのデータにアクセスするために使用できます。
継承 -継承は、サブクラスが親クラスのデータ構造とメソッドを自動的に共有するメカニズムです。これはクラス間の関係です。クラスを定義して実装するときは、既存のクラスに基づいて実行したり、既存のクラスによって定義されたコンテンツを独自のコンテンツとして取得したり、新しいコンテンツを追加したりできます。
親クラス -クラスは他のクラスによって継承され、そのクラスは親クラス、基本クラス、またはスーパークラスと呼ばれることがあります。
サブクラス -他のクラスを継承するクラスはサブクラスと呼ばれ、または派生クラスと呼ばれることもあります。
ポリモーフィズム -ポリモーフィズムとは、同じ操作、関数、またはプロセスが複数の種類のオブジェクトに適用され、異なる結果が得られることを意味します。同じメッセージを受信したときに、オブジェクトが異なれば結果も異なる場合があります。この現象はポリモーフィズムと呼ばれます。
オーバーロード - 簡単に言えば、同じ名前で異なるパラメーターリストを持つ関数またはメソッドは、オーバーロードされた関数またはメソッドと呼ばれます。
抽象性 -抽象化とは、一貫したデータ構造(プロパティ)と動作(操作)を持つオブジェクトをクラスに抽象化することを指します。クラスは、アプリケーションに関連する重要なプロパティを反映し、その他の無関係なコンテンツを無視する抽象化です。クラスの分割は主観的ですが、特定のアプリケーションに関連している必要があります。
カプセル化 -カプセル化とは、現実世界に存在するオブジェクトのプロパティと動作をバインドし、論理ユニット内に配置することを指します。
Constructor -これは主に、オブジェクトの作成時にオブジェクトを初期化するために使用されます。つまり、オブジェクトのメンバー変数に初期値を代入するために、常にステートメント内の new 演算子と一緒に使用されます。物体。
Destructor − デストラクター (デストラクター) コンストラクターとは対照的に、オブジェクトがそのライフサイクルを終了するとき (たとえば、オブジェクトが配置されている関数が呼び出されたとき)、システムは自動的にデストラクターを実行します。デストラクターは、「クリーンアップ」作業を行うためによく使用されます (たとえば、オブジェクトを作成するとき、new を使用してメモリー空間を開きます。このメモリー空間は、終了する前にデストラクターの delete で解放する必要があります)。
下の図では、Car クラスを通じて Mercedes、Bmw、Audi の 3 つのオブジェクトを作成しました。
PHP クラス定義
PHP はクラスを定義します。 通常の構文形式は次のとおりです。
$mercedes = new Car (); $bmw = new Car (); $audi = new Car ();は次のように解析されます。
クラスの使用法 class の後にクラス名の定義を追加します。キーワード。
変数とメソッドは、クラス名の後の一対の中括弧 ({}) 内で定義できます。
クラスの変数は var を使用して宣言され、変数は値で初期化することもできます。
関数定義は PHP 関数定義に似ていますが、関数にはクラスとクラスがインスタンス化するオブジェクトを通じてのみアクセスできます。
Instance
<?php class phpClass { var $var1; var $var2 = "constant string"; function myfunc ($arg1, $arg2) { [..] } [..] } ?>変数$thisはそれ自体のオブジェクトを表します。
PHP_EOLは改行文字です。
PHP でのオブジェクトの作成
クラスが作成された後、new 演算子を使用してこのクラスのオブジェクトをインスタンス化できます:
<?php class Site { /* 成员变量 */ var $url; var $title; /* 成员函数 */ function setUrl($par){ $this->url = $par; } function getUrl(){ echo $this->url . PHP_EOL; } function setTitle($par){ $this->title = $par; } function getTitle(){ echo $this->title . PHP_EOL; } } ?>上記のコードでは、それぞれ独立した 3 つのオブジェクトを作成しました。 , 次に、メンバーメソッドとメンバー変数にアクセスする方法を見てみましょう。
メンバーメソッドを呼び出す
オブジェクトをインスタンス化した後、オブジェクトを使用してメンバーメソッドを呼び出すことができます。オブジェクトのメンバーメソッドは、オブジェクトのメンバー変数を操作することしかできません:
メンバー関数を呼び出し、タイトルを設定します。と URL
$php = new Site; $taobao = new Site; $google = new Site;はメンバー関数を呼び出してタイトルと URL を取得します
$php->setTitle( "php中文网" ); $taobao->setTitle( "淘宝" ); $google->setTitle( "Google 搜索" ); $php->setUrl( 'www.php.cn' ); $taobao->setUrl( 'www.taobao.com' ); $google->setUrl( 'www.google.com' );
完全なコードは次のとおりです:
インスタンス
$php->getTitle(); $taobao->getTitle(); $google->getTitle(); $php->getUrl(); $taobao->getUrl(); $google->getUrl();
インスタンスを実行する»
「インスタンスを実行」をクリックしますボタンをクリックしてオンライン インスタンスを表示します
上記のコードを実行すると、出力結果は次のようになります:
<?php class Site { /* 成员变量 */ var $url; var $title; /* 成员函数 */ function setUrl($par){ $this->url = $par; } function getUrl(){ echo $this->url . PHP_EOL; } function setTitle($par){ $this->title = $par; } function getTitle(){ echo $this->title . PHP_EOL; } } $php = new Site; $taobao = new Site; $google = new Site; // 调用成员函数,设置标题和URL $php->setTitle( "php中文网" ); $taobao->setTitle( "淘宝" ); $google->setTitle( "Google 搜索" ); $php->setUrl( 'www.php.cn' ); $taobao->setUrl( 'www.taobao.com' ); $google->setUrl( 'www.google.com' ); // 调用成员函数,获取标题和URL $php->getTitle(); $taobao->getTitle(); $google->getTitle(); $php->getUrl(); $taobao->getUrl(); $google->getUrl(); ?>
PHP コンストラクター
Constructor は特別なメソッドです。これは主に、オブジェクトの作成時にオブジェクトを初期化する、つまりオブジェクトのメンバー変数に初期値を割り当てるために使用され、オブジェクトを作成するステートメント内で常に new 演算子と一緒に使用されます。
PHP 5 では、開発者がクラス内のコンストラクターとしてメソッドを定義できます。構文形式は次のとおりです。
php中文网 淘宝 Google 搜索 www.php.cn www.taobao.com www.google.com上記の例では、コンストラクター メソッドを通じて $url 変数と $title 変数を初期化できます。
void __construct ([ mixed $args [, $... ]] )これで、setTitle メソッドと setUrl メソッドを呼び出す必要がなくなりました:
function __construct( $par1, $par2 ) {
$this->url = $par1;
$this->title = $par2;
}
インスタンスの実行»[インスタンスの実行] ボタンをクリックして、オンライン インスタンスを表示します
Destructor
Destructor (デストラクター) コンストラクターとは対照的に、オブジェクトがそのライフサイクルを終了するとき (たとえば、オブジェクトが配置されている関数が呼び出されたとき)、システムは自動的にデストラクターを実行します。
PHP 5 では、他のオブジェクト指向言語と同様のデストラクターの概念が導入されました。その構文形式は次のとおりです。
<?php class Site { /* 成员变量 */ var $url; var $title; function __construct( $par1, $par2 ) { $this->url = $par1; $this->title = $par2; } /* 成员函数 */ function setUrl($par){ $this->url = $par; } function getUrl(){ echo $this->url . PHP_EOL; } function setTitle($par){ $this->title = $par; } function getTitle(){ echo $this->title . PHP_EOL; } } $php = new Site('www.php.cn', 'php中文网'); $taobao = new Site('www.taobao.com', '淘宝'); $google = new Site('www.google.com', 'Google 搜索'); // 调用成员函数,获取标题和URL $php->getTitle(); $taobao->getTitle(); $google->getTitle(); $php->getUrl(); $taobao->getUrl(); $google->getUrl(); ?>Example
void __destruct ( void )は上記のコードを実行し、その結果を出力します。
<?php class MyDestructableClass { function __construct() { print "构造函数\n"; $this->name = "MyDestructableClass"; } function __destruct() { print "销毁 " . $this->name . "\n"; } } $obj = new MyDestructableClass(); ?>
継承
PHP は、キーワード extends を使用してクラスを継承します。形式は次のとおりです:
构造函数 销毁 MyDestructableClass
Instance
。でインスタンス、Child_Site クラスは Site クラスを継承し、拡張機能:
class Child extends Parent { // 代码部分 }
メソッドの書き換え
親クラスから継承したメソッドがサブクラスのニーズを満たせない場合、このプロセスを書き換えることができます。はメソッド オーバーライドと呼ばれ、For メソッド オーバーライドとも呼ばれます。
getUrl メソッドと getTitle メソッドは次の例で書き換えられます:
<?php // 子类扩展站点类别 class Child_Site extends Site { var $category; function setCate($par){ $this->category = $par; } function getCate(){ echo $this->category . PHP_EOL; } }
アクセス制御
属性またはメソッドの PHP アクセス制御は、キーワード public (public) と protected (protected) を前に追加することによって行われます。 または private (プライベート)を達成する。
public (パブリック): public クラスのメンバーにはどこからでもアクセスできます。
protected (保護された): 保護されたクラスのメンバーは、それ自体、そのサブクラス、親クラスからアクセスできます。
private (プライベート): プライベート クラスのメンバーには、それが定義されているクラスからのみアクセスできます。
属性のアクセス制御
クラス属性は、public、protected、privateのいずれかとして定義する必要があります。 var で定義されている場合は、パブリックとみなされます。
function getUrl() { echo $this->url . PHP_EOL; return $this->url; } function getTitle(){ echo $this->title . PHP_EOL; return $this->title; }
メソッドのアクセス制御
クラス内のメソッドは、パブリック、プライベート、または保護として定義できます。これらのキーワードが設定されていない場合、メソッドはデフォルトで public になります。
<?php /** * Define MyClass */ class MyClass { public $public = 'Public'; protected $protected = 'Protected'; private $private = 'Private'; function printHello() { echo $this->public; echo $this->protected; echo $this->private; } } $obj = new MyClass(); echo $obj->public; // 这行能被正常执行 echo $obj->protected; // 这行会产生一个致命错误 echo $obj->private; // 这行也会产生一个致命错误 $obj->printHello(); // 输出 Public、Protected 和 Private /** * Define MyClass2 */ class MyClass2 extends MyClass { // 可以对 public 和 protected 进行重定义,但 private 而不能 protected $protected = 'Protected2'; function printHello() { echo $this->public; echo $this->protected; echo $this->private; } } $obj2 = new MyClass2(); echo $obj2->public; // 这行能被正常执行 echo $obj2->private; // 未定义 private echo $obj2->protected; // 这行会产生一个致命错误 $obj2->printHello(); // 输出 Public、Protected2 和 Undefined ?>
インターフェース
インターフェースを使用すると、クラスが実装する必要があるメソッドを指定できますが、これらのメソッドの特定の内容を定義する必要はありません。
インターフェースは、標準クラスを定義するのと同じように、interface キーワードを通じて定義されますが、その中で定義されているメソッドはすべて空です。
インターフェースで定義されるすべてのメソッドはパブリックである必要があります。これはインターフェースの特性です。
インターフェースを実装するには、implements演算子を使用します。クラスは、インターフェイスで定義されたすべてのメソッドを実装する必要があります。実装しない場合は、致命的なエラーが報告されます。クラスは複数のインターフェイスを実装できます。複数のインターフェイスの名前を区切るにはカンマを使用します。
定数
クラス内で常に変更されない値を定数として定義できます。定数を定義および使用するときに $ 記号を使用する必要はありません。
定数の値は固定値である必要があり、変数、クラス属性、数学的演算や関数呼び出しの結果にすることはできません。
PHP 5.3.0 以降、変数を使用してクラスを動的に呼び出すことができます。ただし、この変数の値をキーワード (self、parent、static など) にすることはできません。
インスタンス
<?php /** * Define MyClass */ class MyClass { // 声明一个公有的构造函数 public function __construct() { } // 声明一个公有的方法 public function MyPublic() { } // 声明一个受保护的方法 protected function MyProtected() { } // 声明一个私有的方法 private function MyPrivate() { } // 此方法为公有 function Foo() { $this->MyPublic(); $this->MyProtected(); $this->MyPrivate(); } } $myclass = new MyClass; $myclass->MyPublic(); // 这行能被正常执行 $myclass->MyProtected(); // 这行会产生一个致命错误 $myclass->MyPrivate(); // 这行会产生一个致命错误 $myclass->Foo(); // 公有,受保护,私有都可以执行 /** * Define MyClass2 */ class MyClass2 extends MyClass { // 此方法为公有 function Foo2() { $this->MyPublic(); $this->MyProtected(); $this->MyPrivate(); // 这行会产生一个致命错误 } } $myclass2 = new MyClass2; $myclass2->MyPublic(); // 这行能被正常执行 $myclass2->Foo2(); // 公有的和受保护的都可执行,但私有的不行 class Bar { public function test() { $this->testPrivate(); $this->testPublic(); } public function testPublic() { echo "Bar::testPublic\n"; } private function testPrivate() { echo "Bar::testPrivate\n"; } } class Foo extends Bar { public function testPublic() { echo "Foo::testPublic\n"; } private function testPrivate() { echo "Foo::testPrivate\n"; } } $myFoo = new foo(); $myFoo->test(); // Bar::testPrivate // Foo::testPublic ?>
抽象クラス
任意のクラスで、その中の少なくとも 1 つのメソッドが抽象として宣言されている場合、このクラスは抽象として宣言されなければなりません。
抽象として定義されたクラスはインスタンス化できません。
abstract として定義されたメソッドは、その呼び出しメソッド (パラメーター) を宣言するだけであり、その特定の関数の実装を定義することはできません。
抽象クラスを継承する場合、サブクラスは親クラスのすべての抽象メソッドを定義する必要があります。また、これらのメソッドのアクセス制御は親クラスと同じ (またはより緩和された) 必要があります。たとえば、抽象メソッドが protected として宣言されている場合、サブクラスに実装されているメソッドは protected または public として宣言する必要があり、private として定義することはできません。さらに、メソッドを呼び出すメソッドは一致している必要があります。つまり、必要なパラメータの型と数が一致している必要があります。たとえば、サブクラスが親クラスの抽象メソッドの宣言に含まれていないオプションのパラメーターを定義している場合、2 つの宣言の間に競合はありません。
<?php // 声明一个'iTemplate'接口 interface iTemplate { public function setVariable($name, $var); public function getHtml($template); } // 实现接口 class Template implements iTemplate { private $vars = array(); public function setVariable($name, $var) { $this->vars[$name] = $var; } public function getHtml($template) { foreach($this->vars as $name => $value) { $template = str_replace('{' . $name . '}', $value, $template); } return $template; } }は上記のコードを実行し、出力結果は次のようになります:
<?php class MyClass { const constant = '常量值'; function showConstant() { echo self::constant . PHP_EOL; } } echo MyClass::constant . PHP_EOL; $classname = "MyClass"; echo $classname::constant . PHP_EOL; // 自 5.3.0 起 $class = new MyClass(); $class->showConstant(); echo $class::constant . PHP_EOL; // 自 PHP 5.3.0 起 ?>
Static キーワード
はクラス属性またはメソッドを static (静的) として宣言し、クラスをインスタンス化せずに直接アクセスできます。 。
インスタンス化されたクラスのオブジェクトを通じて静的プロパティにアクセスすることはできません (ただし、静的メソッドはアクセスできます)。
静的メソッドではオブジェクトを呼び出す必要がないため、疑似変数 $this は静的メソッドでは使用できません。
-> 演算子を使用してオブジェクトから静的プロパティにアクセスすることはできません。
PHP 5.3.0 以降、変数を使用してクラスを動的に呼び出すことができます。ただし、この変数の値をキーワード self、parent、または static にすることはできません。
<?php abstract class AbstractClass { // 强制要求子类定义这些方法 abstract protected function getValue(); abstract protected function prefixValue($prefix); // 普通方法(非抽象方法) public function printOut() { print $this->getValue() . PHP_EOL; } } class ConcreteClass1 extends AbstractClass { protected function getValue() { return "ConcreteClass1"; } public function prefixValue($prefix) { return "{$prefix}ConcreteClass1"; } } class ConcreteClass2 extends AbstractClass { public function getValue() { return "ConcreteClass2"; } public function prefixValue($prefix) { return "{$prefix}ConcreteClass2"; } } $class1 = new ConcreteClass1; $class1->printOut(); echo $class1->prefixValue('FOO_') . PHP_EOL; $class2 = new ConcreteClass2; $class2->printOut(); echo $class2->prefixValue('FOO_') . PHP_EOL; ?>は上記のプログラムを実行し、出力結果は次のようになります:
ConcreteClass1 FOO_ConcreteClass1 ConcreteClass2 FOO_ConcreteClass2
Final キーワード
PHP 5 では新しい Final キーワードが追加されています。親クラスのメソッドがfinalと宣言されている場合、子クラスはそのメソッドをオーバーライドできません。クラスがfinalと宣言されている場合、そのクラスを継承することはできません。
次のコードは、実行時にエラーを報告します:
<?php class Foo { public static $my_static = 'foo'; public function staticValue() { return self::$my_static; } } print Foo::$my_static . PHP_EOL; $foo = new Foo(); print $foo->staticValue() . PHP_EOL; ?>
親クラスのコンストラクターを呼び出す
PHP は、サブクラスのコンストラクターで親クラスのコンストラクターを自動的に呼び出しません。親クラスのコンストラクターを実行するには、サブクラスのコンストラクターで parent::__construct() を呼び出す必要があります。
foo fooは上記のプログラムを実行し、出力結果は次のようになります。