ホームページ  >  記事  >  バックエンド開発  >  PHP オブジェクト指向の 3 つの主要な特徴を学ぶ (抽象化、カプセル化、継承、ポリモーフィズムを完全に理解する)_PHP チュートリアル

PHP オブジェクト指向の 3 つの主要な特徴を学ぶ (抽象化、カプセル化、継承、ポリモーフィズムを完全に理解する)_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:18:251067ブラウズ

オブジェクト指向オブジェクトの 3 つの主要な特徴: カプセル化、継承、およびポリモーフィズム まず、抽象化について簡単に理解しましょう:
以前にクラスを定義したとき、実際に物理モデルを形成するために、クラスの共通の属性と動作を抽出しました。 (テンプレート)、この問題を検討する方法は抽象化と呼ばれます
PHP オブジェクト指向の 3 つの主要な特徴を学ぶ (抽象化、カプセル化、継承、ポリモーフィズムを完全に理解する)_PHP チュートリアル
1. カプセル化
カプセル化とは、抽出されたデータとそのデータに対する操作を一緒にカプセル化することです。 データは内部的に保護され、プログラムは許可された操作 (メソッド) のみを実行します。 ) 他の部分ではデータを操作できます。
php は 3 つのアクセス制御修飾子を提供します
public はグローバルを意味し、このクラス内、クラス外、およびサブクラスからアクセス可能
protected は保護されている、このクラスまたはサブクラスのみがアクセスできるを意味します
private はプライベートを意味します、このクラスのみがアクセスできます 内部からアクセスできますクラス
上記の 3 つの修飾子はメソッドとプロパティ (変数) の両方を変更できます。メソッドにアクセス修飾子がない場合は、デフォルトで public にアクセス修飾子を指定する必要があります。これも PHP4 で記述されており、var $ name を表します。 public 属性。この書き方は推奨されません
例:

コードをコピー コードは次のとおりです。 $salary ;
function __construct($name,$age,$salary){
$this->age=$salary;
}
public function showinfo(){
//これは、3 つの修飾子すべてがこのクラス内で使用できることを意味します
echo $this->name."||".$this->age."||"。 $ this->salary
}
}
$p1=new Person('Zhang San',20,3000)
//これはクラス外なので、次のメソッドを使用して年齢と給与にアクセスすると、エラーが報告されます
// echo $p1->age; echo$p1->salary;


