ホームページ >php教程 >php手册 >PHP オブジェクト指向の 3 つの主要な特徴を学習します (抽象化、カプセル化、継承、ポリモーフィズムを完全に理解します)。

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

WBOY
WBOYオリジナル
2016-06-13 12:00:06951ブラウズ

オブジェクト指向オブジェクトの 3 つの主要な特徴: カプセル化、継承、およびポリモーフィズム まず、抽象化について簡単に理解しましょう:
先ほどクラスを定義したとき、実際にオブジェクトのクラスの共通の属性と動作を抽出しました。物理モデル (テンプレート)、問題を研究するこの方法は抽象化と呼ばれます

1. カプセル化
カプセル化とは、抽出されたデータとデータに対する操作をカプセル化することです。は内部的に保護されており、プログラムの他の部分からの承認された操作 (メソッド) のみがデータに対して操作できます。
php は 3 つのアクセス制御修飾子を提供します。
public はグローバルを意味し、このクラス内、クラス外、およびサブクラスからアクセス可能です。
protected は保護されていることを意味し、このクラスまたはサブクラスのみがアクセスできます。
private はプライベートを意味し、のみアクセスできますこのクラス内でアクセスできます
上記の 3 つの修飾子はメソッドとプロパティ (変数) の両方を変更できます。メソッドにアクセス修飾子がない場合は、デフォルトで public を指定する必要があります。この方法もあります。 PHP4 では var $name を記述します。これはパブリック属性を意味します。
例:

コードをコピーします。 コードは次のとおりです。 :


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


それでは今やりたいのは、外部からprotected要素やprivate要素やメソッドにアクセスする場合はどうするかということです。 通常のアプローチは、パブリック関数を通じてこれらの変数形式にアクセスすることです。
public function setxxxx($val){
$this->gt;xxxx=$val;
public function getxxxx(){
return $this-> >salary; // 拡張機能: ユーザー名などの判断など、ここでいくつかのメソッドを呼び出し、それが正しい場合にのみアクセスを許可できます

}
$p1->getsalary();
If protected および private にアクセスするには、次のメソッドを使用することもできますが、これらは推奨されません。
__set() および __get ()
__set() 値を protected 属性または private 属性に割り当てます。
__set( $name,$val);
__get() は protected または private の値を取得します
__get($name) ;
例:



コードをコピーします

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


クラスtesta{
protected $name;
//すべての属性を管理するには __set() を使用します
public function __set($pro_name,$pro_val){

//上記の $pro_name と $pro_val はカスタマイズできます//$this->pro_name 以下は確立されており、変更できません$this->pro_name =$pro_val; } //すべての属性値を取得するには __get() を使用しますパブリック関数 __get($pro_name){

if(isset($pro_name)){
return $this->pro_name;
} else {
return null; 🎜>}
}
$n1=new testa();
//通常、保護された属性はクラス外からアクセスできませんが、上記のメソッドを使用して操作できます
$n1- >name='小三';
echo $n1->name; >


// を使用することはお勧めできません。 it

2. 継承

まず例を見てみましょう:



コードをコピーします

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


class Pupil{
public $name;
protected $age; public function getinfo(){ echo $this-> name.'||'.$this->age;
}
public function testing(){

echo 'this is students'; } } class 卒業生{ public

protected $age;

public function getinfo(){
echo $this->
}
public function testing(){
echo 'this is Grade';
}
}
?> ;


上記からわかるようにたとえば、複数のクラスに共通の属性やメソッドが多い場合、コードの再利用性が高くなく、コードが冗長になります。 CSS での処理方法を考える
解決策: Inherit



Copyコード

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


class Students{
public $name;
public $age;
public function __construct($name,$age){
$this- >name=$name;
$this->age=$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 'Graduate '.$this->name.' is testing'; >}
$stu1=new Pupil('张三',20);
$stu1->showinfo();
echo '
'; >testing();
?>


上記からわかるように、継承は親クラスをパブリックに拡張し、親クラスで保護されるサブクラス ( BaseClass) 属性とメソッドは継続され、プライベートな属性とメソッドを継承できません
構文構造:

class 親クラス名 {}
class サブクラス名 extends 親クラス名 {}
詳細:
1 、サブクラスは 1 つの親クラスのみを継承できます (ここでは直接継承を指します)。複数のクラスの属性とメソッドを継承したい場合は、マルチレベル継承
を使用できます。 例:



コードをコピーします

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

public $name='AAA'; 🎜>}
クラス B は A を拡張します{
public $age=30;
クラス C は B を拡張します{}
$p=new C(); ->name;//ここでは AAA が出力されます
?>2. サブクラス オブジェクトを作成するとき、その親クラスのコンストラクターはデフォルトでは自動的に呼び出されません。 > 例:
class A{
public function __construct(){
echo 'A';
}
}
class B extends A{
public function __construct() {

echo 'B ';
}
}
$b=new B();//B にコンストラクターがない場合は、 の A が出力されます。 3. サブクラス内の親クラスのメソッドにアクセスする必要がある場合 (コンストラクターおよびメンバー メソッドの修飾子がプロテクトまたはプライベートである場合)、親クラス::メソッド名または親:: を使用できます。完了するメソッド名 [ここで親と前の前提] 受け取った自分自身はすべて小文字で、エラーは大文字で報告されます]
class A{
public function test(){
echo 'a_test';
}
}
class B extends A{
public function __construct(){
//両方のメソッドが機能します
A::test()
parent:: test();
}
}
$b=new B();
5. サブクラス (派生クラス) のメソッドが親クラスのメソッドとまったく同じである場合 ( public、protected)、これをメソッド カバレッジまたはメソッド オーバーライドと呼びます。

3. ポリモーフィズム

例:



をコピーします。 code

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

class Animal{
public $name;
public $price; cry(){

echo 'i don't know' ; } } class Dog extends Animal{ //オーバーライド、オーバーライド

関数 cry(){

echo 'Wang Wang!';
Animal::cry();//ここではエラーは報告されず、親クラスの cry() は正しく実行できます。 🎜>$dog1=new Dog();
$dog1->cry( );

概要:
1.すべてのサブクラスにはメソッドがありますが、親クラスがメソッドの書き方を知らない場合は、サブクラスがそのメソッドをオーバーライドできるようにすることができます。メソッドのオーバーライド (書き換え) では、サブクラスのメソッド名とパラメーターの数が正確である必要があります。同じ
2. サブクラスが親クラス (protected/public) のメソッドを呼び出したい場合は、親クラス名::メソッド名または親::メソッド名を使用できます
3. メソッドの書き換えを実装する場合、アクセス修飾子は異なっていても構いませんが、サブクラス メソッドのアクセス権は親クラス メソッドのアクセス権以上でなければなりません (つまり、親クラス メソッドのアクセス権を減らすことはできません)
たとえば、親クラスの public 関数 cry(){} とサブクラスの protected 関数 cry(){} がエラーを報告する場合、
ただし、サブクラスのアクセス許可は次のように拡大できます。
Parentクラスプライベート関数cry(){} サブクラス保護関数cry(){}は正しく実行できます
拡張:
メソッドオーバーロード(オーバーロード)
基本概念:関数名は同じですが、パラメータの数が異なります同じ関数を呼び出した場合でも、異なる関数を区別できます。
PHP5 ではオーバーロードもサポートされていますが、それでも他の言語とは大きく異なります。PHP では複数の関数を定義できません。同じ名前の
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){
$this->test2($p)
}
}
}
}
$a=new A ();
$a->test(3,5);


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。