[英]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.