ホームページ  >  記事  >  バックエンド開発  >  PHP におけるオブジェクト指向

PHP におけるオブジェクト指向

WBOY
WBOYオリジナル
2016-07-30 13:30:021070ブラウズ

アクセス制御 (可視性)

PHP のアクセス制御には、パブリック、プロテクト、プライベートが含まれます

パブリックとして定義されたクラス メンバーはどこからでもアクセスできます。
保護されたものとして定義されたクラス メンバーは、それ自体、そのサブクラス、および親クラスからアクセスできます。
プライベートとして定義されたクラス メンバーには、そのメンバーが定義されているクラスのみがアクセスできます。

class の変更には使用できませんclass

类属性不能省略,必须定义为公有,受保护,私有之一。

类中的方法如果没有设置这些关键字,则该方法默认为公有。

同一个类的对象即使不是同一个实例也可以互相访问对方的私有与受保护成员。这是由于在这些对象的内部具体实现的细节都是已知的。


属性

用 ->(对象运算符):$this->property(其中 property 是该属性名)这种方式来访问非静态属性。静态属性则是用 ::(双冒号):self::$property 来访问

$this 是一个到主叫对象的引用


类常量

可以把在类中始终保持不变的值定义为常量。在定义和使用常量的时候不需要使用 $ 符号

常量的值必须是一个定值,不能是变量,类属性,数学运算的结果或函数调用

用双冒号::访问

<code>const constant = 'constant value';
</code>

自动加载类

很多开发者写面向对象的应用程序时对每个类的定义建立一个 PHP 源文件。一个很大的烦恼是不得不在每个脚本开头写一个长长的包含文件列表(每个类一个文件)。

在 PHP 5 中,不再需要这样了。可以定义一个 spl_autoload_register() 函数,它会在试图使用尚未被定义的类时自动调用。通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。

<code><?php

// function __autoload($class) {
//     include 'classes/' . $class . '.class.php';
// }

function my_autoloader($class) {
    include 'classes/' . $class . '.class.php';
}

spl_autoload_register('my_autoloader');

// 或者,自 PHP 5.3.0 起可以使用一个匿名函数
spl_autoload_register(function ($class) {
    include 'classes/' . $class . '.class.php';
});

?>
</code>

构造函数和析构函数

构造函数和析构函数不会被引擎暗中调用。要执行父类的构造函数和析构函数,必须在子类的构造函数体和析构函数体中显式调用 parent::__construct(); parent::__destruct()


继承

除非使用了自动加载,否则一个类必须在使用之前被定义。如果一个类扩展了另一个,则父类必须在子类之前被声明。此规则适用于类继承其它类与接口。

继承使用extends关键字


范围解析操作符(::)

范围解析操作符(也可称作 Paamayim Nekudotayim)或者更简单地说是一对冒号,可以用于访问静态成员,类常量


Static(静态)关键字

声明类属性或方法为静态,就可以不实例化类而直接访问。静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。

静态属性和方法默认为公有


抽象类

使用关键字abstract

クラス属性は省略できず、public、protected、private のいずれかとして定義する必要があります。

これらのキーワードがクラス内のメソッドに設定されていない場合、メソッドはデフォルトで public になります。

同じクラスのオブジェクトは、同じインスタンスでなくても、互いのプライベートメンバーと保護されたメンバーにアクセスできます。これは、これらのオブジェクトの内部実装の詳細がわかっているためです。


プロパティ

-> (オブジェクト演算子): $this->property (property はプロパティの名前) を使用して、非静的プロパティにアクセスします。静的プロパティには、:: (二重コロン): self::$property を使用してアクセスします

$this は呼び出し元オブジェクトへの参照です

クラス定数

はクラス A の値に配置できます常に同じになるものを定数として定義します。定数を定義して使用するときに、$ 記号を使用する必要はありません

定数の値は、変数、クラス属性、数学的演算や関数呼び出しの結果ではなく、固定値である必要があります


二重コロンを使用してください: : アクセス

<code><?php
trait ezcReflectionReturnInfo {
    function getReturnType() { /*1*/ }
    function getReturnDescription() { /*2*/ }
}

