2010-11-22 37 views
1

正如描述所述,我有一個函數,它接受一個數組和一個對象作爲參數,並根據對象的類型將所有對象字段賦值給它們各自的值。這些對象都有不同的字段,但它們都有一個type屬性,函數用它來確定分配哪些字段。將PHP類字段分配給數組值時將兩個字段傳遞給函數不會設置字段,爲什麼?

它的工作原理是這樣的:

function unload($arr,&$obj){ <-- //&$obj not $obj 
    if($obj->type == 'A'){ 
    echo 'Setting field for A'; 
    $obj->a = $arr['a_value']; 
    //some more assignments.. 
    } 
    elseif($obj->type == 'B'){ 
    $obj->b = $arr['b_value']; 
    echo 'Setting field for B'; 
    //some more assignments... 
    } 
    //some more elseifs 
    //return an error if 
    //object's type doesn't 
    //match 
    else{ 
    echo 'Error: Object type '.$obj->type.' not recognized.'; 
    } 

} 

$arr['a_value'] = 'SomeValue'; 
$arr['b_value'] = 'SomeOtherValue'; 
$obj = new A(); //A's type set to 'A' upon initialization 
unload($arr,$obj); 
echo 'A->a set to: '.$obj->a; 

輸出: A->一組到:

的代碼輸入正確的分支爲傳入的對象,但沒有對象的字段得到分配。我究竟做錯了什麼?

服務器運行PHP 4.4.7,我仍然不知道是什麼原因造成的。

編輯:我終於找到它了,它的兩件事情的組合:

從類中引用類的字段名時,我沒有意識到的是所需要的$this關鍵字。我假設變量具有全局範圍,所以$this是可選的,就像它在Java中一樣。這就是爲什麼只更改函數聲明並不能解決問題。現在一切正常!

+0

他們在對象中是「私人」嗎? – alex 2010-11-22 00:42:26

+0

看不到任何明顯的錯誤..你能創建一個簡單的測試用例並將其包含在你的問題中嗎?請注意,而不是有一個 - >類型的函數,你可以使用'instanceof'(例如'if($ obj instanceof SomeClass){...' – Hamish 2010-11-22 00:43:25

+0

@Hamish是的工作,但'type'屬性*可能*是與什麼類別無關 – alex 2010-11-22 00:45:46

回答

2

你在哪個PHP版本上?

因爲在PHP4,你需要通過參考明確地傳遞對象:

function unload($arr,&$obj){ 

如果否則你就是在PHP5,仔細檢查你的$arr內容。如果你想要得到的類名我建議你使用get_class()這將返回類名稱做一些print_r內和之外的功能...

+0

沒有工作。我正在迴應數組以確保值正在存儲,並且它們(這只是一個測試頁,因此我正在手動設置所有內容)。 – primehunter326 2010-11-22 03:49:37

+0

剛剛嘗試在函數內用print_r打印數組,所有內容都正確傳入。無論什麼都得不到正確的分配。 – primehunter326 2010-11-22 17:00:21

0
  • 無論如何,你爲什麼用A->a而不是$obj->a?這似乎是錯誤的。請注意0​​最適合您的需求。

編輯終於得到它:你有

$arr['a_value'] = 'SomeValue'; 
$arr['b_value'] = 'SomeOtherValue'; 

或以其他方式來替代

$arr['a'] = 'SomeValue'; 
$arr['b'] = 'SomeOtherValue'; 

設置$obj->b = $arr['a_value'];$obj->b = $arr['a'];和做相同的b值。 這意味着數組鍵必須是相同的。

+0

我修正了錯字,並在上面的打印語句中添加了(在我的代碼中已經有了這些)。設置error_reporting不會改變任何內容。我知道我可以做到這一點,我只是習慣於C/Java,你只能在原語上做case-switch – primehunter326 2010-11-22 19:44:21

+0

設置錯誤報告將會改變!如果變量$ obj-> a未正確設置,它將打印Notice錯誤。現在的輸出是什麼? – Shoe 2010-11-22 20:08:01

+0

編輯和測試,它的工作原理。 – Shoe 2010-11-22 20:16:31