PHPのオブジェクト指向
(:オブジェクト指向プログラミング、略称:英語OOP)オブジェクト指向プログラミングでは、オブジェクトは、全体からなる情報と情報の処理の説明は、ある現実世界の抽象化です。
物事は、コンピュータ、テレビ、自転車など我々が直面している現実世界のオブジェクトです。
物体の三大特徴:
- オブジェクトの挙動:操作に適用することができ、オブジェクト、ライトをオンにライトをオフにするには、動作です。
- Formオブジェクト:これらのメソッドを適用すると、オブジェクト、色、大きさ、形状に応答する方法です。
- オブジェクトの表現:アイデンティティと同等のものを表すオブジェクトは、具体的には同じ動作と状態が異なるものを区別します。
例えば、動物(動物)は抽象クラスで、私たちは犬と羊に特異的であることができる、と羊と犬は特定のターゲットである、彼らは色の属性を持っている、あなたが書くことができ、あなたは状態の他の行為を実行することができます。
オブジェクト指向コンテンツ
クラスは -ものの抽象特性を定義します。クラス定義は、データ上のフォームデータと操作が含まれています。
オブジェクト -クラスのインスタンスです。
メンバー変数 -クラス内で定義された変数。変数の外部値は表示されませんが、クラスがオブジェクトとしてインスタンス化された後、オブジェクトのプロパティが変数と呼ばれることができ、メンバ関数によってアクセスすることができます。
メンバ関数 -クラス内で定義は、データアクセスオブジェクトのために使用することができます。
継承 -継承は、データ構造とクラス間の関係である親クラスのメソッドの自動共有のサブクラスです。クラスの定義と実装では、それらは、基礎になることができ、すでにそのコンテンツの内容によって定義されるように、この既存のクラスを行い、いくつかの新しいコンテンツを追加存在します。
親クラス -他のクラスに継承されたクラスは、クラスは親クラス、グループまたはクラス、またはスーパーと呼ばれることもあります。
サブクラス -サブクラスと呼ばれる別のクラスを継承するクラスは、派生クラスを呼び出すことができます。
ポリモーフィズム -ポリモーフィズムが同じ操作や機能を意味し、プロセスは、オブジェクトの複数の種類に適用され、異なる結果を得ることができます。異なるオブジェクトは、あなたがこの現象は多型と呼ばれ、同じメッセージが異なる結果を生成することができる受け取ります。
オーバーロード -ショート、それは同じ名前の関数やメソッドですが、パラメータリストは、同じ名前の異なるパラメータ間で同じような状況は、このような関数やメソッドではありません、それぞれのオーバーロード関数やメソッドが呼び出されます。
要約-要約は、クラスにオブジェクトの一貫性のあるデータ構造(属性)と動作(操作)を有することをいいます。このようなクラスは、それが他の無関係なコンテンツを無視して、アプリケーションに関連する重要な特性を反映し、抽象化したものです。 任意のクラス部門は主観的であるが、特定のアプリケーションに関連する必要があります。
パッケージ -パッケージは、実世界のオブジェクトのプロパティと動作を指し、一緒に論理ユニットに配置されたバインドするために存在しています。
コンストラクター -主にオブジェクトを作成するときにオブジェクトを初期化するために使用される、オブジェクトは常に新しい演算子でオブジェクト作成ステートメントを使用し、メンバ変数の初期値が代入されます。
デストラクタ -デストラクタ(デストラクタ)とは対照的に、コンストラクタ、(オブジェクトは、関数呼び出しが完了したが、例えば、)そのライフサイクルのオブジェクトの終了、システムが自動的にデストラクタを実行します。デストラクタは、多くの場合(例えば、新しいメモリ空間を開いてオブジェクトを作成するときにリリースを削除するデストラクタで終了する前に使用する必要があります)仕事 "の余波をクリーンアップ」するために使用されています。
メルセデス、BMW、アウディ:次の図は、我々は3つのオブジェクトCarクラスを作成します。
$mercedes = new Car (); $bmw = new Car (); $audi = new Car ();
PHPのクラス定義
次のようにPHPのカスタムクラスは通常、構文は次のとおりです。
<?php class phpClass { var $var1; var $var2 = "constant string"; function myfunc ($arg1, $arg2) { [ja] } [ja] } ?>
次のように解釈:
クラス・キーワードに加えて、クラス定義の名前を使用して、クラスの後。
クラス名の後にカッコの組は、変数やメソッド({})の内部を定義することができます。
変数を宣言するVARを使用して、クラス変数も値を初期化することができます。
PHPの関数定義は、関数の定義に似ていますが、関数は、クラスとそのインスタンス化されたオブジェクトを介してアクセスすることができます。
例
<?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_EOL改行 。
オブジェクトを作成するためのPHP
クラスが作成された後、私たちは、クラスのオブジェクトをインスタンス化するために、new演算子を使用することができます。
$w3big = new Site; $taobao = new Site; $google = new Site;
我々は3つのオブジェクトを作成し、上記のコードは、3つのオブジェクトのそれぞれは、次に我々は、メンバー・メソッドとメンバ変数にアクセスする方法を見て、独立しています。
メンバー・メソッドを呼び出します
オブジェクトがインスタンス化された後、我々は、オブジェクトのメソッドは、オブジェクトの操作部材変数のメンバーになることができメンバメソッドを呼び出すためにオブジェクトを使用することができます。
// 调用成员函数,设置标题和URL $w3big->setTitle( "本教程" ); $taobao->setTitle( "淘宝" ); $google->setTitle( "Google 搜索" ); $w3big->setUrl( 'www.w3write.com' ); $taobao->setUrl( 'www.taobao.com' ); $google->setUrl( 'www.google.com' ); // 调用成员函数,获取标题和URL $w3big->getTitle(); $taobao->getTitle(); $google->getTitle(); $w3big->getUrl(); $taobao->getUrl(); $google->getUrl();
次のように完全なコードは次のとおりです。
例
クラスのサイト{
/ * *メンバ変数/
var $のURL。
変数 $タイトル;
/ *メンバ関数* /
ファンクションてsetURL($パー){
$この- > URL = $パー 。
}
機能のgetURL(){
。$このエコー- >のurl PHP_EOLを 。
}
関数のsetTitle($パー){
$この- >タイトル= $パー 。
}
機能のgetTitle(){
>タイトルPHP_EOL - $これをエコーします。 ;
}
}
$ w3big =新しいサイト。
$の淘宝網=新しいサイト。
$グーグル =新しいサイト。
//メンバ関数は、タイトルとURLを設定するために呼び出されます
$ w3big - >のsetTitle( "チュートリアル");
$の淘宝網- >のsetTitle( "淘宝網");
$グーグル - >のsetTitle( "Google 検索");
$ w3big - >てsetURL( 'www.w3write.com ');
$の淘宝網- >てsetURL( 'www.taobao.com ');
$グーグル- >てsetURL( 'www.google.com ');
//タイトルとURLを取得するにはメンバ関数を呼び出します
$ w3big - >のgetTitle();
$の淘宝網- >のgetTitle();
$グーグル - >のgetTitle();
$ w3big - >のgetURL();
$の淘宝網- >のgetURL();
$グーグル - >のgetURL();
?>
実行中のインスタンス»
上記のコードの実装、出力は次のようになります。
本教程 淘宝 Google 搜索 www.w3write.com www.taobao.com www.google.com
PHPコンストラクタ
コンストラクタは特殊な方法です。 主にオブジェクトを作成するときにオブジェクトを初期化するために使用される、オブジェクトは常に新しい演算子でオブジェクト作成ステートメントを使用し、メンバ変数の初期値が代入されます。
次のようにコンストラクタ構文があるとしてPHP 5では、開発者がクラスのメソッドの行を定義することができます:
void __construct ([ mixed $args [, $ja. ]] )
上記の例では、コンストラクタを介して$のURLと$ title変数を初期化することができます:
function __construct( $par1, $par2 ) { $this->url = $par1; $this->title = $par2; }
今、私たちは、メソッドのsetTitleとてsetURLを呼び出す必要はありません。
例
$の淘宝網=新しいサイト( 'www.taobao.com '、 ' 淘宝網');
$グーグル=新しいサイト( 'www.google.com '、 '、Googleの検索');
//タイトルとURLを取得するにはメンバ関数を呼び出します
$ w3big->のgetTitle();
$ taobao->のgetTitle();
$ google->のgetTitle();
$ w3big->のgetURL();
$ taobao->のgetURL();
$ google->のgetURL();
実行中のインスタンス»
デストラクタ
デストラクタ(デストラクタ)とは対照的に、コンストラクタ、ときに(オブジェクトは、関数呼び出しが完了したが、例えば、)そのライフサイクルのオブジェクトの終了、システムが自動的にデストラクタを実行します。
PHP 5は、構文は次のとおりである、他のオブジェクト指向言語に似ている、デストラクタの概念が導入されています。
void __destruct ( void )
例
<?php class MyDestructableClass { function __construct() { print "构造函数\n"; $this->name = "MyDestructableClass"; } function __destruct() { print "销毁 " . $this->name . "\n"; } } $obj = new MyDestructableClass(); ?>
上記のコードの実装、出力は次のようになります。
构造函数 销毁 MyDestructableClass
受け継ぎます
PHPはPHPは次の形式で、多重継承をサポートしていない、クラスを継承するキーワードを拡張します。
class Child extends Parent { // 代码部分 }
例
例Child_Siteクラスは、サイトのクラスを継承し、機能を拡張します。
<?php // 子类扩展站点类别 class Child_Site extends Site { var $category; function setCate($par){ $this->category = $par; } function getCate(){ echo $this->category . PHP_EOL; } }
メソッドのオーバーライド
サブクラスは親クラスのメソッドを継承のあなたのニーズを満たすことができない場合、それは、また、オーバーライドするメソッドとして知られているオーバーレイ法(オーバーライド)と呼ばれるプロセスを書き換えることができます。
例書き換えのgetURLとのgetTitleメソッド:
function getUrl() { echo $this->url . PHP_EOL; return $this->url; } function getTitle(){ echo $this->title . PHP_EOL; return $this->title; }
アクセス制御
アクセスコントロールのプロパティまたはメソッドにPHPを達成するために、パブリック(公共)の前、保護された(保護)またはプライベート(プライベート)にキーワードを追加することによって達成されます。
- パブリック(公共):パブリッククラスのメンバはどこでもアクセスすることができます。
- 保護された(保護):保護されたクラスのメンバーは、自身だけでなく、そのサブクラスと親クラスによってアクセスすることができます。
- プライベート(プライベート):プライベートクラスメンバーのみがどこのクラス定義にアクセスすることができます。
アクセス制御属性
Class属性は、パブリック、保護された、プライベート1として定義する必要があります。 VARで定義されている場合、それが公共であると考えられます。
<?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 ?>
アクセス制御方法
クラスのメソッドは、パブリック、プライベートまたはprotectedとして定義することができます。 これらのキーワード、公衆へのメソッドのデフォルトを設定しない場合。
<?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 ?>
インターフェイス
インターフェイス(インターフェイス)を使用して、クラスが実装しなければならないメソッドを指定することができ、これらの方法の具体的な内容を定義する必要はありません。
インターフェースは、標準クラスの定義のように、interfaceキーワードによって定義されていますが、すべてのメソッドが空で定義しています。
インタフェースで定義されたすべてのメソッドは、インターフェイスの特徴である、パブリックでなければなりません。
インターフェイスを実装するには、実装の演算子を使用します。クラスがインタフェースで定義されたすべてのメソッドを実装しなければならない、または他の致命的なエラーを報告します。 クラスは、複数のインターフェイスを実装する複数のインターフェイスの名前を区切るには、カンマを使用することができます。
<?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は以降5.3.0以来、あなたが動的にクラスを呼び出すために変数を使用することができます。 しかし、変数の値がキーワード(例えば、自己、親または静的)にすることはできません。
例
<?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 起 ?>
抽象型クラス
それには、少なくとも1つの方式が含まれている場合は、任意のクラスが、このクラスがabstractとして宣言されなければならない、抽象的に宣言されています。
抽象クラスはインスタンス化できないとして定義されています。
抽象メソッドは、その呼び出し(パラメータ)を宣言するとして定義されている、あなたは、特定の機能の実装を定義することはできません。
抽象クラスを継承し、サブクラスはすべての抽象親クラスのメソッドの定義がなければなりません。また、制御および親クラスのこれらのメソッドへのアクセスは、同じ(またはよりリラックスした)である必要があります。 例えば、抽象メソッドが保護宣言され、その後、サブクラスで実装された方法は、保護またはパブリックとして宣言する必要がありますが、プライベートとして定義することはできません。 また、メソッドによって呼び出さ必要なパラメータの種類と数が一致していなければならないであること、一致しなければなりません。 例えば、サブクラスはオプションのパラメータを定義していない、と親クラスの抽象メソッドの宣言が全くあり、2つの文の間の競合は発生しません。
<?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
静的キーワード
スタティック(静的)として、クラスのプロパティやメソッドを宣言し、クラスとの直接アクセスをインスタンス化することはできません。
クラスを通じて静的プロパティには、アクセスにオブジェクトをインスタンス化することはできません(ただし、静的メソッドは、缶)。
静的メソッドは、オブジェクトを介して呼び出す必要はありませんので、この疑似変数$は、静的メソッドでは使用できません。
被験者がない静的プロパティ - >オペレータにアクセスします。
PHPは以降5.3.0以来、あなたが動的にクラスを呼び出すために変数を使用することができます。 しかし、変数の値は、キーワード、自己、親または静的にすることはできません。
<?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; ?>
上記のプログラムは、出力は次のようになります。
foo foo
finalキーワード
PHP 5は、最終的なキーワードを追加します。 親クラスのメソッドがfinal宣言された場合、サブクラスはこのメソッドをオーバーライドすることはできません。 クラスはfinal宣言されている場合は、それを継承することはできません。
次のコード実行エラー:
<?php class BaseClass { public function test() { echo "BaseClass::test() called" . PHP_EOL; } final public function moreTesting() { echo "BaseClass::moreTesting() called" . PHP_EOL; } } class ChildClass extends BaseClass { public function moreTesting() { echo "ChildClass::moreTesting() called" . PHP_EOL; } } // 报错信息 Fatal error: Cannot override final method BaseClass::moreTesting() ?>
親クラスのコンストラクタを呼び出します
PHPは自動的にサブクラスで親クラスのコンストラクタのコンストラクタを呼び出すことはありません。 親クラスのコンストラクタを実行するには、我々は、サブクラスのコンストラクタで親を呼び出す必要があります:: __構築します()。
<?php class BaseClass { function __construct() { print "BaseClass 类中构造方法" . PHP_EOL; } } class SubClass extends BaseClass { function __construct() { parent::__construct(); // 子类构造方法不能自动调用父类的构造方法 print "SubClass 类中构造方法" . PHP_EOL; } } class OtherSubClass extends BaseClass { // 继承 BaseClass 的构造方法 } // 调用 BaseClass 构造方法 $obj = new BaseClass(); // 调用 BaseClass、SubClass 构造方法 $obj = new SubClass(); // 调用 BaseClass 构造方法 $obj = new OtherSubClass(); ?>
上記のプログラムは、出力は次のようになります。
BaseClass 类中构造方法 BaseClass 类中构造方法 SubClass 类中构造方法 BaseClass 类中构造方法