ホームページ  >  記事  >  バックエンド開発  >  PHP5_PHP チュートリアルでポリモーフィズムを実装する 2 つの方法の例を共有する

PHP5_PHP チュートリアルでポリモーフィズムを実装する 2 つの方法の例を共有する

WBOY
WBOYオリジナル
2016-07-13 10:32:01880ブラウズ

PHP5 では、変数の型は定義されていません。変数は、任意の型の値、文字列、オブジェクト、リソースなどを指すことができます。 PHP5 のポリモーフィズムは変数であるとは言えません。

PHP5ではメソッドパラメータの型ヒント位置にポリモーフィズムが適用されているとしか言えません。
クラスのサブクラス オブジェクトは、現在の型を型ヒントとして使用して型要件を満たすことができます。
このインターフェースを実装するすべてのクラスは、インターフェースの型を型ヒントとして使用して、メソッドのパラメーター要件を満たすことができます。
簡単に言うと、クラスはその親クラスと実装されたインターフェイスの ID を持ちます。

インターフェースを実装してポリモーフィズムを実現する

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

interface User{ // ユーザーインターフェース
public function getName();
public function setName( $_name) ;
}

class NormalUserimplements User { // インターフェースを実装するクラス
private $name;
public function getName(){
return $this->name;
}
public function setName($ _name){
$this->name = $_name;
}
}

class UserAdmin{ //Operation.
public static function ChangeUserName(User $_user,$_userName){
$_user->setName($ _userName);
}
}

$normalUser = new NormalUser();
UserAdmin::ChangeUserName($normalUser,"Tom");//ここに渡されるのは NormalUser のインスタンスです
echo $normalUser-> ;getName();
?>

インターフェイスと構成を使用して多重継承をシミュレートします

合成を通じて多重継承をシミュレートします。

PHP では多重継承はサポートされていません。コードを再利用するために複数のクラスのメソッドを使用する場合、何か方法はありますか?

その組み合わせです。あるクラスで、別のクラスをプロパティとして設定します。

次の例は、多重継承をシミュレートします。

インターフェースインスタンス

概念的な例を書きます。 私たちはオンライン販売システムを設計していますが、ユーザー部分は次のように設計されています。ユーザーはNormalUser、VipUser、InnerUserの3種類に分類されます。ユーザーが購入した製品の価格は、ユーザーのさまざまな割引に基づいて計算する必要があります。また、将来の拡張やメンテナンスのためにスペースを確保しておく必要があります。

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

インターフェース User
{
public function getName();
public function setName($_name);
public function getDiscount();
}
抽象クラス AbstractUser 実装 User
{
private $name = " ";
protected $discount = 0;
protected $grade = "";
function __construct($_name) {
$this->setName($_name);
}
function getName() {
return $this->name;
}
function setName($_name) {
$this->name = $_name;
function getDiscount() {
$this を返す->discount;
}
function getGrade() {
return $this->grade;
}
}
class NormalUser extends AbstractUser
{
protected $discount = 1.0;
protected $grade = "Normal" ;
}
class VipUser extends AbstractUser
{
protected $discount = 0.8;
protected $grade = "VipUser";
}
class InnerUser extends AbstractUser
{
protected $discount = 0.7;
protected $grade = "InnerUser" ;
}
Interface製品{
関数getProductName(); productPrice;
protected $Author;
function __construct($_bookName) {
$this->productName = $_bookName;
}
function getProductName() {
return $this->productName;
}
関数 getProductPrice() {
$this->productPrice = 100;
return $this->productPrice;
}
public function getAuthor() {
$this->Author = "chenfei";
return $this->Author ;
}
}
class Productsettle
{
public static functionfinalPrice(User $_user, Product $_product, $number) {
$price = $_user->getDiscount() * $_product->getProductPrice() * $ number;
return $price;
}
}
$number = 10;
$book = new BookOnline("设计モード");
$user = new NormalUser("tom");
$price = Productssettle::finalPrice ($user, $book, $number);
$str = "您好,尊敬的" . $user->getName() 。 "
";
$str .= "您的级别是" . $user->getGrade() 。 "
";
$str .= "您的折扣是" . $user->getDiscount() 。 "
";
$str .= "您的价格是" . $price;
エコー $str;
?>






http://www.bkjia.com/PHPjc/756991.html

www.bkjia.com

tru​​e

http://www.bkjia.com/PHPjc/756991.html
技術記事

PHP5 では、量の種類は定義されておらず、量は数値、文字列、オブジェクト、ソースなどの任意の種類を指すことができます。PHP5 では量が多数あります。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。