ConstructorメソッドとDestructorメソッドは、objectの2つの特別なメソッドであり、どちらもオブジェクトのライフサイクルに関連しています。コンストラクター メソッドは、オブジェクトの作成後にオブジェクトによって自動的に呼び出される最初のメソッドです。これが、オブジェクトでコンストラクター メソッドを使用する理由です。デストラクター メソッドは、オブジェクトが破棄される前にオブジェクトによって自動的に呼び出される最後のメソッドです。これが、オブジェクトでデストラクター メソッドを使用する理由です。したがって、通常、構築メソッドは一部のオブジェクトの初期化作業を完了するために使用され、デストラクターメソッドは、一部のオブジェクトを破棄する前にクリーニング作業を完了するために使用されます。 1. コンストラクター 宣言されたすべてのクラスには、コンストラクターと呼ばれる特別なメンバー メソッドがあり、それが明示的に宣言されていない場合、クラスと空の内容を持つデフォルトのパラメーター リストが存在します。明示的に宣言すると、クラス内にデフォルトのコンストラクターが存在しなくなります。オブジェクトが作成されると、コンストラクター メソッドが自動的に 1 回呼び出されます。つまり、コンストラクター メソッドは、オブジェクトのインスタンス化にキーワード new が使用されるたびに自動的に呼び出されます。コンストラクター メソッドは、オブジェクトへの参照を通じてアクティブに呼び出すことはできません。 。したがって、コンストラクターは通常、オブジェクトの作成時にメンバー プロパティに初期値を割り当てるなど、いくつかの便利な初期化タスクを実行するために使用されます。
PHP5 の以前のバージョンでは、コンストラクターのメソッド名はクラス名と同じである必要があります。このメソッドは PHP 5 でも引き続き使用できます。ただし、PHP では、クラス名と同じ名前でコンストラクターを宣言することはほとんどありません。この利点は、クラス名が変更されたときにコンストラクターを変更する必要がないことです。対応するコンストラクター名。下位互換性のため、オブジェクトを作成するときに、クラス内にconstruct()という名前のコンストラクターがない場合、PHPはクラス名と同じ名前のコンストラクターをfunction construct( [参数列表] ){ //构造方法名称是以两个下划线开始的 //方法体,通常用来对成员属性进行初始化赋值}
でのコンストラクターのオーバーロード機能を実現することができます。このように、オブジェクトの作成時にコンストラクターにパラメーターが渡されない場合、デフォルトのパラメーターを使用してメンバーのプロパティが初期化されます。
コンストラクターはクラスメソッドまたは他の関数を呼び出すことができます
コンストラクターは他のクラスのコンストラクターを呼び出すことができます<?phpclass Person{ private $name; private $age; private $gender; public function construct($name,$age,$gender){ $this->setName($name); //调用类方法 $this->age = $age; $this->setGender($gender); } public function setName($name){ $this->name = $name; } // ... setter 方法}$person = new Person("yeoman",23,'男');?>
function construct(){ parent::construct(); // 调用父类的构造函数必须显示的使用parent调用父类构造函数 classname::construct(); // 调用其他类的构造函数,classname是类名 //其他操作}
とconstructor
PHPのサブクラスのコンストラクターは、親クラスのコンストラクターを積極的に呼び出しません。表示するには、parent::construct() 呼び出しを使用します。
<?php class Animal{ private $name; function construct($name){ $this->setName($name) echo "动物类被创建!"; } // ... 其他方法}class Birds extends Animal{ private $name; private $leg; function construct($name,$leg){ parent::construct($name); // 显示调用 $this->setLeg($leg); echo "鸟类被创建!"; } // ... 其他方法}?>
// 接上例class Parrot extends Birds{ private $name; private $leg; private $wing; function construct($name){ parent::construct($name); // 此时没有找到父类(Birds类)合适的构造函数,只能向上搜索,搜索到Animal类时,才找到合适的构造函数 echo "鹦鹉类被创建!"; $this->smackTalk(); /* 输出结果: "动物类被创建!" "鹦鹉说话!" */ } function smackTalk(){ echo "鹦鹉说话!"; } }
複数の親クラスのコンストラクターを順番に呼び出したい場合は、クラス名を使用してコンストラクターを直接呼び出すことができます。例:
function construct($name,$leg){ Animal::construct($name); // 调用Animal构造函数 Birds::construct($name,$leg); // 调用Birds构造函数}
2.Destructor
ヒープ メモリ セグメント内のオブジェクトがアクセスするための参照を失うと、アクセスできなくなり、ガベージ オブジェクトになります。通常、オブジェクトへの参照には別の値が割り当てられるか、ページが終了するとオブジェクトはその参照を失います。
デストラクタはオブジェクトを破棄するときに自動的に呼び出され、明示的に呼び出すことはできません。デストラクターはパラメーターを受け取ることができません。function deconstruct(){ //方法体,通常用来完成一些在对象销毁前的清理任务}
<?php class test{ function destruct(){ echo "当对象销毁时会调用!!!"; } }$a = $b = $c = new test();$a = null;unset($b);echo "<hr />";?>
此例子,如下图,有三个变量引用$a,$b,$c指向test对象,test对象就有3个引用计数,当$a = null时,$a对test对象的引用丢失,计数-1,变为2,当$b被unset()时,$b对test对象的引用也丢失了,计数再-1,变为1,最后页面加载完毕,$c指向test对象的引用自动被释放,此时计数再-1,变为0,test对象已没有变量引用,就会被销毁,此时就会调用析构函数。
在PHP中析构方法并不是很常用,它属于类中可选的一部分,只有需要时才在类中声明。
<?phpclass Person{ var $name; var $sex; var $age; function construct($name, $sex, $age){ $this->name = $name; $this->sex = $sex; $this->age = $age; } function destruct(){ echo "再见" . $this->name . "<br />"; } } $person1 = new Person("张三三", "男", 23); $person1 = null; //第一个对象将失去引用 $person2 = new Person("李四四", "女", 17); $person3 = new Person("王五五", "男", 43); ?>
运行结果:
再见张三三 再见王五五 再见李四四
第一个对象在声明完成以后,它的引用就被赋予了空值,所以第一个对象最先失去的引用,不能再被访问了,人后自动调用第一个对象中的析构方法输出“再见张三三”。后面声明的两个对象都是在页面执行结束时失去的引用,也都自动调用了析构方法。但因为对象的引用都是放在栈内存中的,由于栈的后进先出特点,最后创建的对象会被最先释放,多以先自动调用第三个对象的析构方法,最后才调用第二个对象的析构方法。
以上がPHP オブジェクト指向コードのコンストラクター メソッドとデストラクター メソッドのケース共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。