クラスとオブジェクト
クラスの構築
オブジェクトの作成
PHPのガベージコレクションの仕組み
$ この説明
PHP はオブジェクト指向プログラミング言語ですが、オブジェクト指向とは何ですか?なぜオブジェクト指向にしなければならないのでしょうか?私たちの生活の中には、コップや箱など、物であるものがたくさんありますが、それらはそれぞれに個性があり、すべてが物です。そして私たちの開発もオブジェクト指向プログラミングに基づいています。オブジェクトとは、最も単純な整数から複雑な飛行機に至るまで、人々が研究したいと思うものすべてです。オブジェクト指向プログラミングを使用すると、問題を包括的に把握できるようになり、データの管理と保守にも役立ちます。PHP では、オブジェクト指向プログラミングは 2 つのカテゴリに分類できます。1 つはオブジェクトを作成するモデルです。もう 1 つはモデルを使用して作成されたオブジェクトですが、この 2 つはどのような関係にあるのでしょうか。
クラスとオブジェクト: 同じ特性 (データ要素) と動作 (関数) を持つオブジェクトを抽象化したものがクラスです。したがって、オブジェクトの抽象化がクラスであり、クラスの具体化がオブジェクトです。クラスのインスタンスがオブジェクトであり、クラスが実際にはデータ型であるとも言えます。
つまり、オブジェクトの機能や特性を抽出してクラスを形成することは、カップのモデルを抽出するのと同じであり、このモデル (つまりクラス) に基づいてさまざまなカップ (つまりオブジェクト) を作成することができます。
それでは、クラスはどのように定義されるのでしょうか?オブジェクトはどのように作成されるのでしょうか?
<?php class Cat{ //定义一个猫类 public $name; //猫的名字 public $age;//猫的名字 public $color;//猫的颜色 //猫的构造方法 public function __construct(){ } public function sleep(){ echo '猫睡觉'; } public function eat(){ echo '猫吃饭'; } }
以上がクラスの基本的な構造です。 以下に各部の意味を詳しく説明します。
class はキーワードであり、これがクラスであることを示す変更できません。
Cat はクラス名です。クラス名は大文字で始まり、キャメルケースで名前が付けられます。
属性: メンバー属性はクラスのコンポーネントであり、通常は基本データ型 (整数、文字列など) ですが、複合型 (オブジェクト、配列)、リソース型も含まれます。たとえば、前に定義した Cat クラスの public $age はメンバー属性です。
各クラスには属性があると言えます。たとえば、猫には名前、年齢、色など、すべての猫のクラスに共通の特徴があります。クラス内のこの機能を属性と呼びます。もちろん、属性を定義する必要はありません。これはあなた自身のニーズによって異なります。
属性の前の public は、後で説明する権限修飾子です。
上記のコードでは、クラス内にいくつかの関数があることがわかります。それらは前の関数と同じですが、先頭に追加の権限制御文字があります。これらのメンバー メソッドは、クラス内の動作です。たとえば、上記の cat クラスには、独自の動作を記述することもできます。
メンバーメソッドの構文:
访问修饰符 function 函数名(形式参数){ //函数体; //return 返回值; }
アクセス修飾子、3つのタイプ(public、protected、privte)があります、デフォルトはpublicです、後で詳しく説明します
他の部分は同じです呼び出しメカニズム
を含む、学習した関数。
は、任意のタイプの複数のパラメーター リストを持つことができます
メソッドの戻り値に関しては、これは特定の要件によって異なります。
上記のcatクラスにメソッドがあり、メソッド名は -__construct() 、これはコンストラクターですが、コンストラクターとは何ですか?コンストラクタは、オブジェクトを作成するときにデータを初期化するためのメソッドです。たとえば、オブジェクトを作成するときに猫の名前、年齢、色を直接指定したい場合にコンストラクタを使用できます。
public function __construct($name,$age,$color){ $this-> name = $name; $this-> age = $age; $this-> color = $color; }
コンストラクターの構文は次のとおりです。
public function __construct(形式参数){ //函数体 }
コンストラクターのメソッド名 __construct() ですが、これは後で紹介する魔法のメソッドです。コンストラクターの名前はクラス名です: public function Cat($name,$age,$color){
}
注意
PHP のクラス名は大文字と小文字が区別されませんコンストラクターに関する注意事項:
クラス内にはコンストラクターは 1 つだけ存在できます。これは必須の要件です
上面的三种情况就是类中大致的内容,在后续我们还会降类中的其他情况。
在上面创建对象的类已经有了,那么怎么创建对象呢?
$cat = new Cat();
创建对象的语法是:
$对象名 = new 类名(参数1,参数2);
类名后面的括号里的参数是传递给类的构造函数的,如果构造函数没有参数,可以不写。
对象的命名规范和普通变量一样,使用驼峰法或者下划线法均可
new也是一个关键字,不能修改,表示新创建对象
我们创建对象的目的就是需要操作对象,而操作对象,就是操作对象里面的属性和方法。
在上面的类下面写如下代码:
//创建对象,传递三个参数到构造函数。 $cat = new Cat('小花',12,'black'); //通过对象来访问对象的属性 echo $cat -> name; echo '<br>'; echo $cat -> age; echo '<br>'; echo $cat -> color; echo '<br>'; $cat-> sleep(); $cat-> eat(); .....结果...... 小花 12 black 猫睡觉 猫吃饭
上面的对象通过->访问属性和方法。注意属性的前面没有$符号。
$对象名->属性名= 值; echo $对象名->属性名; '-> ' 称为对象运算符.
上面的就是对象的创建和最基本的应用
当我们把对象的值赋给另外一个变量是,是值传递还是引用传递?
//创建一个对象 $cat = new Cat('小花',12,'black'); $cat1 = $cat; // 把$cat这个对象赋给$cat1; $cat1 -> name = '小白';//利用$cat1这个对象修改对象的名字。 echo $cat1 -> name; //输出$cat1对象的名字。 echo '<br>'; echo $cat -> name; //输出$cat对象的名字。 .....结果...... 小白 小白
看到这里可能有点蒙,不是值传递吗?怎么修改一个对象的属性,另外一也变了?,
上面的代码当中 $cat1=$cat也是值传递,但是这个值是对象的引用(可以理解对象标识符),即每个包含对象的变量都持有对象的引(reference),而不是整个对象的拷贝。
在上面的图中可以看到,当$cat赋值给$cat1时,也就是对象标识符(#1)复制了一份,赋给$cat1,其实他们还是指向同一块数据区,所以只要其中一个修改了值,另外一个也会变。
我们使用完对象后,已经确定在以后不会使用这个对象了,这个时候我们可以手动的销毁对象,那么我们怎么让对象销毁呢?
当没有任何变量指向对象时,会销毁,因此我们可以把对象引用置为null
使用unset()函数来销毁对象。
//创建一个对象 $cat = new Cat('小花',12,'black'); $cat -> sleep(); unset($cat); $cat -> sleep(); .....结果..... 猫睡觉 Notice: Undefined variable: cat in D:\mywamp\Apache24\htdocs\zendstudio\yunsuanfu\object.php on line 27 Fatal error: Call to a member function sleep() on null in D:\mywamp\Apache24\htdocs\zendstudio\yunsuanfu\object.php on line 27
其实在一个文件运行完的时候,PHP会启动垃圾回收机制,自动的进行垃圾回收。这时候在里面创建的对象就自动销毁了,那么什么是PHP的垃圾回收机制?
垃圾回收,顾名思义,回收垃圾的,在程序中启动垃圾回收机制的时机:
在php中,当一个对象没有任何引用指向它的时候,就会成为一个垃圾对象,php将启动垃圾回收器将对象销毁。
当程序退出前,php也将启用垃圾回收器,销毁对象。
那么什么是垃圾回收机制?
垃圾回收机制是php5之后才有的,php5.3之前使用的垃圾回收机制是单纯的“引用计数”,也就是每个内存对象都分配一个计数器,当内存对象被变量引用时,计数器+1;当变量引用撤掉后,计数器-1;当计数器=0时,表明内存对象没有被使用,该内存对象则进行销毁,垃圾回收完成。但是PHP5.3开始,使用了新的垃圾回收机制,在引用计数基础上,实现了一种复杂的算法,来检测内存对象中引用环的存在(对象的相互引用),以避免内存泄漏。
在上面写类的构造函数的时候,可以看到在函数中使用到了$this,那么在面向对象中$this是什么?
$this是在类中使用的访问自身的一种机制。系统会给每个对象分配$this,代表当前对象。通俗的说就是在当前环境下,谁调用,$this就代表哪个对象。
<?php class Cat{ //定义一个猫类 public $name; //猫的名字 public $age;//猫的名字 public $color;//猫的颜色 //猫的定义方法 public function Cat($name,$age,$color){ $this-> name = $name; $this-> age = $age; $this-> color = $color; } public function sleep(){ echo '猫睡觉<br>'; } public function eat(){ echo '猫吃饭<br>'; } //输出猫的信息 public function info(){ echo '猫的名字是' . $this -> name . ' 年龄是' . $this-> age . ' 颜色是' . $this-> color; } } //创建一个对象 $cat = new Cat('小花',12,'black'); $cat -> info(); echo '<br>'; //创建另一个对象,传进不同的属性 $cat1 = new Cat('小白',6,'white'); $cat1 -> info(); .....结果..... 猫的名字是小花 年龄是12 颜色是black 猫的名字是小白 年龄是6 颜色是white
在上面的类中的info()函数中使用$this,不同的对象输出不同的结果,因为在不同的环境下,谁调用,$this就代表哪个对象。
在上面我们提到过,对象的销毁,其实在类中有一个方法,就是在对象销毁的时候由系统自动执行的。我们称之为析构函数。
public function __destruct(){ echo $this->name . '被销毁了<br>'; }
在PHP5中引入了析构函数的概念,析构函数会在某个对象的所有引用被删除(没有变量指向对象,要被销毁了),对象销毁前执行。
析构函数的主要作用是去释放对象分配的相关资源,比如数据库连接或打开的文件等。
它的语法是:
function __destruct(){ //函数体[释放资源,比如数据库连接,或者打开文件等等] }
析构函数也是系统自动调用的,我们不用自己调。但是当我们没有写析构函数的时候,系统不会执行析构函数。
<?php class Cat{ //定义一个猫类 public $name; //猫的名字 public $age;//猫的名字 public $color;//猫的颜色 //猫的定义方法 public function Cat($name,$age,$color){ $this-> name = $name; $this-> age = $age; $this-> color = $color; } public function sleep(){ echo '猫睡觉<br>'; } public function eat(){ echo '猫吃饭<br>'; } //输出猫的信息 public function info(){ echo '猫的名字是' . $this -> name . ' 年龄是' . $this-> age . ' 颜色是' . $this-> color; } public function __destruct(){ echo $this->name . '被销毁了<br>'; } } //创建一个对象 $cat = new Cat('小花',12,'black'); echo $cat -> name; //输出对象的名字 echo '<br>'; unset($cat); //销毁对象,系统自动调用析构函数。 .....结果...... 小花 小花被销毁了
当我们销毁对象$cat时,析构函数自动执行。
デストラクターはオブジェクトが破棄される前に自動的に実行され、戻り値はありません。クラス内に存在できるデストラクターは 1 つだけです。
デストラクターは、ガベージ コレクション メカニズムによって破棄されるオブジェクト自体ではなく、オブジェクトによって作成されたリソースを破棄します。
ファイル内に複数のオブジェクトを作成する場合、ファイルが実行されてオブジェクトが破棄されると、最初に作成されたオブジェクトが後で破棄され、後で作成されたオブジェクトが最初に破棄されます。この原理は、次の原理と非常によく似ています。スタック。先入れ、後出し、後入れ、先出し。
上記のクラスとオブジェクトの説明を通じて、クラスとオブジェクトの違いとつながりを知ることができます。クラスは抽象的なもので、猫などの種類を表します。オブジェクトは具体的であり、特定のものを表します。クラスはオブジェクトのテンプレートであり、オブジェクトはクラスのインスタンスです。同時に、クラスの基本構成を習得する必要があります。
上記は PHP 基本チュートリアル 9 とオブジェクトの内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) をご覧ください。