簡體   English   中英

PHP類擴展了一個公共變量

[英]PHP class extends a public variable

我有兩節課

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();

從我看到 - 在設置標志的情況下,有東西設置它 - 沒有默認值。 問題不在於validate的擴展,您只是在將公共屬性設置為在InsertINDB訪問它之前不將其設置為任何值。 例如,在第一種情況下調用ValidateTypeOfMedia ,在第二種情況下,不調用。

編輯:OR $SOEma == ""在第二種情況下計算結果為true,而ValidateTypeOfMedia不將標志設置為1。

BTW imho你的代碼看起來不正確,不是最佳實踐,無論你想要實現什么(絕不試圖侮辱你)。

EDIT2:

那些結果是什么,我打賭在兩種情況下都沒有設置標志:

$object_validate= new validate;

$object_DB= new InsertINDB;

$object_validate->whatever();

$object_DB->test();

EDIT3:

Khanquered Pro,根據你的評論 - 你可能不理解多態的目的。 所以要解釋一下 - 在擴展第一個類之后,你創建了一個子實例(在你的例子中是InsertINDB)。 然后該實例包含validate的所有方法(函數)和屬性。 你不能先在一個實例中調用validate,然后期望它的屬性在子類中可用 - 在這種情況下,每個實例都是完全分離的,它們有自己的屬性值(state)。 因此,在擴展validate您只能與子項一起使用 - 使用它來驗證,使用它來插入db。 並且只在需要驗證數據而不插入任何內容的應用程序中使用partent validate

我不會評論整個架構是否是好主意 - 它超出了問題的范圍,可能是您當前的知識,但是在您成功完成任務之后,請閱讀有關OOP主題的更多內容。

這里的問題是對擴展類如何工作的誤解,以及類和對象之間的區別。

當你執行$var = new ClassName你可以根據類實例化一個對象。 此對象不再直接連接到類,並且從同一個類更改另一個實例中的值不會影響其他實例。

相同的主體適用於擴展其他類的類 - 一旦實例化,一個對象與每個其他對象分開,無論它們是來自同一個類還是來自它的父/子。

我們舉一個簡單的例子:

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章節

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM