1

今日、私はデザインパターンを読んでいて、インターフェイス、そのインターフェイスを実装する2つのクラス、およびメインインデックスクラスで構成されるサンプルプログラムを作成しようとしました。以下のコードを見てみましょう。まずインターフェースIproduct

<?php 
interface Iproduct 
{
    //Define the abstract method
    public function apple();
    public function mango();    
}

インターフェイスを実装する 2 つのクラス

<?php 

// Including the interface
include_once 'Iproduct.php';

    class Apple implements Iproduct 
    {
        public function apple()
        {
            echo ("We sell apples!");
        }   
        public function mango()
        {
            echo ("We do not sell Mango!");
        }
    }
<?php

// Include the interface Iprodduct
include_once 'Iproduct.php';

class Mango implements Iproduct
{
    public function apple()
    {
        echo ("We do not sell Apple");
    } 
    public function mango()
    {
        echo ("We sell mango!");    
    }
}

今メインクラス

<?php
include_once ('apple.php');
include_once ('Mango.php');

class UserProduct
{
    public function __construct()
    {
        $apple_class_obj=new Apple();
        $mango_class_obj=new Mango();
        //echo("<br/> the apple class object: ".$apple_class_obj);
    }   
}

//creating the object of the UserProduct
echo ("creating the object!<br/>");
$userproduct_obj=new UserProduct();
?>

コードを実行したときに得られる出力は次のとおりです。

creating the object!
we sell apples!we sell mango

問題は、2 番目の出力がどのようになっているのかを取得できないことです。つまり、リンゴを販売しています。マンゴーも売ってます!が表示されています。理由を教えてください

4

2 に答える 2

4

これまで (PHP バージョン 5 より前) では、オブジェクトの作成時にクラスと同じ名前のメソッドが呼び出されていました (PHP の古いスタイルのコンストラクター メソッド)。

PHP はその動作と下位互換性があるため、出力が表示されます。

__construct()下位互換性のために、PHP 5 が特定のクラスの関数を見つけることができず、そのクラスが親クラスから関数を継承していない場合、古いスタイルのコンストラクター関数をクラスの名前で検索します。事実上、互換性の問題が発生する唯一のケースは__construct()、異なるセマンティクスに使用されるという名前のメソッドがクラスにある場合のみであることを意味します。[大胆に]

From: PHPマニュアルのコンストラクタとデストラクタ

したがって、あなたが経験することは、インターフェイスやオブジェクト自体の問題ではなく、おそらく気付いていない副作用にすぎません (これは本当に古いことです)。

これを回避するには__construct()、両方のクラスにメソッドを実装して、古いスタイルのコンストラクターが呼び出されないようにします。

class Mango implements Iproduct
{
    public function __construct() {}

    ...

それを止めるには、クラスごとに空のメソッドで十分です。


あなたも興味があるかもしれません:

于 2013-08-08T13:34:35.613 に答える
0

PHP 4x では、クラスと同じ名前のメソッドがコンストラクターと見なされていました。PHP 5x では、コンストラクターは明示的に名前が付けられて__constructいます。

PHP の下位互換性による結果を経験しています。

于 2013-08-08T13:37:09.687 に答える