class ezcReflectionMethod extends ReflectionMethod {
    use ezcReflectionReturnInfo;
    /* ... */
}

class ezcReflectionFunction extends ReflectionFunction {
    use ezcReflectionReturnInfo;
    /* ... */
}
?>
</code>

自動的にクラスをロード

多くの開発者は、オブジェクト指向アプリケーションを作成するときに、クラス定義ごとに PHP ソース ファイルを作成します。大きな煩わしさは、各スクリプトの先頭にインクルード ファイルの長いリスト (クラスごとに 1 つのファイル) を記述しなければならないことです。


PHP 5 では、これは必要なくなりました。まだ定義されていないクラスを使用しようとしたときに自動的に呼び出される spl_autoload_register() 関数を定義することができます。この関数を呼び出すことにより、スクリプト エンジンは、PHP がエラーで失敗する前に、必要なクラスをロードする最後のチャンスを得ることができます。

<code><?php
trait Hello {
    public function sayHello() {
        echo 'Hello ';
    }
}

trait World {
    public function sayWorld() {
        echo 'World';
    }
}

class MyHelloWorld {
    use Hello, World;
    public function sayExclamationMark() {
        echo '!';
    }
}
?>
</code>

コンストラクターとデストラクター

コンストラクターとデストラクターは、エンジンによって秘密裏に呼び出されません。親クラスのコンストラクターとデストラクターを実行するには、子クラスのコンストラクター本体とデストラクター本体で parent::__construct();parent::__destruct()
を明示的に呼び出す必要があります。


自動ロードが使用されない限り、クラスは使用する前に定義する必要があります。あるクラスが別のクラスを拡張する場合、親クラスは子クラスの前に宣言する必要があります。このルールは、他のクラスおよびインターフェイスを継承するクラスに適用されます。

extends キーワードを使用して継承されます


範囲解析演算子 (::)

範囲解析演算子 (Paamayim Nekudotayim とも呼ばれます)、またはより単純にコロンを使用できます静的メンバー、クラス定数にアクセスするには

Static (静的) キーワード 🎜🎜 は、クラスの属性またはメソッドを静的として宣言し、クラスをインスタンス化せずに直接アクセスできます。インスタンス化されたクラスのオブジェクトを介して静的プロパティにアクセスすることはできません (ただし、静的メソッドはアクセスできます)。 🎜🎜静的プロパティとメソッドはデフォルトでパブリックです🎜🎜🎜抽象クラス🎜🎜キーワードabstractを使用してください🎜🎜任意のクラス、その中の少なくとも1つのメソッドが抽象宣言されている場合、このクラスは抽象的に宣言されました。 🎜🎜abstract として定義されたメソッドは、その呼び出しメソッド (パラメーター) を宣言するだけであり、その特定の関数の実装を定義することはできません。 🎜🎜抽象クラスを継承する場合、サブクラスは親クラスのすべての抽象メソッドを定義する必要があります。さらに、これらのメソッドのアクセス制御は親クラスと同じ (またはより緩和された) ものである必要があります。インターフェースキーワードを介して 🎜🎜インターフェースで定義されるすべてのメソッドはパブリックである必要があります。これはインターフェースの特性です。🎜🎜定数もインターフェースで定義できます。インターフェイス定数とクラス定数の使用方法はまったく同じですが、インターフェイスを実装するには、implements 演算子を使用します。クラスは、インターフェイスで定義されたすべてのメソッドを実装する必要があります。実装しない場合は、致命的なエラーが報告されます。クラスは複数のインターフェイスを実装できます。複数のインターフェイスの名前を区切るにはカンマを使用します。 🎜🎜インターフェースはインターフェースを継承することもできます🎜🎜🎜トレイト🎜🎜 PHP 5.4.0 以降、PHP はトレイトと呼ばれるコード再利用の方法を実装しています。 🎜rrreee🎜 use ステートメント内の複数の特性をコンマで区切ってリストします🎜rrreee🎜🎜Magic Method🎜🎜__construct() 🎜 __destruct() 🎜 __call() 🎜 __callStatic() 🎜 __get() 🎜 __set() 🎜 __isset() 🎜 __unset() 🎜 __sleep() Serialize() 関数は、クラスにマジック メソッド __sleep() が存在するかどうかをチェックします。存在する場合、このメソッドが最初に呼び出され、次にシリアル化操作が実行されます。 🎜 __wakeup() unserialize() は、__wakeup() メソッドがあるかどうかを確認します。存在する場合、__wakeup メソッドが最初に呼び出されます 🎜 __toString() は、クラスが文字列として扱われるときにクラスがどのように応答するかを記述するために使用されます 🎜 __invoke() 関数を呼び出してオブジェクトを呼び出そうとすると、__invoke() メソッドが自動的に呼び出されます 🎜 __set_state() この静的メソッドは、クラスをエクスポートするために var_export() が呼び出されるときに呼び出されます 🎜 __クローン() 🎜 オブジェクトの使用時に __debugInfo() var_dump() が呼び出されます🎜

