初心者向けの PHP オブジェクト指向入門
オブジェクト指向とは
オブジェクトは、情報とその情報を処理する方法の記述で構成される全体です
オブジェクト指向プログラミングは、OOPと呼ばれます
。現実の社会、私たちが直面しているもの 物とは、コンピューター、カップ、家などのオブジェクトです
オブジェクトの 3 つの主な特徴
1. オブジェクトの動作: オブジェクトにどのような操作を適用できるか、ライトのオン/オフ行動です。
2. オブジェクトの形状: これらのメソッドが適用されたときのオブジェクトの反応、色、サイズ、外観。
3. オブジェクトの表現: オブジェクトの表現は ID カードと同等であり、特に同じ動作とステータスの違いを区別します
オブジェクト指向コンテンツ
1.クラス: 抽象を定義します。何かの特徴。クラスの定義には、データの形式とデータに対する操作が含まれます
2.オブジェクト: クラスのインスタンスです
3.メンバー変数: クラス内で定義された変数。この変数の値は外部からは見えませんが、クラスがオブジェクトとしてインスタンス化された後は、その変数をオブジェクトの属性と呼ぶことができます
4.メンバー関数: 内部で定義されます。オブジェクトのデータにアクセスするために使用できるクラスです
5. 継承 : 継承は、サブクラスが親クラスのデータ構造とメソッドを自動的に共有するメカニズムです。これはクラス間の関係です。クラスを定義して実装するときは、既存のクラスに基づいて実行したり、既存のクラスで定義されたコンテンツを独自のコンテンツとして使用したり、新しいコンテンツを追加したりすることができます
6. 親クラス: クラスこのクラスは、他のクラスによって継承されます。このクラスは、親クラス、基本クラス、またはスーパークラスと呼ばれます
7.サブクラス: 他のクラスを継承するクラスは、サブクラスと呼ばれたり、派生クラスと呼ばれたりすることもあります
8.ポリモーフィズム: ポリモーフィズムとは、同じ操作、関数、またはプロセスが複数の種類のオブジェクトに作用し、異なる結果が得られることを意味します。同じメッセージを受信した後、異なるオブジェクトが異なる結果を生成する可能性があります。この現象はポリモーフィズムと呼ばれます
9.オーバーロード: 簡単に言えば、関数またはメソッドの名前は同じですが、パラメーター リストが異なる状況です。同じ名前で異なるパラメーターはオーバーロードされた関数またはメソッドと呼ばれます
10.抽象性: 抽象化とは、同じ名前で異なるパラメーターを持つ関数またはメソッドがオーバーロードされた関数またはメソッドと呼ばれ、オブジェクトがクラスに抽象化されることを意味します。クラスは、アプリケーションに関連する重要なプロパティを反映し、その他の無関係なコンテンツを無視する抽象化です。クラスの分割は主観的ですが、特定のアプリケーションに関連している必要があります
11.カプセル化: カプセル化とは、現実世界に存在するオブジェクトのプロパティと動作をバインドし、それを論理的なユニットに配置することを指します
12.Constructor; は、主にオブジェクトの作成時にオブジェクトを初期化するために使用されます。つまり、オブジェクトを作成するステートメント内で常に new 演算子と一緒に使用されます。
13.Destructor: デストラクター (デストラクター) コンストラクターとは反対に、オブジェクトがそのライフサイクルを終了するとき (たとえば、オブジェクトが配置されている関数が呼び出されたとき)、システムは自動的にデストラクターを実行します。デストラクターは、「クリーンアップ」作業を行うためによく使用されます (たとえば、オブジェクトを作成するときに、 new を使用してメモリー空間を開きます。このメモリー空間は、終了する前にデストラクター内の delete で解放する必要があります)
クラス定義:
1. クラスは、class キーワードに続いてクラス名を使用して定義されます。
2. 変数とメソッドは、クラス名の後の中括弧 ({}) 内で定義できます。
3. クラス変数は var を使用して宣言され、変数の初期化も可能です。
4. 関数の定義は PHP 関数の定義に似ていますが、この関数にはクラスとそのインスタンス化されたオブジェクトを通じてのみアクセスできます
<?php class Site { /* 成员变量 */ var $url; var $title; /* 成员函数 */ function setUrl($par){ $this->url = $par; } function getUrl(){ echo $this->url; } function setTitle($par){ $this->title = $par; } function getTitle(){ echo $this->title; } } //注:变量 $this 代表自身的对象。 ?>
クラスを作成した後、php でオブジェクトを作成します。 new 演算子を使用して、このクラスのオブジェクトをインスタンス化できます$php = new Site;
$taabao = new Site;
$google = new Site;
上記のコードでは 3 つのオブジェクトを作成し、それぞれ3つのオブジェクトは独立しています
<?php header("Content-type: text/html; charset=utf-8");//设置编码 class Site { /* 成员变量 */ var $url; var $title; /* 成员函数 */ function setUrl($par){ $this->url = $par; } function getUrl(){ echo $this->url . "</br>"; } function setTitle($par){ $this->title = $par; } function getTitle(){ echo $this->title . "</br>"; } } $php = new Site; $taobao = new Site; $google = new Site; // 调用成员函数,设置标题和URL $php->setTitle( "php中文网" ); $taobao->setTitle( "淘宝" ); $google->setTitle( "Google 搜索" ); $php->setUrl( 'www.php.cn' ); $taobao->setUrl( 'www.taobao.com' ); $google->setUrl( 'www.google.com' ); // 调用成员函数,获取标题和URL $php->getTitle(); $taobao->getTitle(); $google->getTitle(); $php->getUrl(); $taobao->getUrl(); $google->getUrl(); ?>
Constructor
Constructorは特別なメソッドです。これは主に、オブジェクトの作成時にオブジェクトを初期化するために使用されます。つまり、オブジェクトを作成するステートメントで常に new 演算子と一緒に使用されます。クラス内のメソッドを Constructor として定義する場合、構文形式は次のとおりです。 void __construct ([mixed $args [, $... ]] )
Destructor
Destructor (デストラクター) の逆コンストラクター、オブジェクトが終了するとき (たとえば、オブジェクトが配置されている関数が呼び出されたとき)、システムは自動的にデストラクターを実行します。
PHP 5 では、他のものと同様のデストラクターの概念が導入されています。オブジェクト指向言語の構文形式は次のとおりです。 void __destruct (void)<?php
header("Content-type: text/html; charset=utf-8");//设置编码
class MyDestructableClass {
function __construct() {
print "构造函数</br>";
$this->name = "MyDestructableClass";
}
function __destruct() {
print "销毁 " . $this->name;
}
}
$obj = new MyDestructableClass();
?>
Inherit
PHP は、クラスの継承にキーワード extends を使用します。
class Child extends Parent { <?php
// 子类扩展站点类别
class Child_Site extends Site {
var $category;
function setCate($par){
$this->category = $par;
}
function getCate(){
echo $this->category;
}
}
?>
親クラスから継承されたメソッドがサブクラスのニーズを満たせない場合、このプロセスはメソッドのオーバーライドと呼ばれます。メソッド書き換え
<?php function getUrl() { echo $this->url . PHP_EOL; return $this->url; } function getTitle(){ echo $this->title . PHP_EOL; return $this->title; } ?>アクセス制御
public
(public): パブリック クラス メンバーにはどこからでもアクセスできます。protected (protected): 保護されたクラスのメンバーは、それ自体、そのサブクラス、親クラスからアクセスできます。 private (プライベート): プライベート クラスのメンバーには、それが定義されているクラスからのみアクセスできます。 属性のアクセス制御 クラス属性は、public、protected、privateのいずれかとして定義する必要があります。 var で定義されている場合、public とみなされます メソッドのアクセス制御 クラス内のメソッドは、public、private、または protected として定義できます。これらのキーワードが設定されていない場合、メソッドはデフォルトで public Constant クラス内で常に変更されない値を定数として定義できます。定数を定義および使用するときに $ 記号を使用する必要はありません。 定数の値は固定値である必要があり、変数、クラス属性、数学的演算や関数呼び出しの結果にすることはできません。 PHP 5.3.0 以降、変数を使用してクラスを動的に呼び出すことができます。ただし、この変数の値をキーワード (self、parent、static など) にすることはできません 抽象クラス 任意のクラス、その中の少なくとも 1 つのメソッドが抽象として宣言されている場合、このクラスは次のように宣言されている必要があります抽象的な。 抽象として定義されたクラスはインスタンス化できません。 abstract として定義されたメソッドは、その呼び出しメソッド (パラメーター) を宣言するだけであり、その特定の関数の実装を定義することはできません。 抽象クラスを継承する場合、サブクラスは親クラスのすべての抽象メソッドを定義する必要があります。また、これらのメソッドのアクセス制御は親クラスと同じ (またはより緩和された) 必要があります。たとえば、抽象メソッドが protected として宣言されている場合、サブクラスに実装されているメソッドは protected または public として宣言する必要があり、private として定義することはできません。さらに、メソッドを呼び出すメソッドは一致している必要があります。つまり、必要なパラメータの型と数が一致している必要があります。たとえば、サブクラスがオプションのパラメータを定義しているが、それが親クラスの抽象メソッドの宣言に含まれていない場合、2 つの宣言の間に競合はありません Interface interface を使用すると、特定のクラスがどのメソッドを実装するかを指定できますが、これらのメソッドの具体的な内容を定義する必要はありません。 インターフェースは、標準クラスを定義するのと同じように、interface キーワードを通じて定義されますが、その中で定義されているメソッドはすべて空です。 インターフェースで定義されるすべてのメソッドはパブリックである必要があります。これはインターフェースの特性です。 インターフェースを実装するには、implements 演算子を使用します。クラスは、インターフェイスで定義されているすべてのメソッドを実装する必要があります。実装しない場合は、致命的なエラーが報告されます。クラスは複数のインターフェイスを実装できます。複数のインターフェイスの名前を区切るにはカンマを使用します。 <?php
/**
* Define MyClass
*/
class MyClass
{
public $public = 'Public';
protected $protected = 'Protected';
private $private = 'Private';
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$obj = new MyClass();
echo $obj->public; // 这行能被正常执行
//echo $obj->protected; // 这行会产生一个致命错误
//echo $obj->private; // 这行也会产生一个致命错误
$obj->printHello(); // 输出 Public、Protected 和 Private
/**
* Define MyClass2
*/
class MyClass2 extends MyClass
{
// 可以对 public 和 protected 进行重定义,但 private 而不能
protected $protected = 'Protected2';
function printHello()
{
echo $this->public;
echo $this->protected;
//echo $this->private;
}
}
$obj2 = new MyClass2();
echo $obj2->public; // 这行能被正常执行
//echo $obj2->private; // 未定义 private
//echo $obj2->protected; // 这行会产生一个致命错误
$obj2->printHello(); // 输出 Public、Protected2 和 Undefined
?>
<?php
/**
* Define MyClass
*/
class MyClass
{
// 声明一个公有的构造函数
public function __construct() { }
// 声明一个公有的方法
public function MyPublic() { }
// 声明一个受保护的方法
protected function MyProtected() { }
// 声明一个私有的方法
private function MyPrivate() { }
// 此方法为公有
function Foo()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate();
}
}
$myclass = new MyClass;
$myclass->MyPublic(); // 这行能被正常执行
//$myclass->MyProtected(); // 这行会产生一个致命错误
//$myclass->MyPrivate(); // 这行会产生一个致命错误
$myclass->Foo(); // 公有,受保护,私有都可以执行
/**
* Define MyClass2
*/
class MyClass2 extends MyClass
{
// 此方法为公有
function Foo2()
{
$this->MyPublic();
$this->MyProtected();
// $this->MyPrivate(); // 这行会产生一个致命错误
}
}
$myclass2 = new MyClass2;
$myclass2->MyPublic(); // 这行能被正常执行
$myclass2->Foo2(); // 公有的和受保护的都可执行,但私有的不行
class Bar
{
public function test() {
$this->testPrivate();
$this->testPublic();
}
public function testPublic() {
echo "Bar::testPublic\n";
}
private function testPrivate() {
echo "Bar::testPrivate\n";
}
}
class Foo extends Bar
{
public function testPublic() {
echo "Foo::testPublic\n";
}
private function testPrivate() {
echo "Foo::testPrivate\n";
}
}
$myFoo = new foo();
$myFoo->test(); // Bar::testPrivate
// Foo::testPublic
?>