それでは、保護されたプライベート要素とメソッドに外部からアクセスしたい場合はどうすればよいでしょうか? 通常のアプローチは、パブリック関数を通じてこれらの変数形式にアクセスすることです。
public function setxxxx($val){
$this->xxxx=$val
}
public function getxxxx(){
return $this->xxxx; ;
}
ここでの set と get は識別の便宜のためだけであり、必須ではありません
例:
public function getsalary(){
return $this->salary; // 拡張: いくつかのメソッドをここで呼び出すことができます。正しい場合にのみアクセスが許可されます
外部から echo $p1->getsalary(); を使用できます
protected かつ private にアクセスしたい場合は、以下を使用することもできます。
__set() と _ _get() を理解している限り、これは推奨されません
__set() は保護された属性またはプライベート属性に値を割り当てます
__set($name,$val);
__get() を取得しますprotected または private の値
__get($name); 例:



コードをコピー

コードは次のとおりです。


class testa{
protected $name; __set() を使用してすべての属性を管理します
public function __set($pro_name,$pro_val){
//上記の $pro_name と $pro_val はカスタマイズ可能です
// 以下の $this->pro_name が確立され、変更できません $this->pro_name=$pro_val; } //すべての属性値を取得するには __get() を使用します public function __get($pro_name){ if(isset($pro_name)){
return $this-> pro_name;
} else {
return null;
}
}
$n1=new testa();
//通常、保護された属性は、上記のメソッドを使用して操作できます
n1->name='小三';
echo $n1->name;
? >


//

2. 継承
を見てみましょうまず例を示します:



コードをコピーします

コードは次のとおりです:


class Pupil {
public $name;
public function getinfo(){ echo $ this->name.'||'.$this->age; }
public function testing(){
echo 'これは生徒です';
class Grade{ public $name; $age; public function getinfo(){ echo $this->name.'||'.$this-> }
public function testing(){
echo 'これは卒業生です';
}
?>


上記の例からもわかるように、複数のクラスに共通の属性やメソッドが多い場合、コードの再利用性が高くなく、CSSでの処理方法を考えてください
。解決策: 継承



コードをコピーします

コードは次のとおりです:

クラス 学生{
public $name;
public function __construct($name,$age){
$this->name=$name; =$age;
}
public function showinfo(){
echo $this->name.'||'.$this->age;
}
}
class Pupil extends Students{
function testing(){
echo '生徒 '.$this->name.' はテスト中です';
}
}
class Grade extends Students{
function testing(){
echo '卒業生 '.$this->name.' はテスト中です';
}
}
$stu1=新しい生徒('张三',20);
echo '
'; );
?>


上記からわかるように、継承は、親クラス (BaseClass) の public および protected 属性とメソッドを継承することはできません。メソッド
文法構造:
クラスの親クラス名 {}
クラスのサブクラス名は親クラス名を拡張します
詳細:
1. 必要に応じて、サブクラスは 1 つの親クラスのみを継承します。複数のクラスの属性とメソッドを継承するには、マルチレベルの継承を使用できます
例:



コードをコピー
コードは次のとおりです: class A{
public $name=' AAA';
}
クラス B は A{
public $age=30;
}
クラス C は B{}
$p=new C(); //AAA になりますここに出力します
?>


2. サブクラス オブジェクトを作成するとき、その親クラスのコンストラクターはデフォルトでは自動的に呼び出されません。 例:
class A{
public function __construct(){
echo 'A';
}
}
class B extends A{
public function __construct(){
echo 'B';
}
}
$b=new B();//B のコンストラクターがあれば最初に出力されます。 B にコンストラクターがない場合、A の
3 が出力されます。サブクラス内の親クラスのメソッドにアクセスする必要がある場合 (コンストラクター メソッドとメンバー メソッドの修飾子が protected または private である場合)、親クラスを使用できます。 ::メソッド名または親::メソッド名を完成させます [ここで、前述の親と自己は両方とも小文字であり、エラーは大文字で報告されます]
class A{
public function test(){
echo 'a_test';
}
}
class B extends A{
public function __construct() {
//どちらのメソッドもOK
A::test()
}
}
$b=new B ();
5. サブクラス (派生クラス) のメソッドが親クラス (public、protected) のメソッドとまったく同じである場合、それをメソッド オーバーライドまたはメソッド オーバーライド (オーバーライド) と呼びます。次の多態性を参照してください。
3. ポリモーフィズム

例:



コードをコピー
コードは次のとおりです。 echo 'I don't know'; }
}
class Dog extends Animal{
//オーバーライド、function cry(){ echo 'Wang Wang!' Animal::cry();//いいえエラーはここで報告され、親クラスの cry() は正しく実行されます。 $dog1=new Dog();

;概要:
1. 親クラスがすべてのサブクラスにメソッドがあることを知っているが、そのクラスがそのメソッドの記述方法を決定できない場合、メソッドのオーバーライド (書き換え) にはメソッドが必要です。サブクラスの名前とパラメータの数はまったく同じです。 2. サブクラスが親クラスのメソッド (保護/パブリック) を呼び出したい場合は、親クラス名::メソッド名または親::メソッド名を使用できます。
3. メソッドの書き換えを実装する場合、アクセス修飾子は異なっていてもかまいませんが、サブクラス メソッドのアクセス権は親クラス メソッドのアクセス権以上である必要があります (つまり、親クラス メソッドのアクセス権は許可されません)。
たとえば、親クラスの public 関数 cry(){} とサブクラスの protected 関数 cry(){} はエラーを報告します
ただし、サブクラスのアクセス権は次のように拡大できます。
親クラス private function cry(){} サブクラスの保護関数 cry(){} が正しく実行可能
拡張機能:
メソッドのオーバーロード(オーバーロード)
基本概念: 関数名は同じですが、パラメータの数やパラメータの型が異なります同じ関数を呼び出すことで異なる関数を区別できます
PHP5 ではオーバーロードもサポートされていますが、PHP5 では同じ名前の複数の関数を定義できません
PHP5 はこれらのマジックを使用して強力な「マジック」関数を提供します。関数を使用すると、関数のオーバーロードを実現できます。
ここで __call に移動する必要があります。オブジェクトがメソッドを呼び出し、そのメソッドが存在しない場合、プログラムは自動的に __call を呼び出します。
[公式には非推奨]
には次のマジック定数があります。 PHP: __LINE__ __FILE__ __DIR__ __FUNCTION__ __CLASS__ など
例:



コードをコピー

コードは次のとおりです:

class A{
function test1($p){
echo 'test1
';
}
function test2($p){
echo 'test2
';
}
function __call($method,$p){
//ここで $p は配列で、上記 2 つの変数名はカスタマイズ可能です
if($method == 'test'){
if(count($p) ) ==1){
$this->test1($p);
} else if(count($p)==2){
}
}

$a=new A();
$a->test(3,5);



http://www.bkjia.com/PHPjc/325493.html
www.bkjia.com

tru​​e

技術記事オブジェクト指向オブジェクトの 3 つの主要な特性: カプセル化、継承、ポリモーフィズム まず、抽象化について簡単に理解しましょう。先ほどクラスを定義したとき、実際には、モノのクラスに共通の属性を組み合わせました。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。