これらの関数は、PHP では「マジック メソッド」と呼ばれます。マジック機能を使用しない限り、独自のクラス メソッドに名前を付けるときにこれらのメソッド名を使用することはできません。

アクセスできないプロパティに値を割り当てる場合、__set() が呼び出されます。

アクセスできないプロパティの値を読み取る場合、__get() が呼び出されます。

__isset() は、アクセスできないプロパティに対して isset() または empty() が呼び出されたときに呼び出されます。

アクセスできないプロパティに対して unset() が呼び出される場合、 __unset() が呼び出されます。

オブジェクト内のアクセスできないメソッドを呼び出すと、__call() が呼び出されます。

静的モードでアクセスできないメソッドを呼び出すと、__callStatic() が呼び出されます。


Finalキーワード

親クラスのメソッドがfinalと宣言されている場合、サブクラスはそのメソッドをオーバーライドできません。クラスがfinalと宣言されている場合、そのクラスを継承することはできません。

プロパティをfinalとして定義することはできません。finalとして定義できるのはクラスとメソッドのみです


オブジェクトのコピー

オブジェクトのコピーは、 clone キーワードを通じて実行できます(これにより、可能であればオブジェクトの __clone() メソッドが呼び出されます)。オブジェクト内の __clone() メソッドを直接呼び出すことはできません。


オブジェクト比較

比較演算子 (==) を使用して 2 つのオブジェクト変数を比較する場合、比較の原則は次のとおりです: 2 つのオブジェクトの属性と属性値が等しく、2 つのオブジェクトが次のインスタンスであるかどうか同じ class の場合、2 つのオブジェクト変数は等しいです。

等価演算子 (===) を使用する場合、これら 2 つのオブジェクト変数は特定のクラスの同じインスタンス (つまり、同じオブジェクト) を指している必要があります。


型制約

PHP 5 では型制約を使用できます。関数パラメータは、オブジェクト (関数プロトタイプでクラス名を指定)、インターフェイス、配列 (PHP 5.1 以降)、または呼び出し可能 (PHP 5.4 以降) として指定できます。ただし、パラメーターのデフォルト値として NULL を使用した場合でも、関数を呼び出すときに実際のパラメーターとして NULL を使用できます。

型制約は、int や string などのスカラー型には使用できません。特性も許可されません。

型制約はクラスのメンバー関数で使用されるだけでなく、関数でも使用できます


オブジェクトのシリアル化

PHPのすべての値は関数serialize()を使用して、バイトストリームを含む文字列を返すことができます代表する。 unserialize() 関数は、文字列を PHP の元の値に戻すことができます。 オブジェクトをシリアル化すると、オブジェクトのすべての変数が保存されますが、オブジェクトのメソッドは保存されません。


著作権声明: この記事はブロガーによるオリジナルの記事であり、ブロガーの許可なく複製することはできません。

以上、PHP におけるオブジェクト指向について、その側面も含めて紹介しましたが、PHP チュートリアルに興味のある友人に役立つことを願っています。

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