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

オブジェクト指向オブジェクトの 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 までご連絡ください。
php怎么把负数转为正整数php怎么把负数转为正整数Apr 19, 2022 pm 08:59 PM

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

php怎么实现几秒后执行一个函数php怎么实现几秒后执行一个函数Apr 24, 2022 pm 01:12 PM

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php怎么除以100保留两位小数php怎么除以100保留两位小数Apr 22, 2022 pm 06:23 PM

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

php怎么根据年月日判断是一年的第几天php怎么根据年月日判断是一年的第几天Apr 22, 2022 pm 05:02 PM

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php怎么判断有没有小数点php怎么判断有没有小数点Apr 20, 2022 pm 08:12 PM

php判断有没有小数点的方法:1、使用“strpos(数字字符串,'.')”语法,如果返回小数点在字符串中第一次出现的位置,则有小数点;2、使用“strrpos(数字字符串,'.')”语句,如果返回小数点在字符串中最后一次出现的位置,则有。

php字符串有没有下标php字符串有没有下标Apr 24, 2022 am 11:49 AM

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php怎么替换nbsp空格符php怎么替换nbsp空格符Apr 24, 2022 pm 02:55 PM

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\&nbsp\;||\xc2\xa0)/","其他字符",$str)”语句。

php怎么读取字符串后几个字符php怎么读取字符串后几个字符Apr 22, 2022 pm 08:31 PM

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

See all articles

ホット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ヘンタイを無料で生成します。

ホットツール

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

メモ帳++7.3.1

メモ帳++7.3.1

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

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター