ホームページ  >  記事  >  バックエンド開発  >  PHP オブジェクト指向の抽象メソッドと抽象クラス __call オブジェクトの複製に関する詳細なチュートリアル_PHP チュートリアル

PHP オブジェクト指向の抽象メソッドと抽象クラス __call オブジェクトの複製に関する詳細なチュートリアル_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 17:13:11986ブラウズ

この記事では、PHP でのオブジェクト指向の抽象メソッドと抽象クラス __call clone オブジェクトの使用法を紹介します。その方法を知りたい人は、それを学ぶことができます。

抽象メソッドと抽象クラス


OOP 言語では、クラスは 1 つ以上のサブクラスを持つことができ、各クラスには外部コードがアクセスするためのインターフェイスとして少なくとも 1 つのパブリック メソッドがあります。抽象メソッドは継承を容易にするために導入されています。その使用法を説明する前に、まず抽象クラスと抽象メソッドの定義を見てみましょう。

抽象メソッドとは何ですか?メソッド本体を持たずにクラス内で定義するメソッドは、いわゆるメソッド本体が存在しないことを意味し、メソッドの宣言時に中括弧やその中の内容が存在せず、代わりに括弧が直後に追加されます。宣言するときはメソッド名。数値の末尾に、抽象メソッドを宣言するときはキーワード「abstract」を追加します。例:

コードは次のとおりです コードをコピー

抽象関数 fun1();
抽象関数 fun2();

上記の例は、「abstract」によってメソッド本体が変更されていない抽象メソッド「fun1()」と「fun2()」です。抽象メソッドの後にセミコロンがあることを忘れないでください。クラス内のメソッドが抽象メソッドである限り、そのクラスは抽象クラスとして定義する必要があり、また、抽象クラス内にメソッドとメンバーを含めることができ、その抽象クラスも「abstract」キーワードで変更する必要があります。メソッドが抽象メソッドの場合、クラスは抽象クラスとして宣言され、「abstract」で装飾される必要があります。例:

コードは次のとおりです コードをコピー

抽象クラスのデモ
{
var $test;

抽象関数 fun1();
抽象関数 fun2();
関数 fun3()
{
... ...
}
}

上記の例では、抽象クラス「Demo」が定義され、「abstract」で変更されています。このクラスでは、メンバー属性「$test」、2 つの抽象メソッド「fun1」および「fun2」、および非 Abstract が定義されています。メソッド fun3(); では、抽象クラスをどのように使用するのでしょうか?最も重要な点は、抽象クラスはインスタンス オブジェクトを生成できないため、直接使用できないことです。クラスを介してインスタンス化されたオブジェクトを使用しているため、抽象クラスはインスタンス オブジェクトを生成できません。抽象クラスを宣言するのはどうですか?抽象メソッドをサブクラスのオーバーロードのテンプレートとして使用します。この仕様は、サブクラスが抽象クラスを継承した後、サブクラスのニーズに応じて実装されることを要求します。サブクラスは親クラスのすべての抽象メソッドを実装する必要があります。そうでない場合、サブクラスにまだ抽象メソッドが存在する場合、サブクラスは依然として抽象クラスであり、抽象クラスから継承する必要があるのはなぜでしょうか。いくつかの関数を実装したい場合は、抽象クラスから継承する必要がある場合があります。そうしないと、抽象クラスを継承する場合、そのクラスに抽象メソッドを実装する必要があります。

コードは次のとおりですコードをコピー

//抽象クラスはインスタンス オブジェクトを生成できるため、インスタンス化されたオブジェクトがサブクラスに渡されるのは間違いです

抽象クラスのデモ

{
var $test;

抽象関数 fun1();

抽象関数 fun2();
関数 fun3()
{
... ...
}
}

コードは次のとおりです コードをコピー

$demo=新しいデモ();

クラステストはデモを拡張します
{
関数 fun1()
{
... ...
}

関数 fun2()
{
... ...
}
}

//親クラスのすべての抽象メソッドが実装されているため、サブクラスはオブジェクトをインスタンス化できます

コードは次のとおりです コードをコピー
$test=新しいテスト();

__call は呼び出しエラーを処理します


プログラム開発において、オブジェクトを使用してオブジェクトの内部メソッドを呼び出すときに、呼び出されたメソッドが存在しない場合、プログラムはエラーとなり、プログラムは終了して実行を続行できません。したがって、プログラムがオブジェクト内に存在しないメソッドを呼び出す場合、呼び出されたメソッドと使用されたパラメータが存在しないことを示すプロンプトが表示されますが、この時点ではプログラムは実行を続行することができます。存在しないメソッドを呼び出すと自動的に呼び出されます。

コードは次のとおりです コードをコピー

//これはテストクラスであり、属性やメソッドはありません
クラステスト
{
}

//Testクラスのオブジェクトを生成する
$test=新しいテスト();

//オブジェクトに存在しないメソッドを呼び出す
$test->demo("1", "two", "three");

