1

私は2つのクラスを持っています

class validate {
    public $mediaFlag;

    function ValidateTypeOfMedia($SOEmag,$SOEtab,$Soct,$DAL,$insertMeda,$other){    
        if($SOEmag==""){
            return "Must select Media Type";
        }
        else{
            $this->mediaFlag=1;
        }
    }

    function whatever()
    {
        if( $this->mediaFlag==1)
        {
            echo "flag is here";
        }
        else {
            echo "flag didn't work";
        }
    }
}/// Class validate Ends


class InsertINDB extends validate 
{

    function test(){
        if( $this->mediaFlag==1)
        {
            echo "flag is here";
        }
        else {
            echo "flag didn't work";
        }
    }
}

私が抱えている問題は、クラス insertINDB にあります。機能テストは、mediaFlag 変数が設定されていることを認識しません...ただし、親クラスで認識されるものは何でも機能します。私の質問は、クラス InsertINDB の関数テストが親クラスでフラグが設定されていることを認識していないのはなぜですか。

$object_validate= new validate;

$object_DB= new InsertINDB;

$object_validate->whatever();
$object_DB->test();
4

2 に答える 2

2

ここでの問題は、クラスの拡張がどのように機能するかについての誤解と、クラスとオブジェクトの違いです。

その場合$var = new ClassName、クラスに基づいてオブジェクトをインスタンス化します。このオブジェクトはクラスに直接接続されなくなり、同じクラスの別のインスタンスの値を変更しても、他のインスタンスには影響しません。

他のクラスを拡張するクラスにも同じ原理が適用されます。一度インスタンス化されると、オブジェクトは、同じクラスまたはその親/子の 1 つからのものであるかどうかに関係なく、他のすべてのオブジェクトから分離されます。

簡単な例を見てみましょう:

class Bob {

  public $property = 1;

}

class Dave extends Bob {
}

$bob = new Bob;
$dave = new Dave;

echo $bob->property; // 1
echo $dave->property; // 1

$bob->property = 2;

echo $bob->property; // 2
echo $dave->property; // 1

予想される動作は、静的メンバー (クラスメンバーとも呼ばれます) を使用して取得できます。

マニュアルに戻って、 OOP の章全体を読み直す価値があると思います。

于 2012-07-18T12:52:38.350 に答える
2

私が見たところ-フラグが設定されている場合、何かが設定されています-デフォルト値はありません。問題は の拡張にはありvalidateません。パブリック プロパティにアクセスする前に値を設定しないだけですInsertINDB。たとえば、最初のケースValidateTypeOfMediaでは呼び出されますが、2 番目のケースでは呼び出されません。

編集: $SOEma == ""2 番目のケースの OR は true と評価さValidateTypeOfMediaれ、フラグは 1 に設定されません。

ところで、あなたのコードは、あなたが達成しようとしているものは何でも、ベストプラクティスではなく、正しく見えません(決してあなたを侮辱しようとしているわけではありません)。

編集2:

それらの結果は何ですか、どちらの場合もフラグが設定されていないに違いありません:

$object_validate= new validate;

$object_DB= new InsertINDB;

$object_validate->whatever();

$object_DB->test();

編集3:

Khanquered Pro、あなたのコメントに基づいて - ポリモーフィズムの目的を理解していない可能性があります。説明するために-最初のクラスを拡張した後、子のインスタンスを作成します(あなたの場合はInsertINDB)。次に、そのインスタンスは、validate のすべてのメソッド (関数) とプロパティを保持します。最初に1つのインスタンスでvalidateを呼び出してから、そのプロパティが子クラスで利用可能であることを期待することはできません.この場合、すべてのインスタンスは完全に分離されたものであり、独自のプロパティ値(状態)を持っています. したがって、拡張後validateは子のみを操作します-それを使用して検証し、それを使用してdbに挿入します。validateまた、アプリケーションで何も挿入せずにデータを検証する必要がある場合にのみ、partent を使用します。

このアーキテクチャ全体が良いアイデアであるかどうかについてはコメントしません-質問の範囲を超えており、おそらくあなたの現在の知識ではありませんが、タスクに成功した後は、OOP のトピックを最初に読んでください。

于 2012-07-18T12:43:54.673 に答える