ホームページ バックエンド開発 Python チュートリアル PHP オブジェクト指向の 3 つの主要な特徴を学びます

PHP オブジェクト指向の 3 つの主要な特徴を学びます

Apr 08, 2018 pm 12:30 PM
php 勉強 特徴

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

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

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

<?php 
class Person{ 
public $name; 
protected $age; 
private $salary; 
function __construct($name,$age,$salary){ 
$this->name=$name; 
$this->age=$age; 
$this->salary=$salary; 
} 
public function showinfo(){ 
//这表示三个修饰符都可以在本类内部使用 
echo $this->name."||".$this->age."||".$this->salary; 
} 
} 
$p1=new Person(&#39;张三&#39;,20,3000); 
//这里属于类外部,那么如果用下面的方法访问age和salary都会报错 
// 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() は protected 属性または private 属性に値を代入します
__set($name,$val); () protected または private の値を取得します
__get($name);
例:


コードをコピーします

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

<?php 
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(); 
//正常情况,类外部是不能访问protected属性的,但是用了上面的方法就可以对它们进行操作 
$n1->name=&#39;小三&#39;; 
echo $n1->name; 
?>
ログイン後にコピー
//上記のコードは理解するのに十分ですが、推奨されません。使用する

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

コードをコピーします

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

<?php 
class Pupil{ 
public $name; 
protected $age; 
public function getinfo(){ 
echo $this->name.&#39;||&#39;.$this->age; 
} 
public function testing(){ 
echo &#39;this is pupil&#39;; 
} 
} 
class Graduate{ 
public $name; 
protected $age; 
public function getinfo(){ 
echo $this->name.&#39;||&#39;.$this->age; 
} 
public function testing(){ 
echo &#39;this is Graduate&#39;; 
} 
} 
?>
ログイン後にコピー

上記の例から、複数のクラスが多くの共通の属性を持っていることがわかります。 CSS での処理方法を考える

解決策: Inherit


コードをコピー

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

<?php 
class Students{ 
public $name; 
public $age; 
public function __construct($name,$age){ 
$this->name=$name; 
$this->age=$age; 
} 
public function showinfo(){ 
echo $this->name.&#39;||&#39;.$this->age; 
} 
} 
class Pupil extends Students{ 
function testing(){ 
echo &#39;Pupil &#39;.$this->name.&#39; is testing&#39;; 
} 
} 
class Graduate extends Students{ 
function testing(){ 
echo &#39;Graduate &#39;.$this->name.&#39; is testing&#39;; 
} 
} 
$stu1=new Pupil(&#39;张三&#39;,20); 
$stu1->showinfo(); 
echo &#39;<br/>&#39;; 
$stu1->testing(); 
?>
ログイン後にコピー
上記からわかるように、継承とは、サブクラス (Subclass) が親クラス (BaseClass) のパブリック属性と保護された属性とメソッドを継承することです。 構文構造:

class 親クラス名 {}

class。サブクラス名は親クラス名を拡張します {}
詳細:
1. サブクラスは 1 つの親クラスのみを継承できます (ここでは、複数のクラスの属性とメソッドを継承することを指します)。
例:



コードをコピーします

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

<?php 
class A{ 
public $name=&#39;AAA&#39;; 
} 
class B extends A{ 
public $age=30; 
} 
class C extends B{} 
$p=new C(); 
echo $p->name;//这里会输出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::method 名またはparent::method 名を使用して完成させることができます [ここで、parent と前述の self は両方とも小文字であり、エラーは大文字で報告されます]
class A{
public function test(){
echo 'a_test';
}
}
class B extends A{
public function __construct(){
//どちらのメソッドも機能します
A::test(); ;
}
}
$b=new B(); 5. サブクラス (派生クラス) のメソッドが親クラス (public、protected) のメソッドとまったく同じである場合、それをメソッドのオーバーライドと呼びます。メソッドのオーバーライド (オーバーライド)、下記を参照 ポリモーフィズム

3. ポリモーフィズム

例:



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

<?php 
class Animal{ 
public $name; 
public $price; 
function cry(){ 
echo &#39;i don\&#39;t know&#39;; 
} 
} 
class Dog extends Animal{ 
//覆盖、重写 
function cry(){ 
echo &#39;Wang Wang!&#39;; 
Animal::cry();//这里不会报错,能正确执行父类的cry(); 
} 
} 
$dog1=new Dog(); 
$dog1->cry(); 
?>
ログイン後にコピー


小结:
1、当一个父类知道所有的子类都有一个方法,但是父类不能确定该方法如何写,可以让子类去覆盖它的方法,方法覆盖(重写),必须要求子类的方法名和参数个数完全一致
2、如果子类要去调用父类的某个方法(protected/public),可以使用 父类名::方法名 或者 parent::方法名
3、在实现方法重写的时候,访问修饰符可以不一样,但是子类方法的访问权限必须大于等于父类方法的访问权限(即不能缩小父类方法的访问权限)
如 父类public function cry(){} 子类 protected function cry(){} 则会报错
但是子类的访问权限可以放大,如:
父类private function cry(){} 子类 protected function cry(){} 可以正确执行
扩展:
方法重载(overload)
基本概念:函数名相同,但参数的个数或参数的类型不同,达到调用同一个函数,可以区分不同的函数
在PHP5中虽然也支持重载,但是和其它语言还是有很大区别的,php中不能定义多个同名函数
PHP5中提供了强大的“魔术”函数,使用这些魔术函数,我们可以做到函数重载,
这里我们要到到 __call,当一个对象调一个方法时,而该方法不存在,则程序会自动调用__call
【官方不推荐使用】
PHP中有以下几个魔术常量:__LINE__ __FILE__ __DIR__ __FUNCTION__ __CLASS__ 等
例:

复制代码 代码如下:

<?php 
class A{ 
function test1($p){ 
echo &#39;test1<br/>&#39;; 
} 
function test2($p){ 
echo &#39;test2<br/>&#39;; 
} 
function __call($method,$p){ 
//这里$p为数组,上面两个变量名可自定义 
if($method == &#39;test&#39;){ 
if(count($p)==1){ 
$this->test1($p); 
} else if(count($p)==2){ 
$this->test2($p); 
} 
} 
} 
} 
$a=new A(); 
$a->test(5); 
$a->test(3,5); 
?>
ログイン後にコピー

相关推荐:

PHP面向对象五大原则之依赖倒置原则(DIP)详解_php技巧

PHP面向对象五大原则之里氏替换原则(LSP)详解

PHP面向对象五大原则之开放-封闭原则(OCP)详解

以上がPHP オブジェクト指向の 3 つの主要な特徴を学びますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP の日付と時刻 CakePHP の日付と時刻 Sep 10, 2024 pm 05:27 PM

Cakephp4 で日付と時刻を操作するには、利用可能な FrozenTime クラスを利用します。

CakePHP について話し合う CakePHP について話し合う Sep 10, 2024 pm 05:28 PM

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP バリデータの作成 CakePHP バリデータの作成 Sep 10, 2024 pm 05:26 PM

Validator は、コントローラーに次の 2 行を追加することで作成できます。

CakePHP のロギング CakePHP のロギング Sep 10, 2024 pm 05:26 PM

CakePHP へのログインは非常に簡単な作業です。使用する関数は 1 つだけです。 cronjob などのバックグラウンド プロセスのエラー、例外、ユーザー アクティビティ、ユーザーが実行したアクションをログに記録できます。 CakePHP でのデータのログ記録は簡単です。 log()関数が提供されています

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

CakePHP クイックガイド CakePHP クイックガイド Sep 10, 2024 pm 05:27 PM

CakePHP はオープンソースの MVC フレームワークです。これにより、アプリケーションの開発、展開、保守がはるかに簡単になります。 CakePHP には、最も一般的なタスクの過負荷を軽減するためのライブラリが多数あります。

See all articles