//プログラムはここでは実行されません
echo "これはテストです";

上記の例では次のエラーが発生し、プログラムは実行を続行できません。 致命的なエラー: 未定義メソッド Test::demo() の呼び出し

次に、「__call()」メソッドを追加します。このメソッドには 2 つのパラメーターがあります。最初のパラメーターは、__call() メソッドが自動的に呼び出されるときに、それを最初のパラメーターに渡します。 2 番目のパラメータは、このメソッドの複数のパラメータを配列の形式で渡します。

コードは次のとおりですコードをコピー

上記の例の出力結果は次のとおりです:
呼び出した関数: デモ (パラメーター: Array ( [0] => one [1] => two [2] => three ) ) は存在しません。これはテストです


オブジェクトのクローン


プロジェクト内で 2 つ以上の同一のオブジェクトを使用する必要がある場合があります。「new」キーワードを使用してオブジェクトを再作成し、同じ属性を割り当てると、より面倒でエラーが発生しやすくなります。そのため、完全にクローンを作成することが非常に必要になります。オブジェクトから同一のオブジェクトを複製し、クローン作成後、2 つのオブジェクトは相互に干渉しません。

PHP5 では、オブジェクトのクローンを作成するために「clone」キーワードを使用します。

//これはテストクラスであり、属性やメソッドはありません

クラステスト
{
//存在しないメソッドを呼び出すときに自動的に呼び出されるメソッド。最初のパラメータはメソッド名、2番目のパラメータは配列パラメータです
関数 __call($関数名, $args)
{
print "呼び出した関数: $function_name (パラメーター: ";
print_r($args);
印刷 ") は存在しません! N"; }
}

//Testクラスのオブジェクトを生成する

$test=新しいテスト();


//オブジェクトに存在しないメソッドを呼び出す

$test->demo("1", "two", "three");


//プログラムは終了せず、ここで実行できます

echo "これはテストです";


コードは次のとおりですコードをコピー

PHP5 では、オブジェクトのクローン作成時に自動的に呼び出される特別なメソッド名「__clone()」が定義されています。必要に応じて、「__clone()」メソッドを使用すると、元のオブジェクトと同じ属性とメソッドを持つオブジェクトが作成されます。クローン作成後に元のオブジェクトの内容を変更するには、__clone() の元の属性とメソッドを書き直す必要があります。「__clone()」メソッドには、$this と $that という 2 つのポインターが自動的に含まれます。 $this はコピーを指し、 $that はオリジナルを指します。

クラスの人

{
//人のメンバー属性は以下の通りです
var $name //その人の名前
var $sex //人の性別
var $age //その人の年齢

//属性名 $name、性別 $sex、年齢 $age に値を割り当てるコンストラクター パラメーターを定義します

関数 __construct($name="", $sex="", $age="")
{
$this->name=$name;
$this->sex=$sex;
$this->age=$age;
}

//この人は自分の属性を伝える方法で話すことができます

関数say()
{
echo "私の名前は: ".$this->name." 性別: ".$this->性別" 私の年齢: ".$this->age."";
}
}

$p1=新しい人("張三"、"男性"、20歳);

//「clone」を使用して、p1 オブジェクトと同じプロパティとメソッドを持つ新しいオブジェクト p2 を複製します。
$p2=クローン $p1;

$p2->say();

コードは次のとおりです コードをコピー

クラスの人
{
//人のメンバー属性は以下の通りです
var $name //その人の名前
var $sex //人の性別
var $age //その人の年齢

//属性名 $name、性別 $sex、年齢 $age に値を割り当てるコンストラクター パラメーターを定義します
関数 __construct($name="", $sex="", $age="")
{
$this->name=$name;
$this->sex=$sex;
$this->age=$age;
}

//この人は自分の属性を伝える方法で話すことができます
関数say()
{
echo "私の名前は: ".$this->name." 性別: ".$this->性別" 私の年齢: ".$this->age."";
}

//オブジェクトのクローン作成時に自動的に呼び出されるメソッド。クローン作成後に元のオブジェクトの内容を変更したい場合は、__clone()で元の属性とメソッドを書き換える必要があります
関数 __clone()
{
//$this はコピー p2 を指し、$that は元の p1 を指すため、このメソッドではコピーの属性が変更されます。
$this->name="私は偽の $that->name";
$this->age=30;
}
}

$p1=新しい人("張三"、"男性"、20歳);

$p2=$p1 のクローン;
$p1->say();
$p2->say();

上記の例の出力:

私の名前:Zhang San 性別:男性 私の年齢:20歳
私の名前は:偽の張三です 性別:男性 年齢:30歳

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/629205.html技術記事この記事では、PHP でのオブジェクト指向の抽象メソッドと抽象クラス __call clone オブジェクトの使用方法を紹介します。その方法を知りたい人は、それを学ぶことができます。 抽象メソッドと抽象クラス OOP 言語では...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。