ホームページ >バックエンド開発 >PHPチュートリアル >php classの詳しい使い方まとめ_PHPチュートリアル
1: 構造と呼び出し (インスタンス化):
class className{}, call: $obj = new className(); クラスにコンストラクターがある場合は、パラメーターも渡す必要があります。 $obj = new className($v,$v2…);
など2: コンストラクターとデストラクター:
1. コンストラクターは初期化に使用されます。パラメーターを受け取ることができる __construct() を使用します。
2. ただし、デストラクターはパラメーターを受け取ることができません (クラスを削除する前に一部の操作または関数を実行するために使用されます)。デストラクターの名前は __destruct() です。スクリプトの実行終了時にメモリ上のオブジェクトが破棄されるため、関数を破棄する必要はありませんが、COOKIEなど一部のオブジェクトはこの関数を使用して破棄する必要があります。
知識ポイント: PHP4 もコンストラクターを提供しますが、クラスと同じ名前のクラス メソッドを使用します。このアプローチは、クラスに __construct が含まれていない場合、同じ名前のメソッドを検索します。
クラスの属性に値を割り当てたり取得したりするには 2 つの方法があります。
1. パブリックスコープのパブリックキーワードを使用します。 2. __set() と __get() を使用して値を代入および取得します。前者を設定メソッド (setter) または変更メソッド (ミューテーター) と呼び、後者をアクセスメソッド (アクセサー) またはと呼びます。ゲッターメソッド(ゲッター)。この方法を使用することをお勧めします: 利点:
A. データ検証は __set() で均一に実行できます。
B. 属性の一元管理に便利。
注:
最初: __set() と __get() は、次のように、プライベート属性でのみ機能します。 public で定義された属性の場合、どちらも遅延的です:
クラス内の関数として理解してください。
電話:
1. 内部呼び出し: $this->Fanname(); または $this->addab() または test::addab(); を使用できます。
2. インスタンス化を呼び出すときは、$e->addab(); を使用します。上記の例のように、このメソッドで $this キーワードを使用しない場合:function addab() { return $this->a+$this->b; }
次のように変更します: function addab() {次に、外部インスタンスでこのメソッドを呼び出すには、「$e::addab();」または「test::addab();」を使用することもできます。
5. クラス定数:
コードをコピーします。は次のとおりです:
6. クラスの静的メンバー (静的プロパティまたは静的メソッド):
クラスのすべてのインスタンスで共有されるフィールドまたはメソッドを作成する必要がある場合。静的メンバーを使用する必要があります。特徴は2つあります:
1. 静的メンバーは、スクリプト上のクラスのすべてのインスタンスを呼び出すことができますが、クラスの特定のインスタンス名を使用して呼び出すことはできません。代わりに、「クラス名::$ メンバー」を使用します。 name」をクラス外で呼び出すメソッド。内部的には、クラスは「self::$メンバー名」を使用して呼び出します。
2. 新しいインスタンスが作成されるたびに、静的メンバーはクラスの初期値ではなく、最後に作成されたインスタンスの最後の値から再計算されます。
3. public で定義された静的メンバーの場合、その値は外部から変更できます。プライベートなどは機能しません。
(2) ダブルコロン「::」キーワード: 定数と静的メンバーを呼び出すために使用されます。
(3) self キーワード: self::$staticVar など、クラス内の静的メンバーを呼び出すために二重コロンとともに使用されます。クラス内では、$this を使用して静的メンバーを呼び出すことはできません。
(4) __toString(): クラスで __toString() を使用して、クラスを文字列に変換し、クラスを出力します。これはほとんど役に立ちません:
(6) __call(): メソッドのオーバーロード。次の例を参照してください:
$x='a';
$y=array('a','b');
$b=new cB;
$b->showVarType($x); //配列または数値ではありません
$b->showVarType($y) //これは配列です
(7) 拡張: 継承: クラス a{} クラス b を拡張します。{} クラス b はクラス a を継承します
添付: メモリ: 今後は、メソッドやプロパティを呼び出すときは「-> 」を使用し、定数を呼び出すときは二重コロン「::」を使用して、混乱しないようにします。
8. メソッドと属性の範囲:
6種類あり: 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. 抽象として宣言されたクラスのみが抽象メソッドを宣言できますが、メソッドが抽象として宣言された場合、具体的に実装することはできません。例:
6. 抽象クラスでは、特定のメソッドを実装したい場合、それを抽象として宣言することはできません。実はこちらの方が意味があるのかもしれません。複数のクラスライブラリの共通部分を抽象クラスに抽出し、他のクラスがその抽象クラスを継承することができます。次のように:
{ return $j->k+$c; }
}
$a = new test();
$b = new em();
echo $a->addab($b,2);または $a->addab(new em(),2);
3. クラス名を返します: string get_class(object)。成功した場合は、インスタンスのクラス名を返します。
$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]=>) が返されます、
*/
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') を使用します。この関数は、公開されていないスコープのメソッドに適しています。
上記の関数の例:
print_r( get_class_methods('test')); // または: print_r( get_class_methods($a)); 両方とも Array ( [0] => __construct [1] => getv )
echo '
';
print_r( get_class_vars('test')); //Return: Array ( [v] => 2 )上記は異なります。 print_r( get_class_methods($a));
echo '
';
echo get_parent_class($b);// または get_parent_class('test2'); を使用して test
を返すことはできません。 echo '
';
echo is_a($b,'test');// Return 1
echo '
';
if(is_subclass_of('test2','test') )echo ' それはサブカテゴリーです! '; //または (is_subclass_of($b,'test'))、パラメーター 1 が $a の場合、1 を返します、
echo '
';
echo method_exists($a,' getv ') //または、method_exists('test','getv') を使用して 1 を返します。この関数は、プライベートなどのドメインを定義するメソッドにも適しています。
require_once('classes/b.class.php);
require_once('classes/c.class.php);
PHP5 自動ロード関数を使用してこれを処理できます。グローバル アプリケーション構成ファイルで、特別な関数 __autoload($class) 関数を定義します (__autoload はクラスのメソッドではなく、単なる別の関数であり、何もする必要はありません)クラスを使用します):
require_once("classes/$class)
}
関数がどこに配置されるかは関係ありません。クラスインスタンスを作成するときにこの自動ロード関数を呼び出す必要はありません。 PHP が自動的に実行します。ただし、必ず 1 つ注意してください。「呼び出しページでインスタンスを作成するために使用されたクラス名」、「呼び出されるファイル名」、および「ファイル内のクラスの名前」は同じである必要があります。この方法では、__autoload() を呼び出す必要はありません。異なる場合は、__autoload('c'); を呼び出してファイル名プレフィックスを付ける必要があります。例:
$m = new c(); //インスタンス作成時に呼び出されるクラスも c
echo $m->m;
?>
ただし、c.class.php のコードが次の場合:
クラスのファミリー拡張: クラスの高度な機能:
1. オブジェクトの複製:
オブジェクトのインスタンスが複製されると、その初期プロパティ値は複製されたオブジェクトの現在の値を継承します。
final宣言されていないクラスも継承可能、finalやprivateで定義されていないメソッドも継承可能、privateで定義されていないプロパティも継承可能。サブクラスが親クラスまたはスーパークラスを継承すると、親クラスまたはスーパークラス (祖父クラスおよび祖父の祖父) のすべての許可されたメソッドと属性を直接使用できます。
キー: 継承におけるコンストラクターとオーバーロードの特性を理解します。
(1) 継承におけるコンストラクターの特徴:
1. 親クラスにはコンストラクターがあるが、サブクラスにはコンストラクターがない場合: サブクラスはインスタンス化時に親クラスのコンストラクターを自動的に実行します。このとき、サブクラスのインスタンスを作成したい場合は、親クラスのコンストラクターに必要なパラメータを導入する必要があります。導入しないとエラーが発生します。 「サブクラスのサブクラス」にコンストラクタがない場合でも、インスタンス作成時にその親クラスのコンストラクタの必須パラメータを入力する必要があります。 PHP は、インスタンスが配置されているサブクラスから結合されたコンストラクターを上方向に検索し、見つかった場合は停止してそのコンストラクターを使用します。したがって、サブクラス自体にコンストラクターがない場合は、コンストラクターを持つ最も近いスーパークラスが優先されます。
class cB extends cA{
function funB1() { echo ‘
class cC extends cB {
function funC1() { echo '
A. CB にparent::__construct($n) も追加します
B. CC のコンストラクターを次のように変更します:
1. 親クラスのメソッドを呼び出す: サブクラスで親クラスのメソッドを呼び出すには、
$this->ParentFunction(); または
parent::parentFun の 3 つのメソッドがあります。 ();
(3) 過負荷:
サブクラスでは、親クラスと同じ属性やメソッドを定義し、親クラスの属性やメソッドの値や動作を変更することができます。これをオーバーロードと呼びます。例:
calss ParClass{ function pfun(){ ….}}class ChildrenClass extends ParClass{function pfun(){ ….}}} //親クラスの pfun メソッドをオーバーロードします。
サブクラスでオーバーロードした後、独自のオーバーロード後に新しく定義されたメソッドまたは属性が最初に実行されます。
サブクラスでparent::parentFun();を使用して親クラスのメソッドを呼び出すこともできますが、取得される値はサブクラス自体によって入力されたパラメータ操作値です。メソッドが親クラスで操作する値ではありません。
インターフェース: インターフェースは、一連の関数の共通の仕様として理解できます。最大の意義は、複数の人が共同で開発する場合に、それぞれの開発に共通のメソッド名を指定することです。
抽象クラスの抽象メソッドと同じ:
1. メソッドの特定の実装をインターフェイスで定義することはできません。これは具象クラスによって実装されます (抽象クラスの非抽象メソッドを定義する必要はありません。具象クラスに実装する必要があるのは抽象メソッドとインターフェイスのみです)。
2. 抽象クラスと同様に、定数はインターフェイスで定義し、具象クラスに直接継承できます。
3. 具象クラスは、抽象クラスのすべての抽象メソッドを実装する必要があります (非抽象メソッドを除く)。
インターフェイス実装プロセス: 1. インターフェイスを定義します。 2. ..implement X、Y、... を使用して特定のクラスに接続します。
public $age=15;
public $name='Join';
function getage() {
echo " 学年は $this->age";
}
function getname() {
echo "名前は $this->name";
}
function getN(){
echo '
$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 でクラスをインスタンス化する場合、クラスの前に名前空間と二重コロンを追加します。
include 'a.inc.php';
include 'b.inc.php'; a =新しいスペースA::CNAME();
$b=新しいスペースB::CNAME();
こうすれば争いは起こらない。
「PHP バイブル」P142 を参照してください。
6. リフレクション API を使用します。
簡単な例: class a{ …. }
$c = new ReflectionClass(‘a’); echo '
'.$c.'';