1: 構造と呼び出し (インスタンス化):
class className{}, call: $obj = new className(); クラスにコンストラクターがある場合は、パラメーターも渡す必要があります。 $obj = new className($v,$v2…);
など2: コンストラクターとデストラクター:
1. コンストラクターは初期化に使用されます。パラメーターを受け取ることができる __construct() を使用します。
2. ただし、デストラクターはパラメーターを受け取ることができません (クラスを削除する前に一部の操作または関数を実行するために使用されます)。デストラクターの名前は __destruct() です。スクリプトの実行終了時にメモリ上のオブジェクトが破棄されるため、関数を破棄する必要はありませんが、COOKIEなど一部のオブジェクトはこの関数を使用して破棄する必要があります。
知識ポイント: PHP4 もコンストラクターを提供しますが、クラスと同じ名前のクラス メソッドを使用します。このアプローチは、クラスに __construct が含まれていない場合、そのクラスと同じ名前のメソッドを検索します。クラスが見つかった場合は、次のようにコンストラクターとみなされます。
クラステスト
{ var $b;
関数 test() { $this->b=5 }
;
関数 addab($c) { return $this->b+$c }
}
$a = new test(); echo $a->addab(4); // 9
を返します。
3. PHP は、親クラスのコンストラクターを自動的に呼び出しません (コンストラクターのオーバーロードはサポートされていません)。parent キーワードを使用して明示的に呼び出す必要があります。
クラス職員{
関数 __construct()….
}
クラスマネージャーエクステント従業員{
関数 __construct(){
親::_construct();
echo 'このサブクラスの親クラスのコンストラクターが呼び出されました! ’;
}
}
もちろん、インスタンスと関係のない他のクラスのコンストラクターを呼び出すこともできます。 __construct() の前にクラス名を追加するだけです。例:
otherClassName::__construct();
3. クラスの属性:
クラスの属性に値を代入または取得するには 2 つの方法があります。
1. public キーワードを public スコープで使用します。
2. __set() と __get() を使用して値を割り当て、取得します。前者をセッター メソッド (setter) または変更メソッド (ミューテーター) と呼び、後者をアクセサー メソッド (アクセサー) またはゲッターと呼びます。メソッド(ゲッター)。この方法を使用することをお勧めします: 利点:
A. データ検証は__set()内で一律に行うことができます。
B. 属性の一元管理を容易にする。
注:
まず、__set() と __get() は、次のように、public で定義された属性に対してのみ機能します。
クラステスト{
保護された $a=9,$b=2,$c;
パブリック $d;
関数 __set($n,$v) { $this->$n = $v+2 }
;
function __get($name) { return $this->$name+2 }
;
}
$a = 新しいテスト();
$a->b =5; echo $a->b;
この例では、$a、$b、および $c の設定のみがフィルタリングされ、__set および __get を通じて返されます。$d については機能しません。たとえば、$a->d=5 の場合でも 5 が返されます。
2 番目: __set($n,$v) は 2 つのパラメータを取ります。また、__get($n) にはパラメーターを 1 つだけ指定できます。例:
クラステスト{
プライベート $a=5,$b=6,$c;
関数 __set($n,$v)
{
if($n==’a’&&$n>0)
$this->$n = $v;
それ以外
$this->$n = $v+2;
}
関数 __get($name)
{
return $this->$name; // return $this->$name + $this->addab(); に変更すると、a の値が呼び出されると、実際には a+a+b の値が返されます。デフォルトは 5+5+6=16 です。
}
関数addab()
{ return $this->a + $this->b }
;
}
$e=新しいテスト();
$e->a = 11; //書き込みに注意してください: $this->$n はクラス内で使用されます。つまり、変数が書き込まれますが、$e->a は外部インスタンスに使用されます。
$e->b = 12 // 14 を取得します
;
$e->k = 22;
上記の例 k に示すように、クラスの属性は、__set が使用されているかどうかに関係なく、インスタンスの作成時に $e->newProperty = xx; を使用して直接作成できます。 , しかし、これはお勧めできません。
クラス内の関数として理解してください。
電話:
1. 内部呼び出し: $this->Fanname() または $this->addab() または test::addab(); を使用できます。
2. 呼び出しをインスタンス化するときは、$e->addab(); を使用します。上記の例のように、このメソッドで $this キーワードを使用しない場合:
function addab() { return $this->a+$this->b }
;
function addab() { return 25; } に変更します。その後、外部インスタンスでこのメソッドを呼び出すときに、「$e::addab();」または「test::addab();」を使用することもできます。
5. クラス定数:
クラスの属性がクラス内の変数として理解される場合、クラスの定数と変数は異なります。
定義方法は次のとおりです。
クラステスト{
プライベート $a;
const PI = ’3.14’;
…..
//クラス内で上記の定数を呼び出すメソッドは「$this::PI」または「クラス名::PI」の 2 つあります。ここでは次のように test::PI を使用します:
関数 getvalue(){
return $this->a * $this::PI; //または $this->a * test::PI、this キーワードまたはクラス名を使用できますが、二重コロンを使用する必要があります。
}
}
$e= 新しいテスト();
$e->PI =5; //ここで -> を使用すると、クラス内の PI 定数の値が変更されるのではなく、同じく PI という名前の属性が作成されるだけであることに注意してください。
echo $e::PI; //これは呼び出し側クラスの定数です。
定数は二重コロン:: を使用してのみ呼び出すことができます。そしてその値は変更できません。
クラス外でインスタンス化した後にクラス定数を呼び出す方法も 2 つあります。方法は次のとおりです:
「$e::PI」または「test::PI」、共通点は両方ともコロンを使用することです。違いは、this キーワードが外部から使用できないこと、インスタンス名のみが使用できるが、クラス名は使用できることです。 ::PI はユニバーサルです。
6. クラスの静的メンバー (静的プロパティまたは静的メソッド):
クラスのすべてのインスタンスで共有されるフィールドまたはメソッドを作成する必要がある場合。静的メンバーを使用する必要があります。特徴は2つあります:
1. 静的メンバーは共用です。スクリプト上のクラスのすべてのインスタンスがそれらを呼び出すことができますが、クラスの特定のインスタンス名を使用して呼び出すことはできず、代わりに「クラス名::$ メンバー名」を使用します。 " クラス外のメソッド呼び出し。内部的には、クラスは「self::$member name」を使用して呼び出します。
2. 新しいインスタンスが作成されるたびに、静的メンバーはクラスの初期値ではなく、最後に作成されたインスタンスの最後の値から再計算されます。
3. public で定義された静的メンバーの場合、その値は外部から変更できます。プライベートなどは機能しません。
クラステスト{
パブリック静的 $v = 0;
関数 __construct(){ self::$v++ }
;
静的関数 getV(){ return self::$v }
;
}
$a = 新しいテスト();
echo test::getV(); // 1 を返します
$b = 新しいテスト();
echo test::getV(); // 2 を返します
test::$v=8; //パブリックに定義されたメンバーのため、静的メンバーの値を変更します。
$c = 新しいテスト();
echo test::getV(); // 9 を返します
7. キーワード:
(1) このキーワード: クラス自体を参照するために内部的に使用されます。プロパティ、メソッド、または定数にアクセスするには、$this->プロパティ名またはメソッド名などを使用します。 $this::定数名。これは、このクラスのサブクラスで独自のプロパティまたはメソッドを参照するために使用することもできます。
(2) ダブルコロン「::」キーワード: 定数および静的メンバーを呼び出すために使用されます。
(3) self キーワード: self::$staticVar など、クラス内の静的メンバーを呼び出すために二重コロンとともに使用されます。クラス内では、$this を使用して静的メンバーを呼び出すことはできません。
(4) __toString(): クラス内で __toString() を使用して、クラスを文字列に変換し、クラスを出力します。次のように、あまり役に立ちません。
クラステスト{ public $p;
パブリック関数 __toString(){ return var_export($this,TRUE) }
;
}
$a=新しいテスト();
echo $a; //出力: test::__set_state(array( ‘p’ => NULL, ))、または次のように記述されます: echo $a->__toString();
(5) __clone(): このキーワードは、オブジェクトが複製される場合にのみ有効になり、複製中に特定の値を変更するために使用されます。
(6) __call(): メソッドのオーバーロード。以下の例を参照してください:
クラスCB{
関数 __call($method,$n){
if($method==’showVarType’){
if(is_numeric($n[0])){ //$n は使用できません。 $n[0];
を使用してください
$this->displayNum();
}else if (is_array($n[0])){
$this->displayArr();
}その他{
$this->displayOther();
}
}
}
関数displayNum() {
echo 「
これは数字です!
$y=array('a','b');
$b=新しいCB;
$b->showVarType($x); //配列または数値ではありません
$b->showVarType($y); //これは配列です
showVarType() メソッドをクラス内で定義できないことに注意してください。定義しない場合、コードは機能しません。
(7) 拡張: 継承: クラス a{} クラス b を拡張します。{} クラス b はクラス a を継承します
8. メソッドと属性の範囲:
public(デフォルト、省略可能、PHP6のvar文にも相当)、private(プライベート、サブクラスでは利用不可)、protected(プライベート、ただしサブクラスでも利用可能)、abstract( abstract、下記を参照)、final (サブクラスでの上書きを防止します。オーバーロードとも呼ばれ、継承を防止します。クラス名とメソッドの変更に使用されます。final class test{final function fun(){}} などですが、属性には使用できません) 、静的(静的)
9: 抽象クラスと抽象メソッド (抽象 - 注: いわゆる抽象属性はありません):
抽象化は、サブクラスのテンプレートまたは基本クラスを定義する親クラスとして理解できます。スコープ抽象は親クラスでのみ宣言されますが、子クラスで実装されます。注:
1. 抽象クラスはインスタンス化できず、サブクラス (具象クラス) に継承された後にのみ実装できます。
2. 抽象クラスは、そのサブクラス内の抽象クラスのすべての抽象メソッドを実装する必要があります。そうしないと、何か問題が発生します。
3. 抽象メソッドでは、宣言されるだけで実装できません。たとえば、abstract function gettow(){ return $this->p } は間違っています。このメソッドは、abstract function gettow(); のみ宣言できます。 (角括弧付き) {} は表示されません)、抽象メソッドと抽象クラスは、主に複雑なクラスの階層関係で使用されます。この階層により、各サブクラスに特定のメソッドが含まれ、オーバーロードされることが保証されます。これはインターフェースを通じても実現できます
4. 属性に抽象属性という名前を付けることはできません。たとえば、abstract $p = 5 は誤りです。
5. 抽象メソッドを宣言できるのは抽象宣言されたクラスのみですが、抽象宣言されたメソッドは具体的に実装できません。例:
抽象クラス Employee
{
抽象関数 a(…);
抽象関数 b(…);
}
後で、この親クラスが拡張されて、さまざまなサブクラス (マネージャー、従業員、レジ係など) が形成されます。
6. 抽象クラスでは、特定のメソッドを実装する場合、それを抽象として宣言できません。実はこちらの方が意味があるのかもしれません。複数のクラスライブラリの共通部分を抽象クラスに抽出し、他のクラスがその抽象クラスを継承することができます。以下の通り:
抽象クラス BaseShop{
Const TAX=0.06; // 抽象クラスで定数を定義します
public function buy($gid) { // 抽象メソッドとして定義されている場合、抽象関数 buy() はここで本体を実装できません。
echo('ID:'.$gid で製品を購入しました。');
}
パブリック関数 sell($gid) {
echo('ID:'.$gid の商品を販売しました。');
}
パブリック関数ビュー($gid) {
echo('ID:'.$gid の商品を閲覧しました。');
}
}
クラス BallShop は BaseShop を拡張します{
var $itme_id = null;
パブリック関数 __construct()
{
$this->itme_id = 2314;
}
パブリック関数 open()
{
$this->sell($this->itme_id);
}
パブリック関数 getTax()
{
echo printf(‘
10: 入力ヒント:
型ヒント関数は、パラメーターがオブジェクトであるヒントにのみ使用でき、整数、文字列、浮動小数点などの型ヒントには使用できないことに注意してください。一部のクラス メソッドでは、渡されるパラメーターが予期されるオブジェクト タイプである必要があります。次のメソッドを使用して、この代替を強制できます。型ヒンティングを実現するには、function funname(OtherClassName $otherclassINSName,$c….) のように、メソッドのオブジェクト パラメーターの前に既存のクラスの名前を追加するだけです。OtherClassName は既存のクラスである必要があることに注意してください。以下の通り:
クラスem{ var $k=56 }
クラステスト{
関数__construct()
{ echo $this->addab(new em(),2) }
function addab(em $j,$c) //このメソッドは内部または外部から呼び出すことができます。範囲が許す限り。
{ $j->k+$c を返す }
}
$a = 新しいテスト();
$b = 新しい em();
echo $a->addab($b,2) //または $a->addab(new em(),2);
11. クラス管理:
1. Instanceof キーワード: オブジェクトが特定のクラスのインスタンスかサブクラスであるか、または特定のインターフェイスを実装しているかを分析するために使用されます。次の例に示すように、ただし注意してください: クラス名には引用符などの区切り文字がありません。それ以外の場合は、何か問題が発生しました。たとえば、test では「test」を使用できません
クラステスト2{}
クラステスト{}
class testChilern テストを拡張します{}
$a = 新しい test2();
$m = 新しいテスト();
$i = ($m テストのインスタンス);
if($i)echo ‘$m はクラス test のインスタンスです!
'; // この値を取得します
スイッチ ($a テストのインスタンス){
本当の場合:
エコー「はい
」;
休憩;
falseの場合:
echo 'いいえ
' // この値を取得します
;
休憩;
}
$d=新しいtestChilern();
if($d instanceof test)echo ‘$d はクラス test のサブクラスです!
'; // この値を取得します
2. クラスが存在するかどうかを確認します: boolean class_exists(string class_name): class_exists(‘test’);
3. クラス名を返します: string get_class(object)。成功した場合は、インスタンスのクラス名を返します。失敗した場合は、FALSE を返します。
$a = new test2(); // test2 を返します。
4. クラスのパブリック属性を理解します。array get_class_vars(‘className’) は、定義されたすべてのパブリック属性名とそれに対応する値を含むキー配列を返します。この関数はインスタンス名を変数として使用できません
5. クラス メソッドを返す: get_class_methods(‘test’); //または: get_class_methods($a); はインスタンス名をパラメータとして使用し、コンストラクターを含むすべての非プライベート メソッドを返すことができます。
6. print_r(get_declared_classes()) は、現在の PHP バージョンのすべてのクラス名を学習します。 PHP5には149があります。
7. get_object_vars($a) は、インスタンス内のすべてのパブリック属性とその値の連想配列を返します。 get_class_vars() との違いに注意してください:
/* (1) get_object_vars($a) はインスタンス名をパラメータとして使用し、get_class_vars(‘test’) はクラス名をパラメータとして使用します。
※ (2) get_object_vars($a)で取得される属性値はインスタンス実行後の値、get_class_vars(‘test’)で取得される属性値はクラスの初期定義です。
* (3) どちらも連想配列を返し、割り当てられていない属性についてはどちらも NULL 値を返します。 public $q がクラス test で定義されている場合、Array ([v] => 5 [q]=>) が返されます。
*/
8. 親クラスの名前を返します: get_parent_class($b);//または get_parent_class(‘test2’);
9. インターフェースが存在するかどうかを確認します: booleaninterface_exists($stringinterface[,boolean autoload])
10. オブジェクト タイプを決定します: boolean is_a($obj,’className’) $obj が CLASSNAME クラスまたはそのサブクラスに属している場合、$obj がクラス タイプと関係がない場合は FALSE を返します。例: is_a($a,’test’)
11. それが特定のクラスのサブオブジェクトであるかどうかを判断します。$b が TEST クラスから継承する場合は TRUE を返し、それ以外の場合は FALSE を返します。ブール値 is_subclass_of($b,’test’);
12. メソッドがクラスまたはインスタンスに存在するかどうかを確認します。 Method_exists($a,'getv') //または、method_exists('test','getv') を使用します。この関数は、公開されていないスコープのメソッドに適しています。
上記の関数の例:
クラステスト{
パブリック $v=2;
プライベート $c=5;
関数 __construct(){
$this->v=5;
}
プライベート関数 getv(){
return $this->v;
}
}
クラス test2 はテストを拡張します{}
$a=新しいテスト();
$b=新しいテスト2();
print_r( get_class_methods(‘test’)); // または: print_r( get_class_methods($a)); 両方とも Array ( [0] => __construct [1] => getv ) を返します。
エコー「
print_r( get_class_vars(‘test’)); //Return: 上記とは異なり、Array ([v] => 2) は使用できません print_r( get_class_methods($a));
エコー「
」;
echo get_parent_class($b);//または get_parent_class(‘test2’); return test
エコー「
」;
echo is_a($b,’test’);//return 1
エコー「
」;
if(is_subclass_of(‘test2’,’test’))echo ' はサブクラスです! '; //または (is_subclass_of($b,'test'))、パラメータ 1 が $a の場合、1 を返します、
エコー「
」;
echo method_exists($a,'getv') //または、method_exists('test','getv') を使用して 1 を返します。この関数は、プライベートおよびその他のドメイン定義を使用するメソッドにも適しています。
11. クラスライブラリファイルを自動的にロードします:
たとえば、さらに多くのクラスがある場合、3 つのクラス ライブラリ ファイルを 1 つのファイルにロードするには、a.class.php、b.class.php、c.class.php、3 つの require_once('classes/a.class.php); とします。
require_once('classes/b.class.php);
require_once('classes/c.class.php);
PHP5 の自動ロード関数を使用してこれを処理できます。グローバル アプリケーション構成ファイルで、特別な関数 __autoload($class) 関数を定義します (__autoload はクラスのメソッドではなく、単なる別個の関数であり、何もする必要はありません)クラスと一緒に):
関数 __autoload($class){
require_once(“クラス/$クラス)
}
関数がどこに配置されるかは関係なく、クラス インスタンスの作成時にこの自動ロード関数を呼び出す必要はありません。 PHP が自動的に実行します。ただし、必ず 1 つ注意してください。「呼び出しページでインスタンスを作成するために使用されたクラス名」、「呼び出されるファイル名」、および「ファイル内のクラスの名前」は同じである必要があります。この方法では、__autoload() を呼び出す必要はありません。異なる場合は、__autoload(‘c’) を個別に呼び出して、ファイル名プレフィックスを付ける必要があります。例:
c.class.php ファイルのコードは次のとおりです:
クラスc{
パブリック $m=7;
}
?>ここでのコードのクラス名は c、ファイル名も c、
次に、index.php でそれを呼び出します:
関数 __autoload($class){
require_once “$class.class.php”;
}
$m = new c(); //インスタンス作成時に呼び出されるクラスも c
エコー $m->m;
?>
このとき、PHP はルート ディレクトリの c.class.php 内のクラス C を自動的に呼び出します。
ただし、c.class.php のコードが次の場合:
クラスMM{
パブリック $m=7;
}
?>
呼び出しページのindex.phpコードは次のとおりです:
関数 __autoload($class){
require_once “$class.class.php”;
}
# __autoload(‘c’); //この行を追加しないとエラーが発生します。
$m = 新しい mm();
エコー $m->m;
?>
mm.class.php ファイルが見つからないことを示すエラーが発生します。このとき、 __autoload(‘c’); という行を追加することもできますが、これではコードを簡素化するという目的は達成できません。
クラスのファミリー拡張: クラスの高度な機能:
1. オブジェクトのクローン作成:
オブジェクトのインスタンスが複製されると、その初期プロパティ値は複製されたオブジェクトの現在の値を継承します。
クラステスト
{
パブリック $p=5;
function __clone(){ //クローン作成が行われる場合にのみ機能します。クローン作成中に特定の値を変更するために使用されます
$this->p=15;
}
}
$a=新しいテスト();
echo $a->p;
$a->p=8; //__clone()メソッドがない場合、$bのP値は8になります
$b = $a のクローン;
エコー $b->p //15
2. オブジェクトの継承:
final宣言されていないクラスも継承可能、finalやprivateで定義されていないメソッドも継承可能、privateで定義されていないプロパティも継承可能。サブクラスが親クラスまたはスーパークラスを継承すると、親クラスまたはスーパークラス (祖父クラスおよび祖父の祖父) のすべての許可されたメソッドと属性を直接使用できます。
重要: 継承におけるコンストラクターとオーバーロードの特性を理解してください。
(1) 継承におけるコンストラクターの特徴:
1. 親クラスにはコンストラクターがあるが、サブクラスにはコンストラクターがない場合: サブクラスはインスタンス化時に親クラスのコンストラクターを自動的に実行します。このとき、サブクラスのインスタンスを作成したい場合は、親クラスのコンストラクターに必要なパラメータを導入する必要があります。導入しないとエラーが発生します。 「サブクラスのサブクラス」にコンストラクタがない場合でも、インスタンス作成時にその親クラスの親クラスのコンストラクタに必要なパラメータを入力する必要があります。 PHP は、インスタンスが配置されているサブクラスから結合されたコンストラクターを上方向に検索し、見つかった場合は停止してそのコンストラクターを使用します。したがって、サブクラス自体にコンストラクターがない場合は、コンストラクターを持つ最も近いスーパークラスが優先されます。
クラスA{
公開 $name,$age;
関数 __construct($n) {
$this->name = $n;
$this->年齢 = 25;
}
関数 __set($n,$v) {
$this->$n = $v;
}
関数 __get($n) {
$this->$n を返す;
}
}
クラス cB は cA を拡張します{
function funB1() { echo ‘
クラス cC は cb を拡張します {
function funC1() { echo '
3. インターフェース:
インターフェース: インターフェースは、一連の関数の共通の仕様として理解できます。最大の意義は、複数の人が共同で開発する場合に、それぞれの開発に共通のメソッド名を指定することです。
抽象クラスの抽象メソッドと同じ:
1. メソッドの特定の実装をインターフェイスで定義できません。これは具象クラスによって実装されます (抽象クラスの非抽象メソッドを定義する必要はありません。具象クラスに実装する必要があるのは抽象メソッドとインターフェイスのみです)。
2. 抽象クラスと同様に、定数はインターフェイスで定義でき、具象クラスに直接継承できます。
3. 具象クラスは、抽象クラスのすべての抽象メソッド (非抽象メソッドを除く) を実装する必要があります。同様に、具象クラスがimplements を通じてインターフェイスを実装する場合、インターフェイス内のすべてのメソッドを完了する必要があります。
インターフェイス実装プロセス: 1. インターフェイスを定義します。 2. ..implement X、Y、... を使用して特定のクラスに接続します。
インターフェース情報{ //インターフェースを定義します
const N=22;
パブリック関数 getage();
パブリック関数 getname();
}
class ageimplements Info //複数のインターフェースが必要な場合、class age (emJob を拡張) は Info,interB…を実装します
{
公開 $age=15;
public $name='参加';
関数 getage() {
echo “成績は $this->age”;
}
関数 getname() {
echo “名前は $this->name です”;
}
関数 getN(){
echo ‘
$age=新時代;
echo $age::N; //22、インターフェイスで定数値を直接呼び出します。
$age->getN();
抽象クラスとインターフェイス クラスの違いについて: いつインターフェイスを使用し、いつ抽象化を使用するか?
1. 関連性: 作成されたモデルがいくつかの密接に関連するオブジェクトに採用される場合は、抽象化を使用します。無関係なオブジェクトが採用する機能については、インターフェイスを使用します。
2. 多重継承: PHP クラスは複数のインターフェイスを継承できますが、複数の抽象クラスを拡張することはできません。
3. パブリック動作の実装: 抽象クラスはパブリック メソッドを実装できますが、インターフェイスは実装できません。
4. ネームスペース (PHP6)
クラスライブラリのスクリプトA.inc.phpとスクリプトB.inc.phpにはclass CNAMEというクラスがあり、これら2つのファイルはindex.phpなどの同じファイル内で呼び出す必要があります。現時点では名前空間が使用されます。
ブジュ:
1. 上の 2 つのファイル A と B を開き、それぞれの先頭に次の 1 行を追加します。
名前空間 SPACEA と名前空間 SPACEB にはカスタム名があります。
2.index.php でクラスをインスタンス化するときに、クラスの前に名前空間と二重コロンをプレフィックスとして追加します。
「a.inc.php」を含める;
「b.inc.php」を含める;
$a=new SPACEA::CNAME();
$b=new SPACEB::CNAME();
そうすれば争いは起こらないでしょう。
ただし、PHP6 が正式にリリースされるまで、この機能はまだ完成していません。
「PHP バイブル」P142 を参照してください。
6. リフレクション API を使用します。
クラスa{ … }
$c = new ReflectionClass('a'); //PHP 組み込みクラス。
エコー「レリー」;
クラス a の構造と内容を出力します。 「PHP バイブル」P145 を参照してください。
転載: http://www.onexin.net/?p=2533
http://www.bkjia.com/PHPjc/621646.html